728x90
11. 구조체와 클래스
둘 모두 데이터를 용도에 맞게 묶어 표현하고자 할 때 유용하다.
구조체: 값 타입
클래스: 참조 타입
11.1 구조체
11.1.1 구조체의 정의
구조체는 struct 키워드로 정의합니다.
struct BasicInformation {
var name: String
var age: Int
}
// 구조체 인스턴스의 생성 및 초기화
// 프로퍼티 이름(name, age)으로 자동 생성된 이니셜라이저를 사용하여 구조체를 생성합니다.
var kemiInfo: BasicInformation = BasicInformation(name: "kemi", age: 99)
kemiInfo.age = 100
kemiInfo.name = "Seba"
// 프로퍼티 이름(name, age)으로 자동 생성된 이니셜라이저를 사용하여 구조체를 정의합니다.
let sebaInfo: BasicInformation = BasicInformation(name: "Seba", age: 99)
sebaInfo.age = 100 // 변경 불가 에러
sebaInfo.name = "Seba"
11.2 클래스
11.2.1 클래스 정의
클래스는 class로 정의할수있습니다.
class Person {
var height: Float = 0.0
var weight: Float = 0.0
}
var kemi: Person = Person()
let jenny: Person = Person()
jenny.height = 123.4
jenny.weight = 123.4
print(jenny.height)
11.3 클래스와 구조체의 차이
struct BasicInformation {
let name: String
var age: Int
}
var kemiInfo: BasicInformation = BasicInformation(name: "kemi", age: 99)
kemiInfo.age = 100
var friendInfo: BasicInformation = kemiInfo // 값 복사
print("kemi's age: \(kemiInfo.age)")
print("friend's age: \(friendInfo.age)")
friendInfo.age = 999
print("yagom's age: \(kemiInfo.age)") // 100 변동 없음
print("friend's age: \(friendInfo.age)") // 999
class Person {
var height: Float = 0.0
var weight: Float = 0.0
}
var kemi: Person = Person()
var friend: Person = kemi // 참조 복사
print("kemi's height: \(kemi.height)") // 0.0
print("friend's height: \(friend.height)") // 0.0
friend.height = 185.5
print("kemi's height: \(kemi.height)") // 185.5로 값이 변동된다.
print("friend's height: \(friend.height)") // 185.5
// 함수에서 구조체와 클래스
func changeBasicInfo(_ info: BasicInformation) {
var copiedInfo: BasicInformation = info
copiedInfo.age = 1
}
func changePersonInfo(_ info: Person) {
info.height = 155.3
}
// 구조체로 전달된 값은 값 복사로 함수에서 사용되기 때문에
// 기존 kemiInfo의 값의 변화는 없습니다.
changeBasicInfo(kemiInfo)
print("kemi's age: \(kemiInfo.age)")
//
changePersonInfo(kemi)
print("kemi's height: \(kemi.height)") // 155.3로 값이 변동된다.
구조체를 사용해야 할 때, 애플가이드는 다음과 같습니다.
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때
- 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
예를 들어 x,y 좌표 등을 표현하고 싶을 때 Int 타입으로 x,y 프로퍼티를 생성할 수 있으며, 물건의 크기를 표현하고자 할때 데이터를 묶어 표현 해줄 수 있습니다.
이런 몇 가지 상황을 제외하면 클래스로 정의하여 사용합니다.
반응형
'Swift > Swift 기본문법' 카테고리의 다른 글
Swift 기본 문법 - 13. 인스턴스의 생성과 소멸 (0) | 2022.02.01 |
---|---|
Swift 기본 문법 - 12. 프로퍼티와 메서드 (0) | 2022.01.30 |
Swift 기본 문법 - 10. 옵셔널 (0) | 2022.01.18 |
Swift 기본 문법 - 9. 함수 (0) | 2022.01.18 |
Swift 기본 문법 - 8. 반복문 (0) | 2022.01.17 |