관리 메뉴

나만을 위한 블로그

[이펙티브 코틀린] 아이템 4. inferred 타입으로 리턴하지 마라 본문

책/Effective Kotlin

[이펙티브 코틀린] 아이템 4. inferred 타입으로 리턴하지 마라

참깨빵위에참깨빵 2022. 5. 15. 01:05
728x90
반응형

타입 추론(type inference) : 코틀린 특징 중 하나. 자바도 자바 10부터 코틀린을 따라 타입 추론을 도입했다.

 

타입 추론을 쓸 때 위험한 부분들이 있다.

 

  • 할당 시 inferred 타입은 오른쪽 피연산자에 맞게 설정된다. 절대 슈퍼클래스 or 인터페이스로는 설정되지 않는다
open class Animal
class Zebra: Animal()

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

 

내가 원하는 타입보다 제한된 타입이 설정됐다면 타입을 명시적으로 지정해서 해결하면 된다.

 

open class Animal
class Zebra: Animal()

fun main() {
    var animal: Animal = Zebra()
    animal = Animal()
}

 

직접 라이브러리를 조작하는 경우 이런 문제를 간단하게 해결할 수 없다.

그리고 이런 경우 inferred 타입을 노출하면 위험한 일이 발생할 수 있다.

 

CarFactory 인터페이스가 있다고 친다.

 

interface CarFactory {
    fun produce(): Car
}

 

그리고 다른 걸 지정하지 않았으면 아래처럼 디폴트로 생성되는 자동차가 있다고 친다.

 

var DEFAULT_CAR: Car = Fiat126P()

 

 

코드를 치다 보니 DEFAULT_CAR는 Car로 명시적으로 지정돼 있어 따로 필요없다고 판단해서 함수의 리턴 타입을 제거했다고 한다.

 

var DEFAULT_CAR = Fiat126P()

 

 

이제 CarFactory에선 Fiat126P 이외의 차를 생산하지 못하는 문제가 발생한다.

인터페이스를 내가 직접 만들었다면 문제를 쉽게 찾아서 수정할 수 있을 것이다. 하지만 외부 API라면 문제를 쉽게 해결할 수 없다.

다른 사용자가 이런 외부 API를 봤다면 문제가 있다고 제작자한테 말할 것이다.

리턴 타입은 API를 잘 모르는 사람에게 전달할 수 있는 중요 정보다. 따라서 리턴 타입은 외부에서 확인할 수 있게 명시적으로 지정하는 게 좋다.

반응형
Comments