[Swift Apple ] Swift 구조체 고급 사용법

Swift의 구조체는 단순한 데이터 저장소가 아니라, 연산 프로퍼티, 메서드, mutating 키워드, 이니셜라이저, 프로토콜 채택 등 다양한 기능을 지원합니다.



Swift 구조체 고급 사용법
Swift 구조체 고급 사용법



🚀 Swift 구조체 고급 사용법

– 실전에서 바로 쓰는 Struct의 강력한 기능들!



1️⃣ 연산 프로퍼티 (Computed Properties)


구조체 안에서는 단순히 값을 저장하는 것뿐만 아니라,

계산된 값을 반환하는 프로퍼티도 만들 수 있어요.


예제: 직사각형의 넓이 자동 계산

struct Rectangle {
    var width: Int
    var height: Int

    var area: Int {
        return width * height
    }
}

let rect = Rectangle(width: 5, height: 4)
print("넓이: \(rect.area)")   // 넓이: 20

  • area는 저장되지 않고 계산해서 반환되는 프로퍼티입니다.



연산 프로퍼티 (Computed Properties)
연산 프로퍼티 (Computed Properties)




2️⃣ 메서드(Method)와 mutating

구조체는 값 타입이라 기본적으로 내부 속성을 변경할 수 없어요.

하지만 mutating 키워드를 사용하면 자신의 속성을 수정할 수 있습니다.


예제: 좌표 이동하기

struct Point {
    var x: Int
    var y: Int

    mutating func moveBy(dx: Int, dy: Int) {
        x += dx
        y += dy
    }
}

var point = Point(x: 0, y: 0)
point.moveBy(dx: 5, dy: 3)
print(point)  // Point(x: 5, y: 3)

  • 메서드에서 값을 변경하려면 꼭 mutating을 붙여야 해요!


메서드(Method)와 mutating
 메서드(Method)와 mutating




3️⃣ 사용자 정의 이니셜라이저 (Custom Initializer)


Swift 구조체는 기본적으로 자동 생성자(init)를 제공하지만,

특정 조건이나 초기값 설정이 필요할 때 직접 초기화 메서드를 정의할 수 있습니다.


예제: 기본값 설정

struct User {
    var name: String
    var age: Int

    init(name: String) {
        self.name = name
        self.age = 20  // 기본 나이 설정
    }
}

let user = User(name: "지우")
print(user)  // User(name: "지우", age: 20)


사용자 정의 이니셜라이저 (Custom Initializer)
사용자 정의 이니셜라이저 (Custom Initializer)





4️⃣ 프로토콜(Protocol) 채택


구조체도 클래스처럼 프로토콜을 채택해서 특정 기능을 표준화할 수 있어요.


예제: CustomStringConvertible 채택

struct Book: CustomStringConvertible {
    var title: String
    var author: String

    var description: String {
        return "책 제목: \(title), 저자: \(author)"
    }
}

let book = Book(title: "Swift 배우기", author: "홍길동")
print(book)   // 책 제목: Swift 배우기, 저자: 홍길동

  • 프로토콜을 통해 일관된 기능 제공 가능!



프로토콜(Protocol) 채택
프로토콜(Protocol) 채택





5️⃣ 구조체 안에 구조체 (Nested Struct)


구조체 안에 또 다른 구조체를 정의할 수 있어요.

복잡한 데이터를 계층적으로 표현할 때 유용합니다.


예제: 주소 포함 사용자 정보

struct User {
    var name: String

    struct Address {
        var city: String
        var street: String
    }

    var address: Address
}

let home = User.Address(city: "서울", street: "강남대로")
let user = User(name: "민준", address: home)
print(user.address.city)  // 서울


구조체 안에 구조체 (Nested Struct)
구조체 안에 구조체 (Nested Struct)



6️⃣ 불변성과 안전성 (Immutability & Safety)


구조체는 let으로 선언하면 내부 속성도 변경할 수 없어요.

struct Counter {
    var count = 0

    mutating func increment() {
        count += 1
    }
}

let counter = Counter()
// counter.increment()  ❌ 오류 발생 (let으로 선언해서 불변)

  • 구조체는 값 타입이기 때문에 데이터 보호에 유리합니다.





✏️ 실습 아이디어

  1. 계좌(Account) 구조체 만들기

    • 잔액, 계좌번호

    • mutating 메서드로 입출금 기능 구현

    • 잔액을 연산 프로퍼티로 안전하게 출력

  2. 영화(Movie) 구조체

    • 제목, 상영시간

    • description 프로토콜 채택하여 정보 출력

  3. 위치(Location) 구조체

    • x, y 좌표 + 이동 메서드

    • 구조체 안에 이동 기록(Log) 구조체 포함



🎯 마무리하며


Swift의 구조체(Struct) 는 단순한 데이터 저장소가 아닙니다.

클래스 못지않게 다양한 기능을 제공하면서,

안전하고 가벼운 설계를 가능하게 해주는 강력한 도구에요!


오늘 배운 고급 기능 정리

  • 연산 프로퍼티 (계산된 값 반환)

  • mutating 메서드로 값 변경

  • 사용자 정의 초기화

  • 프로토콜 채택

  • 중첩 구조체

  • 불변성으로 안전한 데이터 관리

댓글 쓰기