본문 바로가기

안드로이드/Kotlin

7. Effective Kotlin - 인라인 클래스의 사용을 고려하라.

inline class

특정 class의 Default 생성자의 프로퍼티가 하나일 경우 inline을 사용하면, 해당 객체를 사용하는 위치가 모두 해당 프로퍼티로 교체된다.

inline class Millis(private val time: Int) {
    // ...
}

이러한 inline 클래스는 타입만 일치한다면 값을 바로 넣는 것도 가능하다.

val time: Millis = Millis(3000)

// 컴파일 시 다음 형태로 변경
val time: Int = 3000

inline 클래스에 존재하는 메서드는 컴파일 시 모두 정적 메서드로 만들어진다.

inline class Name(private val value: String) {
    fun greet() {
        print()
    }
}

// 실제 코드
val name: Name = Name("Damon")
name.greet()

// 컴파일 시
val name: String = "Damon"
Name.'greet-impl'(name)

이러한 성질로 측정 단위를 표현할 때 매우 유용한다.

타입 오용으로 발생하는 문제

DB는 일반적으로 ID를 통해 요소를 식별한다. 이 과정에서 ID는 숫자일 경우가 많은데, 여러 테이블에서 각각 ID가 존재한다. 이 때, 전부 같은 Int 등의 타입을 활용하면 실수로 잘못된 값을 넣을 수도 있고, 어떤 오류도 발생하지 않아 문제를 찾기 어렵다. 이때, inline 클래스를 다음과 같이 사용한다.

inline class StudentId(val studentId: Int)

data class Grades(
    @ColumnInfo(name = "studentId")
    val studentId: StudentId
)