안녕하세요! 오늘은 스위프트의 값 타입과 참조 타입에 대해서 알아보겠습니다.
일단 값 타입, 참조 타입이 무엇을 의미하는지 먼저 알아야겠죠?
먼저 값 타입의 눈에 띄는 특징을 보겠습니다.
그렇다면 스택에 저장된다는 것은 무엇을 의미할까요? 이 부분은 아주 중요하므로 개별적으로 다음 포스팅에서 다루도록 하겠습니다.
오늘은 값 타입이 실제 코드에서는 어떻게 동작하는지에 대해서 좀 더 자세히 알아보도록 할게요.
값 타입의 대표적인 예시는 Struct(구조체)와 Enum(열거형)이 있습니다.
보통 상속이 필요 없는 상황이나 원본을 건드리지 않고 저장 프로퍼티 등을 바꿔야 할 때 사용해 주면 좋겠지요.
복사본을 변경하더라도 원본이 변하지 않는 다는 것은 어떤 의미일까요? 실험을 통해 알아보겠습니다.
여러분도 플레이그라운드를 열어서 같이 실험해 보세요.
struct MyStruct {
var property = "original"
}
이렇게 실험을 위한 구조체를 하나 만들어 주었습니다.
이제 이 구조체의 인스턴스를 하나 만들어주겠습니다. 그리고 그 인스턴스를 복사한 두 번째 인스턴스도 만들어 주었습니다.
struct MyStruct {
var property = "original"
}
var instance1 = MyStruct() // MyStruct의 인스턴스인 instance1
var instance2 = instance1 // instance1을 복사한 instance2
자 그럼 이제 우리가 궁금했던 실험을 할 차례입니다. 바로 복사본인 Instance2를 어떻게 바꾸든지 instance1이 영향을 받는지 안받는지를 보는거죠!
struct MyStruct {
var property = "original"
}
var instance1 = MyStruct() // MyStruct의 인스턴스인 instance1
var instance2 = instance1 // instance1을 복사한 instance2
instance2.property = "newValue"
print(instance1.property) //"original"
print(instance2.property) //"newValue"
와우! 놀랍습니다. 복사본인 Instance2의 저장 프로퍼티의 값을 바꿔주었음에도 instance1의 저장프로퍼티는 영향을 받지 않네요.
이런 특성은 값 타입에서 나타나는 대표적인 특성입니다.
참조 타입은 대표적으로 Class가 있습니다. 참조 타입의 특징을 보겠습니다.
포인터만 할당이 된 다는 것은 새로 인스턴스를 만들더라도 새로운 인스턴스가 참조할 값의 위치만을 알려주어서 결국 원본을 바라보도록 한다는 것으로 이해했어요.
아주 간단하게 한번 2번을 실험해볼까요? 위에서 값 타입 실험을 마쳤다면
struct만 class로 한번 바꿔보세요. 이름이 좀 헷갈릴 수는 있겠지만 말이예요.
여러분이 헷갈리실 수 있으니 저는 이름을 MyClass로 바꿔주겠습니다.
class MyClass {
var property = "original"
}
var instance1 = MyClass() // MyStruct의 인스턴스인 instance1
var instance2 = instance1 // instance1을 복사한 instance2
instance2.property = "newValue"
print(instance1.property) //"newValue"
print(instance2.property) //"newValue"
복사본의 저장프로퍼티의 값을 바꿔주니 원본의 값도 바뀐 것을 확인하실 수 있으실거예요.
이렇게 간단하게 값 타입과 참조 타입의 차이점, 그리고 간단한 작동원리를 알아 보았습니다.
사실 오늘은 결과에 대해서만 다루었기 때문에 다음 포스팅에서는 왜 이런 특성을 가지게 되는지
스택과 힙을 살펴보면서 자세히 알아보도록 하겠습니다!
잘못된 부분이 있다면 알려주시고 혹시 더 알고싶은 부분이나 요청하고 싶은 포스팅이 있다면
댓글로 남겨주세요!
감사합니다.
[iOS/Swift] Protocol 프로토콜을 재미있게 이해해보자 (2) | 2022.02.19 |
---|---|
[iOS/Swift] 스택(Stack)과 스택 오버플로우란? 예제로 알아보기 (0) | 2022.02.16 |
[iOS/Swift] Navigation Bar에 Search Bar 예쁘게 넣는 법 (2) | 2022.02.11 |
[iOS/Swift] Singleton 패턴 사용의 이유와 사용 방법 (0) | 2022.02.08 |
[iOS/Swift] UINavigationController 와 UITabBarController 동시에 쓰는 방법 - Swift (7) | 2022.02.05 |