본문 바로가기

Mobile/iOS

[Swift] 값 타입과 참조 타입 (Value and Reference Types)

반응형


1. Value Type & Reference Type

스위프트의 타입은 두 가지 종류로 생각할 수 있습니다. 첫 번째는  값 타입(Value Type) 입니다. 값 타입은 각 인스턴스들이 복사한 값을 갖는 타입입니다. 두 번째는  참조 타입(Reference Type)  입니다. 참조 타입은 인스턴스들이 하나의 주소를 공유하는 타입입니다.

그렇다면 스위프트의 타입들은 어디에 속할까요? 구조체(Struct), 열거형(Enum), 튜플(Tuple)값 타입에 속하는 타입들입니다. 클래스(Class) 타입은 참조 타입입니다. 이것은 비슷한 기능을 하는 구조체, 열거형과 클래스의 가장 큰 차이점이라고 할 수 있습니다.

Value Type : Struct, Enum, Tuple
Reference Type : Class

이번 글에서는 값 타입과 참조 타입의 차이점을 알고, 언제 사용할지에 대해 고민해보도록 하겠습니다.


2.  Difference

값 타입과 참조 타입은 무엇이 다를까요?

이전에 언급한 대로 값 타입은 값을 "복사"하는 타입입니다. 즉, 같은 구조체를 사용하더라도 각각의 인스턴스는 다른 주소값을 갖기 때문에 서로가 영향을 주지 않습니다.

아래 예시를 보겠습니다. 인스턴스 a는 구조체 S를 생성하고, 인스턴스 b는 그런 a를 복사했습니다. 이때, a의 data값을 변경하더라도 b의 data값은 변경되지 않습니다. 그 이유는 a와 b는 서로 다른 주소값을 갖는 독립적인 인스턴스이기 때문입니다.

// Value type example
struct S { var data: Int = -1 }
var a = S()
var b = a                       // a is copied to b
a.data = 42                     // Changes a, not b
println("\(a.data), \(b.data)") // prints "42, -1"

반면 참조 타입은 "주소"를 공유하는 타입입니다. 인스턴스 x는 클래스 C를 생성합니다. 그리고 그런 x를 인스턴스 y에 할당합니다. 이때 y는 x와 데이터의 주소를 공유합니다. 즉, x가 업데이트되면 y도 업데이트 된다는 의미입니다.

// Reference type example
class C { var data: Int = -1 }
var x = C()
var y = x                       // x is copied to y
x.data = 42                     // changes the instance referred to by x (and y)
println("\(x.data), \(y.data)") // prints "42, 42"


3.  선택

중요한 것은 언제 어떤 타입을 쓸거냐? 입니다. Cocoa의 subclass들은 NSObject로 구성되어 있기 때문에 Cocoa로 작업할 때는 class를 사용해야 합니다.하지만 다른 경우에는 두 타입을 비교해서 선택해야합니다.

1. 값 타입을 사용해야 하는 경우

  • 인스턴스를 등호로 == 비교해야 하는 경우( == : stack 영역을 비교)
  • 독립적인 상태의 인스턴스를 만들고 싶은 경우
  • 다중 스레드에서 사용될 경우

2. 참조 타입을 사용해야 하는 경우

  • 인스턴스를 참조 등호 ===로 비교해야 하는 경우 ( === : heap 영역을 비교)
  • 공유되고 변경 가능한 상태를 만들고 싶은 경우

스위프트에서 Array, String, Dictionary는 모두 값 타입입니다. 값 타입이기 때문에 복사할 때, 별도의 다른 동작 없이 쉽게 복사할 수 있습니다. 따라서 다른 곳에서 복사된 값을 변경하더라도 원래의 값들은 변경이 없기 때문에 스위프트가 지향하는 예측 가능한 코드를 쉽게 작성할 수 있습니다.


참고

 

Value and Reference Types - Swift Blog

Get the latest news and helpful tips on the Swift programming language from the engineers who created it.

developer.apple.com


 

반응형