반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

안드로이드 개발자 노트

[이펙티브 코틀린] Item4. inferred 타입으로 리턴하지 말라 본문

Kotlin/이펙티브 코틀린

[이펙티브 코틀린] Item4. inferred 타입으로 리턴하지 말라

어리둥절범고래 2023. 8. 27. 15:36
반응형

코틀린의 타입 추론(type inference)은 널리 알려진 코틀린의 특징이며 자바도 자바10부터는 타입 추론을 도입했습니다.

inferred 타입은 정확하게 오른쪽에 있는 피연산자에 맞게 설정되며 슈퍼클래스 또는 인터페이스로는 설정되지 않습니다.

 

open class Animal
class Zebra: Animal()

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

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

 

 

직접 라이브러리 또는 모둘을 조작할 수 없는 경우에는 간단하게 해결할 수 없습니다.

이러한 경우에서 inferred 타입을 노출하면 위험합니다.

 

간단한 예제로, 다음과 같은 CarFactory 인터페이스가 있다고 해보겠습니다.

 

interface CarFactory {
    fun produce(): Car
}

val DEFAULT_CAR: Car = Avante()

 

다른 것을 지정하지 않았을 경우, 디폴트로 생성되는 자동차가 있다고 해보겠습니다.

 

코드를 작성하다 보니 DEFAULT_CAR는 Car로 명시적으로 지정되어 있으므로 따로 필요 없다고 판단하여 함수의 리턴 타입을 제거했다고 하겠습니다.

 

interface CarFactory {
    fun produce() = DEFAULT_CAR
}

 

그런데 이후에 다른 사람이 코드를 보다가, DEFAULT_CAR는 타입 추론에 의해 자동으로 타입이 지정될 것이므로, Car를 명시적으로 지정하지 않아도 된다고 생각해서, 다음과 같이 코드를 변경했다고 해보겠습니다.

 

val DEFAULT_CAR = Avante()

 

이제 문제가 발생합니다. CarFactory는 이제 Avante 이외의 자동차를 생산하지 못합니다.

 

 

리턴 타입은 API를 잘 모르는 사람에게 전달해 줄 수 있는 중요한 정보입니다.

따라서 타입은 외부에서 확인할 수 있게 명시적으로 지정해 주는 것이 좋습니다.

 

 

 


정리

  • 타입을 확실하게 지정해야 하는 경우에는 명시적으로 타입을 지정해야 한다는 원칙만 갖고 있으면 된다. 이는 굉장히 중요한 정보다.
  • 외부 API를 만들 때는 반드시 타입을 지정하고, 이렇게 지정한 타입은 특별한 이유와 확실한 확인 없이는 제거하지 말아야 한다.
  • inferred 타입은 제한이 너무 많아지거나 에측하지 못한 결과를 낼 수 있다.
반응형