8.1.5 구조체의 값 전달 방식 : 복사에 의한 전달
구조체와 클래스의 결정적 차이 중 하나가 바로 값을 전달하는 방식입니다. 구조체는 인스턴스를 생성한 후 이를 변수나 상수에 할당하거나 함수의 인자값으로 전달할 때 값을 복사하여 전달하는 방식을 사용합니다. 이를 값 타입(Value Type), 또는 복사에 의한 전달이라고 합니다. 우리는 앞에서 함수의 인자값에 대해 배울 때, 스위프트에서 제공하는 정수, 문자열, 배열 또는 딕셔너리 등 기본 자료형들은 모두 복사를 통해 값이 전달된다고 배운 바 있는데, 이는 이들 자료형이 구조체로 구현되었기 때문입니다.
스위프트에서 구조체는 값 타입입니다. 아직 배우지 않은 열거형도 값 타입입니다. 이 말은 우리가 생성하는 모든 구조체 인스턴스들이 상수나 변수에 할당될 때 복사된다는 뜻입니다. 물론, 구조체로 정의된 인스턴스들이 함수의 인자값으로 사용될 때도 마찬가지입니다.
구조체 인스턴스를 변수에 대입하면 기존의 인스턴스가 그대로 대입되는 것이 아니라 이를 복사한 새로운 값이 대입됩니다. 따라서 변수에 대입된 인스턴스와 기존의 인스턴스는 서로 독립적입니다. 인스턴스를 할당한 수 기존 인스턴스나 할당된 쪽의 인스턴스에 무언가 변경이 발생하더라도 서로에게 전혀 영향을 미치지 않습니다.
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
Resolution은 구조체이므로 hd를 cinema에 대입하는 시점에서 기존 인스턴스의 복사본이 하나 더 만들어진 다음, 이 복사본이 cinema 변수에 대입됩니다. hd와 cinema는 같은 width와 height값을 가지고 있지만 값만 같을 뿐 실제로는 별개인 인스턴스가 대입되어 있습니다.
이제 cinema 변수에 할당된 인스턴스의 프로퍼티를 변경해봅시다.
cinema.width = 2048
print("cinema 인스턴스의 width 값은 \(cinema.width)입니다")
// 실행 결과
cinema 인스턴스의 width 값은 2048입니다
print("hd 인스턴스의 width 값은 \(hd.width)입니다")
// 실행 결과
hd 인스턴스의 width 값은 1920입니다
원래의 값이 바뀌지 않은 그대로입니다. cinema 인스턴스에서 발생하는 값의 변경은 hd 인스턴스에 아무런 영향을 미치지 못하고, 마찬가지로 hd 인스턴스에 변경이 발생하더라도 cinema 인스턴스에는 아무런 영향을 미치지 않습니다. 단순히 값의 변경 뿐 아니라 값이 소멸해도 마찬가지입니다. 둘은 서로 다른 길을 걷고 있는 분리된 인스턴스들이기 때문입니다.
이러한 구조체의 특성은 인스턴스를 상수에 할당할 것인지 변수에 할당할 것인지에도 영향을 미칩니다. 구조체 인스턴스가 상수에 할당되면 프로퍼티 값을 변경할 수 없습니다. 값을 변경할 수 있으려면 변수에 할당해야 합니다.
Last updated