더북(TheBook)

위와 같은 구문은 = 기호로 변수를 초기화하는 식을 지정했던 변수 정의와 비슷하다. 변수와 마찬가지로 식이 본문인 함수에서도 반환 타입을 생략할 수 있다.

fun circleArea(radius: Double) = PI*radius*radius // 반환값이 Double로 추론됨

식이 본문인 함수는 명시적인 반환 타입 정의를 쓰지 않아도 될 정도로 간단하다고 간주된다. 하지만 이 기능은 조심스럽게 사용해야 한다. 복잡하게 표현된 식이 본문인 함수는 일반적인 블록 구문을 사용해 가독성을 높여주는 편이 낫다.

블록이 본문인 함수를 정의할 때 {} 앞에 =를 넣으면 이 블록이 익명 함수를 기술하는 람다로 해석되기 때문에 여러분이 원하는 결과를 얻을 수 없다. 예를 들어 다음 함수를 보자.

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

위 정의는 미리 정해진 반지름에 해당하는 원의 넓이를 계산해주는 다른 함수를 반환하는 함수 정의에 해당하며, 올바른 정의다. 반면 비슷한 정의에서 블록 안에 return을 추가하면 컴파일 오류가 발생한다.

fun circleArea(radius: Double) = {
    return PI*radius*radius    // error: 'return' is not allowed here
                               // error: type mismatch: inferred type is () -> [ERROR : Return not allowed] but Double was expected
}

이 오류는 타입 불일치로 인해 발생하며, 식이 본문인 함수 안에서 return 문이 금지되기 때문이다(5장 고급 함수와 함수형 프로그래밍 활용하기 참조).

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