Swift/Swift 기본문법

Swift 기본 문법 - 11. 구조체와 클래스

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 프로퍼티를 생성할 수 있으며, 물건의 크기를 표현하고자 할때 데이터를 묶어 표현 해줄 수 있습니다.

이런 몇 가지 상황을 제외하면 클래스로 정의하여 사용합니다.

 

반응형