inferred 타입으로 리턴하지 말라 #
타입 추론은 코틀린의 대표적인 특징이다. 다만, 타입 추론을 사용할 때 몇 가지 위험한 부분들이 있다.
(assign 구문에서) 타입 추론 시 슈퍼클래스 또는 인터페이스로 설정되지 않는다. #
(assign 구문에서) 타입 추론 시 정확하게 오른쪽에 있는 피연산자에 맞게 설정된다.
슈퍼클래스, 혹은 인터페이스로 설정되지 않는다.
open class Animal
class Zebra: Animal()
fun main() {
var animal = Zebra() // animal 타입은 Zebra
animal = Animal() // 오류 : Type mismatch
}
타입을 명시하면 아래와 같다.
open class Animal
class Zebra: Animal()
fun main() {
var animal: Animal = Zebra() // animal 타입은 Animal
animal = Animal() // OK
}
리턴 타입은 꼭 명시한다. (공개된 API에서 리턴 타입을 제거하지 말자.) #
다음의 예시를 살펴보자.
interface CarFactory {
fun produce(): Car
}
val DEFAULT_CAR: Car = Fiat126P() // Fiat126P 가 디폴트라고 가정하자.
이후 시간이 지나 다음과 같이 코드를 수정했다.
" DEFAULT_CAR는 Car 로 명시적으로 지정되어 있으므로 따로 필요 없다고 판단해서, 함수의 리턴 타입을 제거했다고 합시다. “
interface CarFactory {
fun produce() = DEFAULT_CAR
}
또 시간이 지나 다음과 같이 코드를 수정했다.
val DEFAULT_CAR = Fiat126P()
이제 문제가 발생한다. CarFactory.produce()
는 Fiat126P
만 생성할 수 있다.
즉, fun produce() = DEFAULT_CAR
수정 시 리턴 타입이 제거된 것이 가장 큰 문제로 볼 수 있겠다.
요약 #
(public)공개된 API(인터페이스, 외부 API 등)에는 리턴 타입을 명시한다.