본문은 Effective Kotlin을 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.
1. 플랫폼 타입이란?
코틀린에서는 자바 등의 다른 프로그래밍 언어에서 넘어온 타입들을 특수하게 다루는데, 이러한 타입을 플랫폼 타입(platform type)이라고 한다. 플랫폼 타입은 String!처럼 타입 이름 뒤에 ! 기호를 붙여서 표기한다.
// Java
public class JavaClass {
public String getValue() { ... }
}
// Kotlin
val name = MyJavaClass.value // 플랫폼 타입이 리턴됨
플랫폼 타입의 가장 큰 문제는 null 여부를 판단할 수 없다는 것이다. 따라서 코틀린과 다른 언어를 혼합해서 사용할 땐 NPE를 주의해야 한다.
// 둘 다 가능
val name: String = MyJavaClass.value
val name: String? = MyJavaClass.value
2. 어떻게 대응해야 하는가?
1) 자바와 코틀린을 함께 사용할 땐 @Nullable과 @NotNull 애너테이션을 붙여서 사용해라
- 이는 JetBrains, JavaX, Lombok 등의 다양한 라이브러리에서 제공한다
- 해당 애너테이션들을 사용하면 코틀린이 nullable 여부를 판단할 수 있다
// Java
public class JavaClass {
public @NotNull String getValue() { ... }
}
// Kotlin
val name: String = MyJavaClass.value // 코틀린에서 애너테이션을 읽고 타입을 추론해준다
2) 플랫폼 타입은 최대한 제거하라
책에선 제거하라는 말만 나올 뿐, 실천 방법에 대해서 언급하고 있진 않다. 제거하기 위해선 다음과 같은 방법을 고려할 수 있다.
1. 자바 라이브러리보단 코틀린 라이브러리를 사용하자
- ex) JUnit 대신 kotest 사용하기
- 코틀린 라이브러리는 일반적으로 자바 라이브러리를 한 번 Wrapping한 상태로 제공한다
2. 자바 코드를 사용한 지점을 단일 지점으로 줄이고 Wrapping 해서 사용하라
- 플랫폼 타입을 리턴하는 지점을 줄임으로써 유지보수가 용이해진다
// Bad
class A {
fun foo() {
javaClass.getSomething()
}
}
class B {
fun foo() {
javaClass.getSomething()
}
}
// Good
class WrappingJava {
fun getSomething(): Something {
javaClass.getSomething()
...
}
}
class A {
fun foo() {
wrappingJava.getSomething()
}
}
class B {
fun foo() {
wrappingJava.getSomething()
}
}
3) 만약 써야 한다면 타입을 명시해서 사용하라
- 타입을 명시하면 NPE가 발생하는 시점을 좀 더 앞으로 당길 수 있다
- 또는 Safe Call을 이용한 처리도 가능하다
// Bad
val name = MyJavaClass.value // inferred type
name.foo() // Null Pointer Exception!!
// Good 1
val name: String = MyJavaClass.value // Null Pointer Exception!!
// Good 2
val name: String? = MyJavaClass.value
name?.foo() ?: return
3. 정리
- 플랫폼 타입은 NPE의 위험성이 있고, 이 위험은 전파될 수 있다
- 따라서 최대한 빨리 제거하는 편이 좋다
- 코틀린과 함께 자바를 사용한다면 nullable 여부를 지정하는 애너테이션을 활용하라
'책 > Effective Kotlin' 카테고리의 다른 글
[이펙티브 코틀린] 아이템7: 결과 부족이 발생할 경우 null과 Failure를 사용하라 (0) | 2023.07.04 |
---|---|
[이펙티브 코틀린] 아이템5: 예외를 활용해 코드에 제한을 걸어라 (0) | 2023.07.03 |
[이펙티브 코틀린] 아이템4: inferred 타입으로 리턴하지 말자 (0) | 2023.07.02 |
[이펙티브 코틀린] 아이템2: 변수의 스코프를 최소화하라 (0) | 2023.06.30 |
[이펙티브 코틀린] 아이템1: 가변성을 제한하라 (0) | 2023.06.28 |
본문은 Effective Kotlin을 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.
1. 플랫폼 타입이란?
코틀린에서는 자바 등의 다른 프로그래밍 언어에서 넘어온 타입들을 특수하게 다루는데, 이러한 타입을 플랫폼 타입(platform type)이라고 한다. 플랫폼 타입은 String!처럼 타입 이름 뒤에 ! 기호를 붙여서 표기한다.
// Java
public class JavaClass {
public String getValue() { ... }
}
// Kotlin
val name = MyJavaClass.value // 플랫폼 타입이 리턴됨
플랫폼 타입의 가장 큰 문제는 null 여부를 판단할 수 없다는 것이다. 따라서 코틀린과 다른 언어를 혼합해서 사용할 땐 NPE를 주의해야 한다.
// 둘 다 가능
val name: String = MyJavaClass.value
val name: String? = MyJavaClass.value
2. 어떻게 대응해야 하는가?
1) 자바와 코틀린을 함께 사용할 땐 @Nullable과 @NotNull 애너테이션을 붙여서 사용해라
- 이는 JetBrains, JavaX, Lombok 등의 다양한 라이브러리에서 제공한다
- 해당 애너테이션들을 사용하면 코틀린이 nullable 여부를 판단할 수 있다
// Java
public class JavaClass {
public @NotNull String getValue() { ... }
}
// Kotlin
val name: String = MyJavaClass.value // 코틀린에서 애너테이션을 읽고 타입을 추론해준다
2) 플랫폼 타입은 최대한 제거하라
책에선 제거하라는 말만 나올 뿐, 실천 방법에 대해서 언급하고 있진 않다. 제거하기 위해선 다음과 같은 방법을 고려할 수 있다.
1. 자바 라이브러리보단 코틀린 라이브러리를 사용하자
- ex) JUnit 대신 kotest 사용하기
- 코틀린 라이브러리는 일반적으로 자바 라이브러리를 한 번 Wrapping한 상태로 제공한다
2. 자바 코드를 사용한 지점을 단일 지점으로 줄이고 Wrapping 해서 사용하라
- 플랫폼 타입을 리턴하는 지점을 줄임으로써 유지보수가 용이해진다
// Bad
class A {
fun foo() {
javaClass.getSomething()
}
}
class B {
fun foo() {
javaClass.getSomething()
}
}
// Good
class WrappingJava {
fun getSomething(): Something {
javaClass.getSomething()
...
}
}
class A {
fun foo() {
wrappingJava.getSomething()
}
}
class B {
fun foo() {
wrappingJava.getSomething()
}
}
3) 만약 써야 한다면 타입을 명시해서 사용하라
- 타입을 명시하면 NPE가 발생하는 시점을 좀 더 앞으로 당길 수 있다
- 또는 Safe Call을 이용한 처리도 가능하다
// Bad
val name = MyJavaClass.value // inferred type
name.foo() // Null Pointer Exception!!
// Good 1
val name: String = MyJavaClass.value // Null Pointer Exception!!
// Good 2
val name: String? = MyJavaClass.value
name?.foo() ?: return
3. 정리
- 플랫폼 타입은 NPE의 위험성이 있고, 이 위험은 전파될 수 있다
- 따라서 최대한 빨리 제거하는 편이 좋다
- 코틀린과 함께 자바를 사용한다면 nullable 여부를 지정하는 애너테이션을 활용하라
'책 > Effective Kotlin' 카테고리의 다른 글
[이펙티브 코틀린] 아이템7: 결과 부족이 발생할 경우 null과 Failure를 사용하라 (0) | 2023.07.04 |
---|---|
[이펙티브 코틀린] 아이템5: 예외를 활용해 코드에 제한을 걸어라 (0) | 2023.07.03 |
[이펙티브 코틀린] 아이템4: inferred 타입으로 리턴하지 말자 (0) | 2023.07.02 |
[이펙티브 코틀린] 아이템2: 변수의 스코프를 최소화하라 (0) | 2023.06.30 |
[이펙티브 코틀린] 아이템1: 가변성을 제한하라 (0) | 2023.06.28 |