🚀 Swift 구조체 심화 과정
– 효율적이고 안전한 코드 작성을 위한 Struct 설계 전략
Swift는 다른 언어보다 구조체(Struct) 를 훨씬 적극적으로 사용하는 언어입니다.
이 심화 과정에서는 단순한 데이터 묶음을 넘어서,
구조체를 활용한 최적의 설계 방법과 고급 기능을 배워보겠습니다.
1️⃣ 구조체 설계 원칙: 값 타입(Value Type)의 철학 이해하기
Swift에서 구조체는 값 타입(Value Type) 입니다.
값 타입이란, 복사(copy) 가 일어나고 서로 독립적인 데이터로 관리된다는 의미에요.
✅ 언제 구조체를 선택해야 할까?
-
데이터가 독립적이어야 할 때
-
변경 불가능한(Immutable) 상태를 선호할 때
-
상속이 필요 없고, 단순한 데이터 모델일 때
-
멀티스레드 환경에서 안전하게 사용하고 싶을 때
⚡ 참고: SwiftUI의 대부분의 View도 Struct 기반입니다!
이유는 “값 타입 = 안전하고 예측 가능한 UI 상태 관리”이기 때문이죠.
2️⃣ 불변성과 데이터 무결성 (Immutability & Data Integrity)
구조체는 기본적으로 안전한 데이터 보호에 최적화되어 있어요.
struct UserProfile {
var name: String
var age: Int
}
let profile = UserProfile(name: "지우", age: 20)
// profile.age = 21 ❌ 오류 발생 (let 선언 시 변경 불가)
-
불변성 덕분에 예측 가능한 코드 작성 가능
-
변경이 필요한 경우에만 var로 관리
💡 팁: 가능하면 구조체는 불변 상태로 설계하고, 필요한 경우에만 mutating 메서드를 활용하세요.
불변성과 데이터 무결성 (Immutability & Data Integrity) |
3️⃣ mutating 활용 최적화
단순히 값을 바꾸는 것이 아니라,
구조체의 상태(State)를 안전하게 관리하기 위한 수단으로 사용해야 합니다.
예제: 은행 계좌 입출금 관리
struct BankAccount {
private(set) var balance: Int = 0
mutating func deposit(_ amount: Int) {
balance += amount
}
mutating func withdraw(_ amount: Int) {
balance = max(0, balance - amount)
}
}
-
외부에서는 읽기만 가능
-
변경은 반드시 메서드를 통해서만!
4️⃣ 프로토콜 지향 프로그래밍(POP)과 구조체
Swift는 객체지향(OOP) 보다 프로토콜 지향 프로그래밍(POP) 을 더 강조합니다.
구조체는 POP에 최적화된 타입이에요!
프로토콜 기반 설계 예시
protocol Drivable {
func drive()
}
struct Car: Drivable {
func drive() {
print("자동차가 달립니다!")
}
}
struct Bicycle: Drivable {
func drive() {
print("자전거가 달립니다!")
}
}
let vehicles: [Drivable] = [Car(), Bicycle()]
vehicles.forEach { $0.drive() }
-
공통된 기능을 프로토콜로 정의하고,
-
구조체들이 이를 채택하여 유연한 확장성 제공
프로토콜 지향 프로그래밍(POP)과 구조체 |
5️⃣ 확장(Extension)으로 기능 추가하기
구조체를 수정하지 않고, 기능을 확장할 수 있습니다.
import Foundation // sqrt 사용을 위한 import
struct Point {
var x: Int
var y: Int
}
extension Point {
func distanceFromOrigin() -> Double {
return sqrt(Double(x * x + y * y))
}
}
let p = Point(x: 3, y: 4)
print(p.distanceFromOrigin()) // 5.0
-
코드 분리 & 유지보수에 매우 유리
-
프로토콜 + Extension 조합 = Swift 설계의 꽃 🌸
확장(Extension)으로 기능 추가하기 |
6️⃣ Equatable, Hashable, Codable 활용
Swift 구조체는 다음과 같은 프로토콜을 통해 강력한 기능을 추가할 수 있습니다.
프로토콜 |
기능 설명 |
---|---|
Equatable |
구조체 간 비교 (==) 가능 |
Hashable |
Set, Dictionary의 Key로 사용 가능 |
Codable |
JSON 인코딩/디코딩 지원 |
예제: Codable 적용
struct User: Codable {
var name: String
var age: Int
}
let user = User(name: "민준", age: 25)
let jsonData = try? JSONEncoder().encode(user)
-
네트워크 통신, 데이터 저장 시 필수!
7️⃣ Copy-on-Write (COW) 최적화 이해하기
Swift의 구조체는 값 타입이지만,
내부적으로 복사가 필요한 시점에만 복사하는 COW 최적화가 적용돼 있어요.
즉, 복사 비용을 최소화해서 성능을 높입니다.
✅ Swift의 Array, Dictionary, Set 등이 대표적인 COW 구조체입니다.
✏️ 심화 실습 과제
-
Todo 리스트 앱용 데이터 모델
-
구조체로 Todo 항목 설계
-
Codable + Equatable 채택
-
Extension으로 완료 처리 기능 추가
-
-
Protocol + Struct 조합으로 게임 캐릭터 설계
-
Playable 프로토콜 정의
-
다양한 캐릭터 구조체 구현
-
-
JSON 데이터 파싱
-
API 응답을 Codable 구조체로 처리해보기
-
🎯 마무리하며
Swift의 구조체는 단순히 “클래스보다 가벼운 타입”이 아닙니다.
안정성(Safety), 성능(Performance), 그리고
프로토콜 지향 설계의 중심에 있는 강력한 도구입니다.
오늘 배운 핵심 포인트
-
값 타입의 철학 이해
-
불변성 기반 설계
-
프로토콜 지향 프로그래밍(POP) 실천
-
확장성과 유지보수를 고려한 Extension 활용
-
Codable, Equatable 등의 프로토콜 적극 활용
댓글 쓰기