인라인 값 클래스
오버헤드 없이 감쌉니다
인라인 값 클래스은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.