kyucumber
전체 글 보기

이펙티브 코틀린 아이템 04. inferred 타입으로 리턴하지 말라

코틀린의 타입 추론(type inference)을 사용할 때 몇가지 위험한 부분들이 존재한다.

inferred 타입을 사용하면 슈퍼클래스나 인터페이스로 설정되지 않으며, 정확하게 오른쪽에 있는 피연산자에 맞게 설정되는 문제가 존재한다.

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 타입을 노출하면 아래와 같이 위험한 일이 발생할 수 있다.

interface CarFactory { fun produce(): Car } val DEFAULT_CAR: Car = Fiat126P()

위 코드를 아래와 같이 Default를 지정해 inferred 타입을 사용하고 리턴 타입을 제거하면 CarFactory 인터페이스에서는 Fiat126P 이외의 자동차를 생산할 수 없게 된다.

interface CarFactory { fun produce() = DEFAULT_CAR }

정리

  • 타입을 확실하게 지정해야 하는 경우 명시적으로 타입을 지정해야 한다는 원칙을 가져야 한다.
  • 안전을 위해 외부 API를 만들때는 반드시 타입을 지정하고 이렇게 지정한 타입을 특별한 이유와 확실한 확인 없이 제거하지 말자

Reference

  • 이펙티브 코틀린 - 프로그래밍 인사이트, 마르친 모스칼라 지음, 윤인성 옮김

개인적인 기록을 위해 작성된 글이라 잘못된 내용이 있을 수 있습니다.

오류가 있다면 댓글을 남겨주세요.

Table of contents