[swift] 변수와 상수의 값 복사

Swift에서 변수와 상수는 값을 복사하는 방식으로 동작합니다. 변수와 상수 모두 값을 할당할 때, 해당 값이 복사되어 새로운 메모리 공간에 저장됩니다. 이는 값 타입(Value Type)으로 알려진 개념입니다.

변수의 값 복사

변수는 값을 할당할 때마다 그 값을 새로운 메모리 공간에 복사하여 저장합니다. 따라서 변수와 해당 값을 할당받은 변수는 서로 독립적인 값을 갖게 됩니다.

var x = 10
var y = x // x의 값이 y에 복사됩니다
x = 20 // x의 값을 변경

print(x) // 20
print(y) // 10

위의 예제에서 x 변수에 10을 할당하고, 그 값을 y 변수에 복사하였습니다. 그 후 x의 값을 20으로 변경하였지만, y의 값은 그대로 10이 유지되었습니다. 즉, xy는 독립적으로 값을 관리하고 있기 때문에 x의 변화가 y에 영향을 주지 않습니다.

상수의 값 복사

마찬가지로, 상수도 값이 할당될 때마다 메모리에 복사됩니다. 하지만 상수는 한 번 값이 할당되면 값을 변경할 수 없습니다. 따라서 상수는 단 한 번만 값을 복사하고, 그 후에는 고정된 값을 유지합니다.

let a = 5
let b = a // a의 값이 b에 복사됩니다
// a = 10 // 상수는 값을 변경할 수 없으므로 오류 발생

print(a) // 5
print(b) // 5

위의 예제에서 a 상수에 5를 할당하고, 그 값을 b 상수에 복사하였습니다. a의 값을 10으로 변경하려고 하면 오류가 발생합니다. 상수는 값을 변경할 수 없기 때문에 이러한 동작이 일어납니다.

참조 타입의 경우

변수와 상수가 참조 타입(Reference Type)인 경우에는 값이 복사되지 않고 참조하는 메모리 주소만 복사됩니다. 따라서 하나의 값을 가리키는 변수나 상수는 동일한 값을 사용하게 됩니다.

class Person {
    var age: Int
    
    init(age: Int) {
        self.age = age
    }
}

var p1 = Person(age: 20)
var p2 = p1 // p1을 참조하는 메모리 주소를 p2에 복사

p1.age = 30 // p1의 값 변경

print(p1.age) // 30
print(p2.age) // 30

위의 예제에서 Person 클래스는 참조 타입입니다. p1 변수가 Person 인스턴스를 참조하는 메모리 주소를 가지고 있고, 이 메모리 주소가 p2 변수에 복사됩니다. 따라서 p1p2는 동일한 Person 인스턴스를 참조하게 됩니다. 그래서 p1age 값을 변경하면 p2도 동일하게 변경됩니다.

결론

Swift에서 변수와 상수는 값을 복사하는 방식으로 동작합니다. 변수는 값을 할당할 때마다 새로운 메모리 공간에 복사되고, 상수는 한 번만 복사되고 값을 다시 변경할 수 없습니다. 이를 이해하고 활용하면 프로그래밍에서 변수와 상수를 올바르게 다룰 수 있습니다.