아이템 03. 최대한 플랫폼 타입을 사용하지 말라

아이템 03. 최대한 플랫폼 타입을 사용하지 말라

최대한 플랫폼 타입을 사용하지 말라 #

코틀린은 자바 등의 다른 프로그래밍 언어에서 넘어온 타입들을 특수하게 다룬다. 이 타입을 플랫폼 타입(platform type) 이라고 부른다.

플랫폼 타입은 ! 기호를 붙여서 표기한다. 예를 들면, String! 과 같다.

플랫폼 타입은 코틀린에서 non-nullable, nullable, platform type 변수로 받아 사용할 수 있다.

// 자바
public User getUser() { ... }

// 코틀린
val user = getUser()    // User!
val user = getUser()    // User
val user = getUser()    // User?

단, nullable 문제를 잘 해결해야되겠다. 즉, nullable, non-nullable 을 가능한 표기하여 사용하는 것이 좋다.

자바의 경우 다음과 같이 여러 어노테이션을 지원하고 있다.

|지원처|어노테이션| |JSR-305|javax.annotation

@Nullable, @CheckForNull, @Nonnull| |Lombok|@NonNull| |JetBrains|@Nullable, @NotNull| |JavaX|javax.annotation

@Nullable, @CheckForNull, @Nonnull| |ReactiveX|io.reactivex.annotations

@Nullable, @NonNull| |…|…|

자바의 경우 어노테이션 @Nullable, @NotNull 등을 사용한다.

대체적으로 JSR-305 의 @ParametersAreNonnullByDefault 어노테이션 등을 활용하면, 자바에서도 디폴트로 파라미터가 널이 아니라는 것을 보장할 수 있다.


플랫폼 타입은 안전하지 않으므로 최대한 빨리 제거한다. #

위에서 본 코드를 다시 살펴보면 코틀린은 플랫폼 타입을 (변수에)유지한 채 계속해서 가져갈 수 있다. 이는 지양해야 한다.

플랫폼 타입은 안전하지 않으므로 최대한 빨리 제거하는 것이 좋다.

// 자바
public User getUser() { ... }

// 코틀린
val user = getUser()    // User!
val user = getUser()    // User
val user = getUser()    // User?

플랫폼 타입을 유지한다는 것은 NPE를 전파하는 행위일 것이다.


요약 #

  • 코틀린 단에서 플랫폼 타입은 빠르게 제거한다.
  • 플랫폼 타입 사용 시 inferred 타입(추론된 타입)의 사용은 지양한다.
  • (코틀린 처럼 언어 레벨에서 지원하지 않아도) nullable, non-nullable 을 구분하여/표기하여 사용하는 것은 지향한다.