Skils/Kotlin

[Kotlin] 함수란?

재한 2022. 8. 7. 19:19

🔎함수

: 입력(파라미터)을 받아서 자신을 호출한 코드 쪽에 출력 값을 반환할 수 있는 재사용 가능한 코드 블록이다.

 

아래 사진은 원의 넓이를 구하는 함수이다.

위 사진을 세세하게 뜯어본다면

  • fun은 함수라는 뜻이고 뒤에 정의가 뒤따라온다.
  • circleArea는 함수의 이름이다. 
  • 괄호로 둘러싸여 있는 (radius : Double)은 파라미터 목록이고, 파라미터의 타입을 명시해주면서, 함수를 호출할 때 넘길 수 있는 데이터를 컴파일러에게 알려준다.
  • Double은 반환타입이다.
  • 함수 본문은 {}로 둘러싸여 있는 블록이며 함수의 구현을 기술한다.

🛑함수가 파라미터를 받지 않는다고 해도 파라미터를 감싸는 괄호는 있어야 한다.

 

코틀린 함수의 파라미터는 무조건 불변이다. 즉 함수 내부에서 변경하지 못한다.

따라서 밑에 사진처럼 함수 본문에서 파라미터의 값을 변경하면 오류가 발생한다.

 

⚡코틀린은 call - by -value를 사용한다.

call-by-value란?

파라미터 값에 호출하는 쪽의 인자를 복사한다는 뜻이다.

호출 인자로 전달한 변수를 변경해도 호출된 함수 내부의 파라미터 값에는 영향이 없다는 뜻이다.

하지만 파라미터가 참조라면 호출한 쪽의 데이터는 그대로 남아 있고 이 데이터에 대한 참조만 복사된다. 따라서 파라미터 자체는 함수 내부에서 바뀔 수 없지만, 일반적으로 파라미터가 가리키는 데이터는 바뀔 수 있다.

위의 코드는 정수 배열을 가리키는 참조를 받아서 첫 번째 원소를 변경하는 함수이다. 

과연 데이터가 영향을 받을까?

->영향을 받는 것을 알 수 있다.

 

타입 지정을 생략해도 되는 변수와는 달리 파라미터에는 항상 타입을 지정해야 한다. 컴파일러는 함수 정의에서 파라미터 타입을 추론하지 못한다.

반환 타입은 함수 파라미터에서 추론이 가능하지만 명시해주는 것이 코드를 읽는 사람들에게 편리한 깔끔한 코드이다.

 

하지만 반환 타입을 명시해주지 않아도 되는 경우가 2가지 있다.

 

첫 번째로는 다른 언어에서 사용하는 void타입일 때이다. [코틀린에서는 unit이라고 정의함]

즉 함수가 의미 있는 반환 값을 돌려주지 않을 때 우리는 반환 타입을 생략해도 된다.

fun prompt(name : String): Unit{
	println("************ Hello, $name! ************")
}

두 번째로는 식이 본문인 함수이다. 

함수가 단일식으로만 구현될 수 있다면 return 키워드와 블록을 만드는 중괄호를 생략하고 작성해도 된다.

[반환 타입과 함수 본문 식 사이에는 =가 들어가 있어야 한다.]

fun circleArea(radius: Double) = PI *radius *radius

 

🔎위치 기반 인자와 이름 붙은 인자

 

⚡위치기반 인자

기본적으로 함수 호출 인자는 순서대로 파라미터에 전달된다. [첫 번째 인자는 첫번째파라미터, 두 번째 인자는 두번째 파라미터] 

이러한 방식을 코틀린에서는 위치 기반 인자라고 한다.

위 코드에서 처럼 첫번째 인자는 width를, 두번째 인자는 height를 나타낸다.

코틀린은 다른 언어와 달리 이름 붙은 인자라고 불리는 방식도 제공한다.

 

⚡이름 붙은 인자

위치가 아니라 파라미터의 이름을 명시함으로써 인자를 전달하는 방식이다.

실제로 인자의 순서는 중요하지 않다.

한 호출 안에서 위치 기반 인자와 이름 붙은 인자를 함께 사용할 수 도 있다.