[Effective Kotlin] 아이템3 - 최대한 플랫폼 타입을 사용하지 말라

우발자·2025년 11월 19일
1

Effective Kotlin을 읽고 정리하는 글이다.

주제 : 💔 플랫폼 타입을 믿지말자

오늘의 목차

1.플랫폼 타입이란?

2. 왜 사용하면 안될까?


一 플랫폼 타입이란?

플랫폼 타입(platform type)이란, 다른 프로그래밍 언어에서 전달되어서 nullable인지 아닌지 알 수 없는 타입을 말한다.

가끔 어떤 타입인지 볼 때 예를 들어
String이라고 하면 2가지 정도에 타입으로 나눌 수 있다.
String은 notNull타입으로 볼 수 있고, String?은 nullable타입으로 볼 수 있다.
하지만 그것 이외에 String!을 봤던 적이 있었을 것이다.
이 타입이 플랫폼 타입이다.


⼆ 왜 사용하면 안될까?

보통은 코틀린에서 자바 함수를 사용 할 때

public class UserRepo {
	public class UserRepo {
    	public @NotNull User getUser1() {
        	//...
        } 
        public @Nullable User getUser2() {
        	//...
        }
    }
}

@NotNull 또는 @Nullable이라는 어노테이션을 통해 코틀린에서 사용할 때 nullable타입인지 아닌지를 파악할 수 있다. 하지만 이런 어노테이션과 주석 설명이 없으면 사용자 입장에선 어떤타입인지 알기 힘들다.

그럴 때 NPE를 조심해야된다.

public class JavaClass {
	public String getValue() {
    	return null;
    }
}
fun statedType() {
	val value : String = JavaClass().value // 여기서 NPE 발생 !!
    //...
    println(value.length)
}


fun platformType() {
	val value = JavaClass().value
    //...
    println(value.length) // 여기서 NPE 발생 !!
}

두가지 모두 NPE가 발생하지만 위치에 차이가 있다.

statedType에서는 자바에서 값을 가져올 때 NPE가 발생한다. 그래서 이 위치에서 오류가 발생하면 nullable 타입이라는 걸 쉽게 알 수 있다.

하지만 platformType에서는 값을 활용할 때 NPE가 발생한다. 예시에서는 간단한 표현식이지만
복잡한 표현식에서는 현재 변수가 nullable인지 파악하기 힘들 것 이다. 현재 변수를 안전하게 한두 번 사용했더라도, 이후에 다른 개발자가 사용할 때 nullable인지 인지를 못하면 또 NPE가 발새될 것이기 때문이다.


후기

플랫폼 타입을 사용하는 코드가 있다면 제거하는게 좋아보인다.
현재에는 인지하더라도 추후 유지보수하는 개발자가 인지하기가 어려워보이기 때문이다.
그리고 자바 코드에 @NotNull, @Nullable 같은 어노테이션을 활용하는 것도 좋아보인다.

profile
어제보다 나은 개발자가 되자

0개의 댓글