최대한 플랫폼 타입을 사용하지 말라 #
코틀린은 자바 등의 다른 프로그래밍 언어에서 넘어온 타입들을 특수하게 다룬다. 이 타입을 플랫폼 타입(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 을 구분하여/표기하여 사용하는 것은 지향한다.