[swift] Swift 구조체에서 사용되는 값과 참조의 비교 방법에 대해 설명해주세요.

Swift에서는 값 형식과 참조 형식이 있습니다. 구조체(Struct)는 값 형식이며, 클래스(Class)는 참조 형식입니다. 이 두 가지 형식 간에는 중요한 차이가 있습니다.

값 형식 (Value Types)

값 형식은 변수나 상수에 할당될 때 그 값이 복사됩니다. 이는 여러 변수나 상수가 같은 값을 가지고 있어도 서로 독립적으로 동작한다는 것을 의미합니다. 예를 들어, 구조체 인스턴스를 한 변수에 할당한 후 다른 변수에 할당하더라도 두 변수는 각각의 독립적인 값으로 관리됩니다.

struct Person {
    var name: String
}

var person1 = Person(name: "Alice")
var person2 = person1
person2.name = "Bob"

print(person1.name)  // 출력 결과: "Alice"
print(person2.name)  // 출력 결과: "Bob"

위의 예제에서 person1person2에 할당한 후에 person2name 속성을 변경했지만, person1name은 변경되지 않았습니다. 이는 값 형식인 구조체가 복사되어 각각 독립적으로 관리되고 있음을 보여줍니다.

참조 형식 (Reference Types)

참조 형식은 변수나 상수에 할당될 때 값의 참조만 복사됩니다. 이는 여러 변수나 상수가 같은 인스턴스를 가리키기 때문에 한 곳에서의 변경이 다른 곳에도 영향을 미친다는 것을 의미합니다. 클래스는 참조 형식이며, 인스턴스는 힙(Heap) 메모리에 저장되고 해당 인스턴스를 참조하는 변수나 상수는 스택(Stack) 메모리에 저장됩니다.

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var person1 = Person(name: "Alice")
var person2 = person1
person2.name = "Bob"

print(person1.name)  // 출력 결과: "Bob"
print(person2.name)  // 출력 결과: "Bob"

위의 예제에서 person1person2에 할당한 후에 person2name 속성을 변경하면 person1name 값도 변경되었습니다. 이는 참조 형식인 클래스 인스턴스를 가리키고 있기 때문에 발생하는 현상입니다.

결론

Swift에서 값 형식과 참조 형식은 변수나 상수에 할당될 때의 동작 방식에 있어서 중요한 차이를 보입니다. 값 형식은 복사되어 각각 독립적으로 동작하고 참조 형식은 동일한 인스턴스를 가리키므로 함께 변경된다는 점을 이해하고 적절하게 활용하는 것이 중요합니다.


참고 문헌: