0Pricing
Kotlin Academy · 강의

copy()와 부분 재정의로 복사하기

원본을 변경하지 않고 수정된 인스턴스를 만들 때 copy()를 사용해 보세요.

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

copy()를 사용한 불변 업데이트

copy()는 일부 프로퍼티가 변경된 데이터 클래스의 새 인스턴스를 생성합니다. 지정하지 않은 모든 프로퍼티는 원래 값을 유지합니다.

기본 copy()

이름이 지정된 인수를 전달하여 특정 프로퍼티를 재정의하십시오.
data class Person(val name: String, val age: Int, val city: String)
val alice = Person("Alice", 30, "Berlin")
val olderAlice = alice.copy(age = 31)
println(olderAlice)  // Person(name=Alice, age=31, city=Berlin)

여러 필드 복사

필요한 만큼 많은 필드를 재정의하십시오.
data class Config(val host: String, val port: Int, val ssl: Boolean, val timeout: Int)
val prod = Config("prod.server", 443, true, 30)
val test = prod.copy(host = "test.server", port = 8080, ssl = false)
println(test)

copy는 원본을 수정하지 않습니다

copy는 항상 새 객체를 생성합니다. 원본은 완전히 변경되지 않습니다.
data class Point(val x: Int, val y: Int)
val origin = Point(0, 0)
val moved = origin.copy(x = 5)
println(origin)  // Point(x=0, y=0) — unchanged
println(moved)   // Point(x=5, y=0)

깊은 복사의 주의점

copy는 얕은 복사입니다. 데이터 클래스 내부의 변경 가능한 객체는 원본과 복사본 사이에서 공유됩니다.
data class Team(val name: String, val members: MutableList<String>)
val t1 = Team("A", mutableListOf("Alice"))
val t2 = t1.copy(name = "B")
t2.members.add("Bob")       // modifies SHARED list!
println(t1.members)  // [Alice, Bob] ← also changed!

얕은 복사 문제 피하기

공유로 인한 문제를 피하려면 데이터 클래스 내부에 불변 데이터를 사용하십시오.
data class Team(val name: String, val members: List<String>)  // immutable list
val t1 = Team("A", listOf("Alice"))
val t2 = t1.copy(name = "B", members = t1.members + "Bob")
println(t1.members)  // [Alice]
println(t2.members)  // [Alice, Bob]

상태 관리에서의 copy

copy는 Redux 스타일 또는 MVI 아키텍처에서 상태를 업데이트하는 관용적인 방법입니다.
data class UiState(val loading: Boolean, val items: List<String>, val error: String?)
fun reduce(state: UiState, action: Action) = when (action) {
    is Loading -> state.copy(loading = true)
    is Success -> state.copy(loading = false, items = action.data)
    is Error -> state.copy(loading = false, error = action.msg)
}

기본 매개변수와 함께 사용하는 copy

프로퍼티가 많은 데이터 클래스에서도 이름이 지정된 매개변수 덕분에 copy를 간결하게 사용할 수 있습니다.
data class Article(
    val id: Long, val title: String, val body: String,
    val published: Boolean = false, val views: Int = 0
)
val draft = Article(1L, "Hello", "Content...")
val published = draft.copy(published = true)
println(published.title)  // Hello

테스트에서 copy 사용하기

copy를 사용하면 테스트 픽스처를 쉽게 만들 수 있습니다. 기본 객체 하나를 만든 다음 필요한 필드만 변경하십시오.
val baseUser = User(id = 1, name = "Test", email = "test@test.com", active = true)
val inactiveUser = baseUser.copy(active = false)
val renamed = baseUser.copy(name = "Renamed")

copy와 빌더 패턴 비교

데이터 클래스의 copy()는 Kotlin에서 빌더 패턴에 해당합니다. 선택적 필드가 많은 복잡한 객체에는 데이터 클래스와 copy를 함께 사용하는 편이 더 간결합니다.
// Java Builder:
User.builder().name("A").age(30).role("admin").build()
// Kotlin:
val u = User("A", 30, "admin")  // or copy from base

레코드 의미론

val 프로퍼티를 사용하는 데이터 클래스는 Java 레코드(JDK 16+)처럼 동작합니다. 불변이고 값을 기반으로 하며 자동으로 출력할 수 있습니다.
data class RGB(val r: Int, val g: Int, val b: Int)
val white = RGB(255, 255, 255)
println(white)  // RGB(r=255, g=255, b=255)

빠른 확인

copy()를 호출하면 원래 데이터 클래스 인스턴스에는 어떤 일이 발생합니까?

복습

copy()는 재정의된 필드를 포함하는 새 인스턴스를 생성하며 원본은 변경되지 않습니다. 상태 관리, 테스트 및 빌더 스타일의 객체 생성에 유용합니다. 변경 가능한 프로퍼티가 포함된 얕은 복사에 주의하십시오. 다음 주제는 구조 분해입니다!

자주 묻는 질문

“copy()와 부분 재정의로 복사하기” 강의는 무료인가요?

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

“copy()와 부분 재정의로 복사하기”에서 뭘 배우나요?

원본을 변경하지 않고 수정된 인스턴스를 만들 때 copy()를 사용해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“copy()와 부분 재정의로 복사하기” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. 데이터 클래스 기초: 자동 생성 메서드
  2. copy()와 부분 재정의로 복사하기
  3. componentN을 사용한 구조 분해 선언
  4. 컬렉션과 맵 키로 사용하는 데이터 클래스
← Kotlin Academy(으)로 돌아가기