-
아이템4 - inferred 타입으로 리턴하지 말라Kotlin/Effective Kotlin 요약 2023. 1. 3. 00:01728x90
타입 추론
코틀린의 타입 추론은 널리 알려진 코틀린의 특징입니다.
자바 10에서도 타입 추론을 도입하였습니다.
타입 추론을 사용하는 경우 절대로 슈퍼클래스 또는 인터페이스로는 설정되지 않습니다
물론 타입을 명시적으로 지정하여 이런 문제를 해결할 수 있습니다.
하지만 직접 라이브러리를 조작할 수 없는 경우에는 이런 문제를 간단하게 해결할 수 없습니다.
인터페이스에서의 위험성
CarFactory 인터페이스
interface CarFactory{ fun produce(): Car }
대부분의 공장에서 Fiat126이라는 자동차를 생상하여, 이를 디폴트로 두었습니다.
val DEFAULT_CAR: CAR = Fiat126P()
코드를 작성하다 보니 DEFAULT_CAR는 CAR로 명시적으로 지정되어 있어서 함수의 리턴 타입을 제거했습니다.
interface CarFactory{ fun produce() = DEFAULT_CAR }
이후에 다른 사람이 코드를 보다가 DEFAULT_CAR는 타입 추론에 의해 자동으로 타입이 지정될 것으로 생각했습니다.
이제 Car를 명시적으로 선언하지 않아도 된다고 판단하여 코드를 변경했습니다.
val DEFAULT_CAR = Fiat126P()
이제는 Fiat126P 이외의 자동차를 생산하지 못하게 되는 문제가 발생했습니다.
인터페이스를 직접 만들었다면 문제를 찾기 쉬울 수 있지만 외부 API라면 문제를 쉽게 해결하기 힘듭니다.
정리
타입을 확실하게 지정해야 하는 경우에는 명시적으로 타입을 지정해야 한다는 원칙을 가지고 있으면 됩니다.
외부 API를 만들 때는 반드시 타입을 지정하고, 특별할 이유와 확실한 확인 없이는 제거하지 말아야 합니다.
inferred 타입은 프로젝트가 진전될 때, 제한이 너무 많아지거나 예측하지 못한 결과를 낼 수 있습니다.
'Kotlin > Effective Kotlin 요약' 카테고리의 다른 글
6장 - 사용자 정의 오류보다는 표준 오류를 사용하라 (0) 2023.01.21 아이템5 - 예외를 활용해 코드에 제한을 걸어라 (0) 2023.01.04 아이템3 - 최대한 플랫폼 타입을 사용하지 말라 (0) 2022.12.31 아이템2 - 변수의 스코프를 최소화하라 (0) 2022.12.29 아이템1 - 가변성을 제한하라 (0) 2022.12.26