제한 사항
값 클래스에서 할 수 없는 작업
제한 사항은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
한계 이해하기
값 클래스는 강력하지만 제약이 있습니다. 한계를 이해하면 적절한 도구를 선택하고 예상치 못한 문제를 피할 수 있습니다.
정확히 하나의 속성
값 클래스는 하나의 값만 감쌉니다. 여러 필드를 묶으려면 일반 클래스나 data class가 필요합니다.
// @JvmInline value class Range(val lo: Int, val hi: Int) // not allowed
data class Range(val lo: Int, val hi: Int)
fun main() {
println(Range(1, 10))
}값 외의 초기화 상태 없음
값 클래스에는 생성자 속성 하나 외에 저장 필드를 둘 수 없습니다. 저장 필드가 있는 추가 var 상태는 허용되지 않습니다.
@JvmInline
value class Counter(val value: Int) {
// val cached: Int = value * 2 // not allowed: extra backing field
val doubled: Int get() = value * 2 // computed is fine
}
fun main() {
println(Counter(3).doubled)
}상속 불가
값 클래스는 암시적으로 final입니다. 다른 클래스를 상속할 수도, 상속 대상이 될 수도 없습니다. 인터페이스만 구현할 수 있습니다.
interface Named { val label: String }
@JvmInline
value class Tag(val text: String) : Named {
override val label: String get() = text
}
fun main() {
println(Tag("urgent").label)
}박싱으로 인한 비용
값을 null 허용 타입, 제네릭 타입 또는 인터페이스 타입으로 사용하면 추가 비용이 없다는 약속이 사라집니다. 그러면 컴파일러가 값을 실제 객체로 박싱합니다.
@JvmInline
value class Id(val raw: Int)
fun main() {
val list: List<Id> = listOf(Id(1), Id(2)) // boxed inside the list
println(list.map { it.raw })
}동일성 없음
값 클래스에는 안정적인 참조 동일성이 없습니다. ===를 사용한 참조 동등성은 의미가 없으며, 동기화 잠금처럼 객체 동일성이 중요한 곳에서도 사용할 수 없습니다.
@JvmInline
value class Code(val value: Int)
fun main() {
val a = Code(5)
val b = Code(5)
println(a == b) // structural equality works
}lateinit 또는 위임 사용 불가
기반 값에 lateinit을 적용할 수 없으며, 값 클래스는 하나의 필드에 속성 위임을 지원하지 않습니다. 값은 생성자에서 설정해야 합니다.
@JvmInline
value class Slug(val value: String)
fun main() {
val s = Slug("hello-world") // must be provided up front
println(s.value)
}JVM 이름 변형
JVM에서는 값 클래스 매개변수를 받는 함수의 바이트코드 이름이 충돌을 피하기 위해 변형됩니다. 이로 인해 Java와의 상호 운용이 복잡해지고 Java 호출 코드에서 해당 함수를 깔끔하게 보지 못할 수 있습니다.
@JvmInline
value class Hz(val value: Int)
fun tune(freq: Hz) = freq.value
fun main() {
println(tune(Hz(440))) // simple from Kotlin; mangled from Java
}여러 필드를 감싸는 용도가 아님
두 개의 속성이 필요하다고 느껴진다면 값 클래스는 적절한 도구가 아닙니다. 더 풍부한 구조를 얻는 대신 객체 할당을 받아들이고 data class를 사용하세요.
data class Coordinate(val lat: Double, val lng: Double)
fun main() {
println(Coordinate(41.0, 29.0))
}제한 사항 요약
값 클래스는 다음을 할 수 없습니다.
- 속성을 두 개 이상 보유하기
- 추가 저장 필드나
lateinit사용하기 - 클래스를 상속하거나 클래스가 상속하도록 하기
- 참조 동일성 제공하기
- 항상 박싱을 피하기
현명하게 선택하기
하나의 검증된 타입 안전 값에는 값 클래스를 사용하세요. 묶음 데이터에는 데이터 클래스를 사용하세요. 안전성 없이 가독성만 높이려면 타입 별칭을 사용하세요. 각각 적합한 용도가 있습니다.
빠른 확인
값 클래스의 제한 사항에 대한 이해도를 확인해 보세요.
복습
값 클래스의 제한 사항을 배웠습니다.
- 속성 하나만 가능하며 추가 저장 필드는 없음
- 상속 불가, 동일성 없음
- null 허용, 제네릭 또는 인터페이스로 사용하면 박싱 발생
- JVM 이름 변형으로 Java와의 상호 운용이 복잡해짐
필요에 맞는 도구를 선택하세요.
자주 묻는 질문
“제한 사항” 강의는 무료인가요?
네 — “제한 사항” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“제한 사항”에서 뭘 배우나요?
값 클래스에서 할 수 없는 작업 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“제한 사항” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.