스위프트의 구조체와 열거형
스위프트의 구조체와 열거형
스위프트의 구조체는 struct 키워드를 사용한다 클래스와 매우 비슷한 구조를 가진다 두개의 차이점은 값 타입과 참조 타입이라는 것이 다르다 구조체는 값 타입, 클래스는 참조 타입이다 구조체는 인스턴스가 복사되거나 메서드에 전달될 때 인스턴스의 실제 복사본이 생성되면서 원본객체가 가지고 있던 모든 데이터를 그대로 복사해서 갖게 된다 원본 구조체 인스턴스와 별개인 자신만의 데이터를 가진다
이와 반대로 클래스는 인스턴스가 복사되거나 인자로 전달되면 해당 클래스 인스턴스가 있는 메모리의 위치에 대한 참조체가 만들어지거나 전달된다 참조체를 변경하면 원본 인스턴스에도 동일한 작업이 수행된다
값 타입 vs 참조 타입
1
2
3
4
5
6
7
8
9
10
11
12
13
struct SampleStruct {
var name: String
init(name: String) {
self.name = name
}
func buildHelloMsg() -> String {
"Hello" + name
}
}
let myStruct1 = SampleStruct(name: "Mark")
print(myStruct1.name) //: Mark
let a: String = myStruct1.buildHelloMsg()
print(a) //: HelloMark
여기서 myStruct1 인스턴스의 복사본을 만들고 name 프로퍼티를 변경후 출력해본다
1
2
3
4
5
let myStruct1 = SampleStruct(name: "Mark")
var myStruct2 = myStruct1
myStruct2 .name = "David"
print(myStruct1.name) //: Mark
print(myStruct2.name) //: David
구조체는 값 타입으로 자신만의 데이터를 갖게 되므로 데이터가 변경되었다
클래스인 경우 비교
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class SampleClass {
var name: String
init(name: String) {
self.name = name
}
func buildHelloMsg() {
"Hello" + name
}
}
let myClass1 = SampleClass(name: "Mark")
var myClass2 = myClass1
myClass2.name = "David"
print(myClass1.name) //: David
print(myClass2.name) //: David
name 프로퍼티를 변경한 결과 myClass1 인스턴스도 변경되었다 참조 타입이기 때문이다
열거형
열거형은 미리 정의된 값 집합으로 구성된 사용자 지정 데이터이다 일반적으로 switch 문을 사용할 때와 같이 코드 내에서 결정을 내릴때 사용한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
enum Temperature {
case hot
case warm
case cold(centigrade: Int)
}
func displayTemp(temp: Temperature) {
switch temp {
case .hot:
print("hot")
case .warm:
print("warm")
case .cold(let centigrade) where centigrade <= 0:
print("cold \(centigrade) degrees")
case .cold:
print("cold")
}
}
displayTemp(temp: Temperature.warm) //: wram
displayTemp(temp: Temperature.cold(centigrade: -23)) //: cold -23 degrees
This post is licensed under CC BY 4.0 by the author.