보초의 코딩일기장

[Swift 입문] 클래스 vs 구조체/열거형 본문

낙서장/edwith : swift 입문

[Swift 입문] 클래스 vs 구조체/열거형

장보비 2018. 7. 17. 13:15

클래스는 참조타입, 열거형과 구조체는 값 타입

클래스는 상속이 가능하지만 열거형과 구조체는 상속이 불가능하다


값타입 (Value Type): 데이터를 전달 할 때 값을 복사하여 전달한다.

참조타입(Reference Type): 데이터를 전달 할 때 값의 메모리 위치를 전달한다. (포인터 ?)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import Swift
 
struct ValueType{
    var property = 1
}
 
class ReferenceType {
    var property = 1
}
 
let firstStructInstance = ValueType()
var secondStructInstance = firstStructInstance
 
secondStructInstance.property = 2
 
 
print("first struct instance property : \(firstStructInstance.property)")    // 1
print("second struct instance property : \(secondStructInstance.property)")  // 2
 
//두번째 구조체 인스턴스는 첫번째 구조체를 그대로 복사한 형태이다
//두 개는 별도의 인스턴스이므로 서로 영향을 주지 않는다
 
let firstClassReference = ReferenceType()
let secondClassReference = firstClassReference
 
secondClassReference.property = 2
 
print("first class reference property : \(firstClassReference.property)")    // 2
print("second class reference property : \(secondClassReference.property)")  // 2
 
//두번째 클래스 참조는 첫번째 클래스 인스턴스를 참조하기 때문에 값을 변경하게 되면 같이 변경된다.
 
cs


예제)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import Swift
 
struct SomeStruct{ //값을 그대로 복사하는 struct
    var someProperty: String = "Property"
}
var someStructInstance: SomeStruct = SomeStruct()
 
func someFunction(structInstance: SomeStruct){
    var localVar: SomeStruct = structInstance
    localVar.someProperty = "ABC"
}
 
someFunction(someStructInstance)
print(SomeStructInstance.someProperty) //?
cs


내가 이해한 바로는 someStructInstance 값이 복사되어 localVar 라는 구조체가 만들어진다.

someStructInstance 는 struct 이므로 변수 값만 복사되어 주었기 때문에 localVar 의 변수를 바꾸어 주더라도 someStructInstance 값의 변화는 없다.

즉 print 값은 Property


1
2
3
4
5
6
7
8
9
10
11
12
13
14
import Swift
 
class someClass{ //포인터와 비슷한 개념. 참조 타입
    var someProperty: String = "Property"
}
var someClassInstance: someClass = someClass()
 
func someFunction(structInstance: someClass){
    var localVar: SomeStruct = structInstance
    localVar.someProperty = "ABC"
}
 
someFunction(someStructInstance)
print(someClassInstance.someProperty) //?
cs


Class  는 참조타입이므로 같은 메모리의 공유라고 생각하면 되지 않을까

이름만 다를 뿐 같은 영역을 쓰고 있다고 생각하기 때문에 localVar.someProperty ="ABC"로 바꾼다면 SomeClassInstance 값도 바뀔 것이다.

즉 print 값은 "ABC"

Buy me a coffeeBuy me a coffee
Comments