Apple/Swift

[iOS/Swift] 값 형식(Value Types), 참조 형식(Reference Types) 이란?

59date 2024. 7. 31. 21:06

Swift에서 값 형식으로 분류되는 것은 구조체, 열거형, 튜플이 있고

참조 형식으로는 클래스와 클로저가 있습니다.

 

값 형식은 값을 저장하거나 전달할 때 새로운 복사본을 만들고

참조 형식은 복사본 없이 참조만 전달하게 됩니다.

 

이론만 보면 어려우니 각 형식의 대표적인 문법 구조체와 클래스로 코드를 확인해 보자면

 

값 형식(Value Type)

struct Point {
    var x: Int
    var y: Int
}

var point1 = Point(x: 10, y: 20)
var point2 = point1 // point1을 복사하여 point2 생성
point2.x = 30 // point2의 x 값 수정
print("point1: \(point1.x), point2: \(point2.x)") // 출력: point1: 10, point2: 30

point1을 point2에 할당합니다. 이때 point1의 값이 point2에 복사 됩니다. 여기서 중요한 점은 point2는 point1의 독립적인 복사본이 된다는 것입니다.

 

point2의 값을 30으로 변경해도 point1의 값은 그대로 10을 유지하게 됩니다. 이는 값 형식의 특성으로 각 인스턴스가 독립적으로 존재하기 때문에 point2의 값을 변경해도 point1에 영향을 미치지 않는 것입니다.

 

 

참조 형식(Reference Types) 

class Point {
    var x: Int
    var y: Int
    
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

var point1 = Point(x: 10, y: 20) // Point 클래스의 인스턴스 point1 생성
var point2 = point1 // point1을 point2에 할당 (같은 인스턴스를 참조)

point2.x = 30 // point2의 x 값 수정
print("point1: \(point1.x), point2: \(point2.x)") // 출력: point1: 30, point2: 30

point2는 point2과 동일한 인스턴스를 참조하게 됩니다. 중요한 점은 point2가 point1의 복사본이 아니라, 동일한 메모리 위치를 가르키는 참조라는 것입니다.

 

point2의 x값을 30으로 변경합니다. 이때 point2는 point1과 동일한 인스턴스를 참조하고 있으므로, point1의 x값도 30으로 변경됩니다. 이는 참조 형식의 특성으로 하나의 인스턴스를 여러 변수가 참조할 수 있기 때문에 point1의 값도 point2와 동일한 값을 가지는 것입니다.

 

 

정리하자면

 

값 형식의 경우 인스턴스를 다른 변수에 할당하거나 함수에 전달할 때 값이 복사됩니다. 따라서 원본 값에 대한 변경이 복사본에 영향을 미치지 않습니다. 추가적으로 각 인스턴스가 독립적으로 존재합니다.

 

참조 형식의 경우 인스턴스를 다른 변수에 할당하면 참조가 복사됩니다. 이로 인해 원본 객체와 복사 된 참조가 동일한 객체를 가리키므로, 한 쪽에서의 변경이 다른 쪽에 영향을 미칩니다. 추가적으로 여러 변수가 동일한 인스턴스를 참조할 수 있기 때문에 한 변수가 객체를 변경하면 모든 참조가 변경 된 내용을 반영하게 됩니다.

 


 

잘못된 내용 혹은 오타가 있거나 더 좋은 내용 피드백은 언제나 환영입니다 :)