아이템 04. Inferred 타입으로 리턴하지 말라

아이템 04. Inferred 타입으로 리턴하지 말라

inferred 타입으로 리턴하지 말라 #

타입 추론은 코틀린의 대표적인 특징이다. 다만, 타입 추론을 사용할 때 몇 가지 위험한 부분들이 있다.


(assign 구문에서) 타입 추론 시 슈퍼클래스 또는 인터페이스로 설정되지 않는다. #

(assign 구문에서) 타입 추론 시 정확하게 오른쪽에 있는 피연산자에 맞게 설정된다.

슈퍼클래스, 혹은 인터페이스로 설정되지 않는다.

open class Animal

class Zebra: Animal()

fun main() {
    var animal = Zebra()    // animal 타입은 Zebra
    animal = Animal()       // 오류 : Type mismatch
}

타입을 명시하면 아래와 같다.

open class Animal

class Zebra: Animal()

fun main() {
    var animal: Animal = Zebra()    // animal 타입은 Animal
    animal = Animal()               // OK
}

리턴 타입은 꼭 명시한다. (공개된 API에서 리턴 타입을 제거하지 말자.) #

다음의 예시를 살펴보자.

interface CarFactory {
    fun produce(): Car
}

val DEFAULT_CAR: Car = Fiat126P()   // Fiat126P 가 디폴트라고 가정하자.

이후 시간이 지나 다음과 같이 코드를 수정했다.

" DEFAULT_CAR는 Car 로 명시적으로 지정되어 있으므로 따로 필요 없다고 판단해서, 함수의 리턴 타입을 제거했다고 합시다. “

interface CarFactory {
    fun produce() = DEFAULT_CAR
}

또 시간이 지나 다음과 같이 코드를 수정했다.

val DEFAULT_CAR = Fiat126P()

이제 문제가 발생한다. CarFactory.produce()Fiat126P 만 생성할 수 있다.

즉, fun produce() = DEFAULT_CAR 수정 시 리턴 타입이 제거된 것이 가장 큰 문제로 볼 수 있겠다.


요약 #

(public)공개된 API(인터페이스, 외부 API 등)에는 리턴 타입을 명시한다.