코틀린의 타입 추론(type inference)은 JVM 세계에서 가장 널리 알려진 코틀린의 특징입니다. 자바에서도 Java10부터는 코틀린을 따라 타입 추론을 도입했습니다.
Type Inference in Kotlin (Inferred Type)
코틀린에서는 compile time에 어느 정도 생략이 되었더라도 컴파일러에 의해 형 추론이 가능한 타입 추론(Type inference)이라는 특징을 제공한다.
예를 들어서,
fun main() {
//val word : String = ""
val word = ""
}
위 코드와 같이, String 형이라는 타입을 명시적으로 지정해주지 않아도 코틀린은 프로퍼티 및 변수의 타입을 대입값에 근거해 추론하여 타입을 부여한다.
타입 추론을 사용할 때는 몇 가지 위험한 부분들이 존재한다.위험한 점들을 피하기 위해 가장 먼저 주의해야 할 것은 '우선 할당 때 inferred 타입은 정확하게 오른쪽에 있는 피연산자에 맞게 설정된다는 것을 기억하는 것' 이다. 절대로 슈퍼클래소 또는 인터페이스로는 설정되지 않는다.
open class Animal
class Zebra: Animal()
fun main() {
var animal = Zebra()
animal = Animal() // type mismatch error
}
//일반적인 경우에는 이런 점은 문제가 되지 않는다.
//그냥 원하는 타입보다 제한된 타입이 설정되었다면,
//타입을 명시적으로 지정해서 이러한 문제를 해결 할 수 있다.
open class Animal
class Zebra: Animal()
fun main(){
var anima: Animal = Zebra()
animal = Animal()
}
위와 같은 경우에는 유저가 코드를 직접적으로 조작할 수 있는 경우이기에 inferred type을 사용하는 것이 문제가 되지 않았지만, 라이브러리(모듈)을 사용하는 경우에는 직접적으로 코드를 건드리기 어려운 경우가 많을 것이기에, 간단히 해결할 수 있는 문제는 아니다. 그리고 이러한 경우에 inferred 타입을 노출하는 경우에는 위험한 경우의 수들이 발생할 수 있다.
위 말을 설명할 수 있는 예로 다음의 코드를 확인해보자.
interface CarFactory {
fun produce() : Car
}
별도의 설정을 하지 않았을 떄에 생성되는 디폴트 값이 다음과 같다고 가정하고
val DEFAULT_CAR: Car = Fiat126P()
코드를 작성하다보니 DEFAULT_CAR는 Car로 명시적으로 지정되어 있으므로 따로 필요 없는 리턴 함수를 제거했다고 가정하자.
interface CarFactory{
fun produce() = DEFAULT_CAR
}
그런데 이후에 해당 인터페이스를 사용하는 누군가가, DEFAULT_CAR는 타입 추론에 의해 자동으로 타입이 지정될 것이므로, Car를 명시적으로 지정하지 않아도 된다고 생각하여 다음과 같이 코드를 변경했다고 생각하면,
val DEFAULT_CAR = Fiat126P()
이제 CarFactory는 Fiat126P 차량 밖에 생산하지 못하게 된다.
즉, 단일 경우로 한정지어 명시 추론 타입을 사용하게 되면, 그 외의 경우에는 문제가 발생한다.
따라서 리턴 타입은 외부에서 확인할 수 있게 명시적으로 지정해 주는 것이 좋다.
정리
위 내용들을 쉽게 정리하자면 타입을 확실하게 지정해야 하는 경우에는 명시적으로 타입을 지정해야 한다는 원칙만 가지고 있으면 된다.
또한, 안전을 위해 외부 API를 만들 때는 반드시 타입을 지정하고, 이렇게 지정한 타입을 특별한 이유와 확실한 확인 없이는 제거하지 않아야 한다. inferred 타입은 프로젝트가 진전될 떄, 제한이 너무 많아지거나 예측하지 못한 결과를 낼 수 있다는 것에 주의하자.
해당 포스팅은 이펙티브 코틀린 을 참고하여 작성하였습니다.
'Kotlin > 이펙티브 코틀린(Effective Kotlin)' 카테고리의 다른 글
[Item 05] 예외를 활용해 코드에 제한을 걸어라 (0) | 2023.05.02 |
---|---|
[Item 02] 변수의 스코프를 최소화하라 (0) | 2023.04.25 |
[Item 01] 가변성을 제한하라 (0) | 2023.04.22 |