[Swift Apple ] Swift 구조체 심화 과정

🚀 Swift 구조체 심화 과정

– 효율적이고 안전한 코드 작성을 위한 Struct 설계 전략

Swift는 다른 언어보다 구조체(Struct) 를 훨씬 적극적으로 사용하는 언어입니다.

이 심화 과정에서는 단순한 데이터 묶음을 넘어서,

구조체를 활용한 최적의 설계 방법과 고급 기능을 배워보겠습니다.


Swift 구조체 심화 과정
Swift 구조체 심화 과정




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)
불변성과 데이터 무결성 (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)
    }
}

  • 외부에서는 읽기만 가능

  • 변경은 반드시 메서드를 통해서만!



mutating 활용 최적화
 mutating 활용 최적화




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)과 구조체
프로토콜 지향 프로그래밍(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)으로 기능 추가하기
확장(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 구조체입니다.





✏️ 심화 실습 과제

  1. Todo 리스트 앱용 데이터 모델

    • 구조체로 Todo 항목 설계

    • Codable + Equatable 채택

    • Extension으로 완료 처리 기능 추가

  2. Protocol + Struct 조합으로 게임 캐릭터 설계

    • Playable 프로토콜 정의

    • 다양한 캐릭터 구조체 구현

  3. JSON 데이터 파싱

    • API 응답을 Codable 구조체로 처리해보기




🎯 마무리하며


Swift의 구조체는 단순히 “클래스보다 가벼운 타입”이 아닙니다.

안정성(Safety), 성능(Performance), 그리고

프로토콜 지향 설계의 중심에 있는 강력한 도구입니다.


오늘 배운 핵심 포인트

  • 값 타입의 철학 이해

  • 불변성 기반 설계

  • 프로토콜 지향 프로그래밍(POP) 실천

  • 확장성과 유지보수를 고려한 Extension 활용

  • Codable, Equatable 등의 프로토콜 적극 활용


댓글 쓰기