자바 vs. 코틀린 코틀린은 자바와 달리 3항 연산자(조건 ? 참일 때_식 : 거짓일 때_식)가 없다. 하지만 if를 식으로 쓸 수 있다는 점이 이 단점을 대부분 상쇄해준다.
if 식에서 return을 사용하면 편리한 경우가 있다. return 문은 존재하지 않는 값을 뜻하는 Nothing이라는 특별한 타입의 값으로 간주된다. 기본적으로 어떤 식이 Nothing 타입이라는 말은 프로그램의 순차적 제어 흐름이 그 부분에서 끝나되 어떤 잘 정의된 값에 도달하지 못한다는 뜻이다. return의 경우는 이 문장을 둘러싼 함수가 끝난다는 뜻이다. Nothing 타입은 모든 코틀린 타입의 하위 타입으로 간주되기 때문에 식이 필요한 위치에 return을 사용해도 타입 오류가 발생하지 않는다. 어떤 전체 이름을 문자열로 받아서 간단한 이름 부분만 다른 이름으로 바꾸면 어떻게 되는지 알아보고 싶다고 하자. 이를 구현하면 다음과 같다.
fun renamePackage(fullName: String, newName: String): String { val i = fullName.lastIndexOf('.') // 마지막 . 위치를 찾음 val prefix = if (i>= 0) fullName.substring(0, i + 1) else return newName return prefix + newName } fun main() { println(renamePackage("foo.bar.old", "new")) // foo.bar.new }
return e의 e 값은 return 식의 값이 아니라 함수의 반환값이라는 점에 유의하자. return 식 자체는 아무 값이 없고 Nothing 타입에 속한다. 그리고 Unit과 Nothing의 차이를 구분해야 한다. Nothing과 달리 Unit 타입에는 한 가지 인스턴스가 존재하는데, 이 인스턴스는 보통 유용한 값이 없다는 사실을 표현한다. 반면 Nothing은 아예 값이 없다는 사실을 표현한다.