정의
- 구조체는 인스턴스의 값(프로퍼티)을 저장하거나 기능(메서드)을 제공하고,
이를 캡슐화할 수 있는 스위프트가 제공하는 타입입니다.
- 구조체 안의 변수를 프로퍼티라고 합니다.
- 구조체 안의 함수를 메서드라고 합니다.
- Swift에서는 대부분의 타입이 구조체로 이루어져 있습니다.
- 구조체는 값 타입입니다.
정의 형식
struct 이름 {
// 구현 코드
}
구조체 예제
구조체 생성
- 간단한 예제를 통해 알아보겠습니다.
- 특정 타입 안에 들어있는 인스턴스 변수를 프로퍼티, 구조체 안에 있는 함수를 메서드라고 칭합니다.
- 가변 프로퍼티는 변수 선언 후에도 값을 변경할 수 있는 (인스턴스) 프로퍼티입니다.
- 불변 프로퍼티는 값을 변경할 수 없는 (인스턴스) 프로퍼티입니다.
- static 키워드를 사용하면 해당 타입에서 사용할 수 있는 타입 프로퍼티가 됩니다.
struct Sample {
var mutableProperty: Int = 100 // 가변 프로퍼티
let immutableProperty: Int = 100 // 불변 프로퍼티
static var typeProperty: Int = 100 // 타입 프로퍼티
// 인스턴스 메서드
func instanceMethod() {
print("instance method")
}
// 타입 메서드
static func typeMethod() {
print("type method")
}
}
구조체 사용
- 다음은 구조체의 사용입니다.
- 위의 예제와 연결되는 내용입니다.
가변 인스턴스
- Sample이라는 이름으로 생성한 구조체가 mutable 변수의 타입으로 사용되었습니다.
- mutable 변수와 mutableProperty는 가변 프로퍼티이기 때문에,
다음과 같이 값을 변경시켜도 오류가 발생하지 않습니다.
var mutable: Sample = Sample()
mutable.mutableProperty = 200
불변 인스턴스
- Sample이라는 이름으로 생성한 구조체가 immutable 상수의 타입으로 사용되었습니다.
- let으로 선언한 불변 인스턴스는 값을 변경시킬 수 없습니다.
let immutable: Sample = Sample()
immutable.immutableProperty = 200
타입 프로퍼티
- 타입 프로퍼티는 Sample이라는 구조체 타입 자체가 사용할 수 있는 프로퍼티입니다.
Sample.typeProperty = 300
Sample.typeMethod()
구조체 예제 2
- name, species라는 변수와 타입 메서드, 인스턴스 메서드를 가진 Zoo 구조체를 만들었습니다.
- 1번 코드를 보시면, Zoo라는 구조체가 타입 자체적으로 타입 메서드를 구현하여 "동물원입니다."가 출력됩니다.
- 2번 코드를 보시면, 인스턴스를 만든 후, introduce 인스턴스 메서드를 구현하여
"저는 \(self.species) 동물 \(name)입니다." 코드가 출력됩니다.
- 3번 코드를 보시면, 불변 인스턴스를 사용하여 메서드를 호출하여 Zoo에 입력된 코드를 출력했습니다.
struct Zoo {
var name: String = "캥거루"
var species: String = "포유류"
static func introduce() {
print("동물원입니다.")
}
func introduce() {
print("저는 \(self.species) 동물 \(name)입니다.")
}
}
// 1
Zoo.introduce()
// 2
var tiger: Zoo = Zoo()
tiger.name = "호랑이"
tiger.species = "고양이과"
tiger.introduce()
// 3
let kangaroo: Zoo = Zoo()
kangaroo.introduce()
실행결과
// 동물원입니다.
// 저는 고양이과 동물 호랑이입니다.
// 저는 포유류 동물 캥거루입니다.
내용출처
https://www.youtube.com/watch?v=0ZF5lhpEcC8&list=PLz8NH7YHUj_ZmlgcSETF51Z9GSSU6Uioy&index=13
'iOS > Swift 문법 심화 학습' 카테고리의 다른 글
열거형 [ enum ] (0) | 2022.02.03 |
---|---|
클래스 [ Class ] (0) | 2022.02.03 |
클로저 고급 (0) | 2022.02.02 |
클로저 (0) | 2022.02.01 |
값 타입과 참조 타입 (0) | 2022.01.31 |
댓글