더북(TheBook)

코틀린은 값에 의한 호출(call-by-value) 의미론을 사용한다. 이 말은 파라미터 값에 호출하는 쪽의 인자를 복사한다는 뜻이다. 특히 호출 인자로 전달한 변수를 변경해도( 앞에서 본 원 넓이 예제의 main 함수 안에 있는 radius) 호출된 함수 내부의 파라미터 값에는 영향이 없다는 뜻이다. 하지만 파라미터가 참조( 배열 타입)라면 호출한 쪽의 데이터는 그대로 남아있고 이 데이터에 대한 참조만 복사된다. 따라서 파라미터 자체는 함수 내부에서 바뀔 수 없지만, 일반적으로 파라미터가 가리키는 데이터는 바뀔 수 있다. 예를 들어 다음 함수는 정수 배열을 가리키는 (불변) 참조를 받아서 첫 번째 원소를 변경하며, 그에 따라 호출하는 쪽의 데이터도 영향을 받는다.

fun increment(a: IntArray): Int {
  return ++a[0]
}

fun main() {
  val a = intArrayOf(1, 2, 3)
  println(increment(a)) // 2
  println(a.contentToString()) // [2, 2, 3]
}

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

반면 반환 타입은 함수 파라미터에서 추론이 가능한데도 여전히 명시해야 한다. 함수에서 결괏값을 결정해 외부로 나가는 지점(즉, return으로 값을 반환하는 지점)이 여러 곳일 수 있는데, 함수 본문의 모든 반환 지점을 살펴보고 반환 타입을 알아내기 어려울 수 있기 때문이다. 이런 면에서 함수 정의에 있는 반환 타입은 일종의 문서화 역할을 하며, 함수 정의의 첫 줄만 보고도 함수가 만들어내는 값이 무엇인지 바로 알 수 있게 해준다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.