책/Effective Kotlin

[이펙티브 코틀린] 아이템3: 최대한 플랫폼 타입을 사용하지 말라

2023. 7. 1. 00:05
목차
  1. 1. 플랫폼 타입이란?
  2. 2. 어떻게 대응해야 하는가?
  3. 3. 정리
본문은 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
  1. 1. 플랫폼 타입이란?
  2. 2. 어떻게 대응해야 하는가?
  3. 3. 정리
'책/Effective Kotlin' 카테고리의 다른 글
  • [이펙티브 코틀린] 아이템5: 예외를 활용해 코드에 제한을 걸어라
  • [이펙티브 코틀린] 아이템4: inferred 타입으로 리턴하지 말자
  • [이펙티브 코틀린] 아이템2: 변수의 스코프를 최소화하라
  • [이펙티브 코틀린] 아이템1: 가변성을 제한하라
코택
코택
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • 파이썬
  • dp
  • mysql
  • 장고
  • BOJ
  • 그래프
  • atdd
  • 백준
  • fastapi
  • Shortest Path
  • http
  • 깊이 우선 탐색
  • 그래프 탐색
  • Git
  • 브루트포스

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[이펙티브 코틀린] 아이템3: 최대한 플랫폼 타입을 사용하지 말라
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.