0Pricing
Kotlin Academy · 강의

인라인 값 클래스

오버헤드 없이 감쌉니다

인라인 값 클래스은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

래핑 문제

기본 유형을 클래스로 감싸면 유형 안전성이 높아지지만 일반적으로 힙 할당 비용이 발생합니다. 값 클래스는 유형 안전성을 제공하면서 가능한 경우 컴파일러가 래퍼를 제거하도록 합니다.

값 클래스 선언

기본 생성자에 속성이 정확히 하나 있는 클래스에 @JvmInline value class를 표시합니다. 이 클래스는 고유한 타입처럼 동작합니다.

@JvmInline
value class Password(val value: String)

fun main() {
    val p = Password("secret")
    println(p.value)
}

고유한 타입

타입 별칭과 달리 값 클래스는 별도의 타입입니다. Password가 필요한 곳에 일반 String을 실수로 전달할 수 없습니다.

@JvmInline
value class Password(val value: String)

fun login(p: Password) = println("login with " + p.value)

fun main() {
    login(Password("hunter2"))
}

추가 비용 없음

실행 시점에 컴파일러는 보통 기반 값을 인라인화하므로 추가 객체를 할당하지 않습니다. 대부분의 코드 경로에서 Password는 일반 String으로 표현됩니다.

@JvmInline
value class Meters(val amount: Double)

fun main() {
    val d = Meters(5.0)
    println(d.amount) // stored inline as a Double
}

메서드와 속성

값 클래스에는 일반 클래스와 마찬가지로 함수와 계산된 속성을 정의할 수 있습니다.

@JvmInline
value class Celsius(val degrees: Double) {
    fun toFahrenheit() = degrees * 9 / 5 + 32
}

fun main() {
    println(Celsius(100.0).toFahrenheit())
}

검증을 위한 초기화 블록

init 블록을 사용하면 생성할 때 감싼 값을 검증하여 모든 인스턴스가 유효하도록 보장할 수 있습니다.

@JvmInline
value class Percentage(val value: Int) {
    init {
        require(value in 0..100) { "out of range" }
    }
}

fun main() {
    println(Percentage(75).value)
}

계산된 속성

하나의 저장된 값에서 계산되는 속성을 추가하여 관련 로직을 해당 타입 가까이에 둘 수 있습니다.

@JvmInline
value class Seconds(val value: Int) {
    val asMinutes: Double get() = value / 60.0
}

fun main() {
    println(Seconds(120).asMinutes)
}

인터페이스 구현

값 클래스는 인터페이스를 구현할 수 있으므로 다형적으로 사용할 수 있습니다. 단, 인터페이스 타입으로 취급하면 박싱이 발생할 수 있습니다.

interface Describable {
    fun describe(): String
}

@JvmInline
value class Money(val cents: Int) : Describable {
    override fun describe() = "$" + cents / 100.0
}

fun main() {
    println(Money(1599).describe())
}

박싱이 발생하는 경우

값을 null 허용 타입, 인터페이스 또는 제네릭 컬렉션에서 사용하면 래퍼가 다시 나타납니다(박싱). 이 경우 컴파일러가 실제 객체를 생성합니다. 동작은 올바르지만 효율은 조금 떨어집니다.

@JvmInline
value class Id(val raw: Int)

fun main() {
    val direct = Id(1)        // inlined
    val boxed: Id? = Id(2)    // boxed because nullable
    println("" + direct.raw + " " + boxed?.raw)
}

값 클래스와 데이터 클래스

data class는 항상 객체를 할당하며 여러 속성을 담을 수 있습니다. value class는 정확히 하나의 값을 담고 추가 비용을 없애는 것을 목표로 합니다. 하나의 값을 감싸는 얇고 타입 안전한 래퍼에는 값 클래스를 선택하세요.

중요한 이유

값 클래스를 사용하면 다음을 할 수 있습니다.

  • 같은 타입의 매개변수를 서로 혼동하는 일을 방지합니다
  • 기본 타입에 검증을 연결합니다
  • 대체로 실행 비용을 부담하지 않습니다

값 클래스는 타입 별칭의 안전성 부족을 해결하는 타입 안전한 방법입니다.

빠른 확인

인라인 값 클래스에 대한 이해도를 확인해 보세요.

복습

인라인 값 클래스에 대해 다음을 배웠습니다.

  • 속성이 하나인 @JvmInline value class 선언
  • 대체로 추가 비용이 없는 고유한 타입
  • 메서드, 계산된 속성 및 init 검증 지원
  • null 허용 타입, 제네릭 또는 인터페이스로 사용할 때 박싱 발생

다음: 실제 사용 사례

자주 묻는 질문

“인라인 값 클래스” 강의는 무료인가요?

네 — “인라인 값 클래스” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“인라인 값 클래스”에서 뭘 배우나요?

오버헤드 없이 감쌉니다 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“인라인 값 클래스” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 유형 별칭
  2. 인라인 값 클래스
  3. 사용 사례
  4. 제한 사항
← Kotlin Academy(으)로 돌아가기