뷰 동일성 이해하기
SwiftUI가 뷰를 비교하고 재사용하는 방식을 제어합니다.
뷰 동일성 이해하기은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
식별성이 SwiftUI를 좌우합니다
SwiftUI는 각 뷰를 식별성으로 추적하여 기존 뷰를 업데이트할지 새 뷰를 만들지 결정합니다.
식별성을 올바르게 설정하는 것은 정확성과 성능을 좌우하는 가장 중요한 요소입니다.
두 가지 식별성
SwiftUI는 두 가지 형식을 사용합니다. 구조적 식별성은 뷰 트리에서 뷰의 위치이고, 명시적 식별성은 사용자가 할당하는 id입니다.
구조적 식별성
기본적으로 뷰의 식별성은 계층 구조에서 뷰가 위치한 곳으로 결정됩니다. 아래의 if 분기는 구조적으로 서로 다른 두 뷰를 만듭니다.
var body: some View {
if isOn {
Text("On") // one identity
} else {
Text("Off") // a different identity
}
}분기에서 상태가 사라지는 이유
각 분기는 서로 다른 구조적 식별성을 가지므로, 분기 사이를 전환하면 첫 번째 뷰가 제거되고 두 번째 뷰가 생성됩니다. 내부의 @State도 초기화됩니다.
if isExpanded {
DetailView() // new instance each time the branch flips
} else {
SummaryView()
}id()를 사용한 명시적 식별성
.id(_:) 수정자는 명시적 식별성을 할당합니다. id가 변경되면 SwiftUI는 “이 뷰는 다른 뷰입니다”라고 판단하여 새 인스턴스를 만들고 상태를 초기화합니다.
CounterView()
.id(selectedTab) // new identity per tabForEach의 식별성
ForEach에는 각 요소마다 안정적인 식별성이 필요합니다. 안정적인 id를 가리키는 키 경로를 사용하고, 변경 가능한 컬렉션에는 배열 인덱스를 절대 사용하지 마세요.
ForEach(items, id: \.id) { item in
RowView(item: item)
}인덱스 식별성의 함정
변경되는 인덱스나 값에 id: \.self를 사용하면 데이터가 변경될 때 식별성의 순서가 바뀌어 잘못된 애니메이션과 상태 손실이 발생합니다.
// Risky if items reorder or values repeat:
// ForEach(0..<items.count, id: \.self) { ... }식별성과 애니메이션
애니메이션은 동일한 식별성에 속한 상태 사이를 보간합니다. 식별성이 변경되면 SwiftUI는 부드러운 애니메이션 대신 삽입·제거 전환을 수행합니다.
withAnimation {
// same identity -> property animates
// changed id -> transition (fade/slide)
}조건부 수정자는 식별성을 변경합니다
if 안에서 수정자를 적용하면 구조적 식별성이 변경되어 상태가 초기화될 수 있습니다. 조건에 따라 수정자 값을 계산하고 하나의 뷰를 유지하는 방식을 선호하세요.
// Better: keep one identity
Text("Hi")
.opacity(isHidden ? 0 : 1)
// Worse: branching creates two identitiesAnyView는 식별성 정보를 지웁니다
뷰를 AnyView로 감싸면 SwiftUI에서 뷰의 타입을 알 수 없게 되어 효율적으로 차이를 비교하는 능력이 약해집니다. 가능한 경우 구체적인 타입이나 @ViewBuilder를 대신 사용하세요.
// Prefer @ViewBuilder over returning AnyView
@ViewBuilder
func content() -> some View {
if flag { A() } else { B() }
}안정적인 식별성 = 안정적인 상태
경험칙은 다음과 같습니다. 상태와 부드러운 애니메이션을 유지하려면 식별성을 안정적으로 유지하고, 정말 새로 시작해야 할 때만 의도적으로 식별성을 변경하세요.
빠른 확인: 뷰 식별성
뷰 식별성에 대한 이해도를 테스트합니다.
복습: 뷰 식별성 이해하기
SwiftUI는 뷰를 구조적으로(트리의 위치) 그리고 명시적으로(.id) 식별합니다. 안정적인 식별성은 @State를 보존하고 속성 애니메이션을 부드럽게 만들며, 식별성을 변경하면 상태가 초기화되고 전환이 실행됩니다.
ForEach에는 안정적인 id를 제공하고, 변경 가능한 데이터에는 인덱스 식별성을 사용하지 않으며, 식별성을 바꾸는 분기를 최소화하고, 구체적인 타입으로 해결할 수 있는 경우 AnyView를 피하세요.
자주 묻는 질문
“뷰 동일성 이해하기” 강의는 무료인가요?
네 — “뷰 동일성 이해하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“뷰 동일성 이해하기”에서 뭘 배우나요?
SwiftUI가 뷰를 비교하고 재사용하는 방식을 제어합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“뷰 동일성 이해하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.