Swift의 구조체는 단순한 데이터 저장소가 아니라, 연산 프로퍼티, 메서드, mutating 키워드, 이니셜라이저, 프로토콜 채택 등 다양한 기능을 지원합니다.
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) |
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 |
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) |
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) 채택 |
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) |
6️⃣ 불변성과 안전성 (Immutability & Safety)
구조체는 let으로 선언하면 내부 속성도 변경할 수 없어요.
struct Counter {
var count = 0
mutating func increment() {
count += 1
}
}
let counter = Counter()
// counter.increment() ❌ 오류 발생 (let으로 선언해서 불변)
-
구조체는 값 타입이기 때문에 데이터 보호에 유리합니다.
✏️ 실습 아이디어
-
계좌(Account) 구조체 만들기
-
잔액, 계좌번호
-
mutating 메서드로 입출금 기능 구현
-
잔액을 연산 프로퍼티로 안전하게 출력
-
-
영화(Movie) 구조체
-
제목, 상영시간
-
description 프로토콜 채택하여 정보 출력
-
-
위치(Location) 구조체
-
x, y 좌표 + 이동 메서드
-
구조체 안에 이동 기록(Log) 구조체 포함
-
🎯 마무리하며
Swift의 구조체(Struct) 는 단순한 데이터 저장소가 아닙니다.
클래스 못지않게 다양한 기능을 제공하면서,
더 안전하고 가벼운 설계를 가능하게 해주는 강력한 도구에요!
오늘 배운 고급 기능 정리
-
연산 프로퍼티 (계산된 값 반환)
-
mutating 메서드로 값 변경
-
사용자 정의 초기화
-
프로토콜 채택
-
중첩 구조체
-
불변성으로 안전한 데이터 관리
댓글 쓰기