상세 컨텐츠

본문 제목

[Swift] 스위프트의 값 타입과 참조 타입 (코드로 실험하기)

Swift

by Mr.Garlic 2022. 2. 15. 01:20

본문

Swift에서의 값 타입과 참조 타입, 무엇이 다를까?

안녕하세요! 오늘은 스위프트의 값 타입과 참조 타입에 대해서 알아보겠습니다.

일단 값 타입, 참조 타입이 무엇을 의미하는지 먼저 알아야겠죠?

 

값 타입이란?

먼저 값 타입의 눈에 띄는 특징을 보겠습니다.

  1. 변수를 할당하면 스택에 값이 쌓인다
  2. 복사본을 변경하더라도 원본이 영향을 받지 않는다. 

그렇다면 스택에 저장된다는 것은 무엇을 의미할까요? 이 부분은 아주 중요하므로 개별적으로 다음 포스팅에서 다루도록 하겠습니다. 

오늘은 값 타입이 실제 코드에서는 어떻게 동작하는지에 대해서 좀 더 자세히 알아보도록 할게요. 

 

값 타입 예시

값 타입의 대표적인 예시는 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가 있습니다. 참조 타입의 특징을 보겠습니다. 

  1. 스택에는 포인터만 할당되고, 실제 데이터는 힙에 할당된다. 
  2. 복사본과 원본이 모두 같은 값을 갖는다. 즉 복사본을 변경하더라도 원본이 영향을 받는다. 

포인터만 할당이 된 다는 것은 새로 인스턴스를 만들더라도 새로운 인스턴스가 참조할 값의 위치만을 알려주어서 결국 원본을 바라보도록 한다는 것으로 이해했어요.

 

아주 간단하게 한번 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"

 

복사본의 저장프로퍼티의 값을 바꿔주니 원본의 값도 바뀐 것을 확인하실 수 있으실거예요. 

이렇게 간단하게 값 타입과 참조 타입의 차이점, 그리고 간단한 작동원리를 알아 보았습니다.

사실 오늘은 결과에 대해서만 다루었기 때문에 다음 포스팅에서는 왜 이런 특성을 가지게 되는지

스택과 힙을 살펴보면서 자세히 알아보도록 하겠습니다! 

 

잘못된 부분이 있다면 알려주시고 혹시 더 알고싶은 부분이나 요청하고 싶은 포스팅이 있다면

댓글로 남겨주세요!

 

감사합니다. 

관련글 더보기