코틀린 스터디/이펙티브 코틀린

아이템4) inferred 타입으로 리턴하지 말라

막이86 2024. 2. 8. 10:31
728x90

이펙티브 코루틴을 요약한 내용입니다.

  • 코틀린의 타입 추론은 JVM 세계에서 가장 널리 알려진 특징
    • Java 10부터 타입 추론이 도입되었지만 제약 사항이 있음
  • 타입 추론을 사용할 때 몇가지 위험한 부분이 있음
  • inferred 타입은 정화하게 오른쪽에 있는 피연산자에 맞게 설정
    • 슈퍼클래스 또는 인터페이스로는 설정 되지 않음
    open class Aniaml
    
    class Zebra: Animal()
    
    fun main() {
    	var animal = Zebra()
    	animal = Animal()
    }
    
  • 타입을 명시적으로 지정해서 문제를 해결
open class Aniaml

class Zebra: Animal()

fun main() {
    var animal: Aniaml = Zebra()
    animal = Animal()
}
  • inferred 타입을 노출하면 위험한 일이 발생할 수 있음
// 디폴트로 생성되는 자동차가 있음
interface CarFactory {
	fun produce(): Car
}

val DEFAULT_CAR: Car = Fiat126P()

// DEFAULT_CAR는 Car로 명시적으로 지정되어 있으므로 함수 리턴 타입을 제거
interface CarFactory {
	fun produce() = DEFAULT_CAR
}

// DEFAULT_CAR는 타입 추론에 의해 자동으로 타입이 지정 
val DEFAULT_CAR = Fiat126P()

// CarFactory에서는 Fiat126P 이외의 자동차를 생산하지 못함
  • 외부 API에서 이러한 문제가 있다면 쉽게 해결 할 수 없음
  • 리턴타입은 API를 잘 모르는 사람에게 전달해 줄 수 있는 중요한 정보
    • 명시적으로 지정하는 것이 좋음

정리

  • 타입을 확실하게 지정해야 하는 경우 명시적으로 타입을 지정
  • 중요한 정보이므로 숨기지 않은 것이 좋음
  • 외부 API를 만들 때는 반드시 타입을 지정
  • 특별한 이유와 확실한 확인 없이 제거하지 않아야 함
  • inferred 타입은 프로젝트가 진전될 때 제한이 너무 많아지거나 예측하지 못한 결과를 낼 수 있음
728x90