본문 바로가기
정보

클래스와 구조체가 섞여 있을 때...

by 밤새는 탐험가89 2024. 12. 13.
728x90
SMALL

https://explorer89.tistory.com/30

 

구조체와 클래스의 차이

값 타입과 참조 타입 값 타입과 참조 타입의 가장 큰 차이점은 값 타입 경우, 전달될 값이 복사 참조 타입 경우, 전달될 값이 복사되는게 아니라, 참조(주소)가 전달 값 타입과 참조 타입 차이 //

explorer89.tistory.com

 

 

클래스와 구조체가 섞여 있을 때, 내부에 무엇이 포함되어 있는지에 따라 메모리 관리 및 동작 방식이 달라질 수 있습니다.

 

1. 클래스 내부에 구조체가 있는 경우

클래스 내부에 구조체가 포함되면, 해당 구조체는 값 타입(value type)으로 동작합니다.
즉, 클래스의 객체를 복사하더라도 구조체는 독립적으로 복사됩니다.

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

class Shape {
    var origin: Point
    init(origin: Point) {
        self.origin = origin
    }
}

let point1 = Point(x: 0, y: 0)
let shape1 = Shape(origin: point1)
let shape2 = shape1 // 클래스는 참조 타입이므로 shape1과 shape2는 같은 객체를 참조

shape2.origin.x = 10 // shape2의 구조체 값을 변경
print(shape1.origin.x) // 10 (참조된 객체의 값이 변경)

 

  1. 클래스는 참조 타입(reference type)입니다.
    • shape1과 shape2는 같은 객체를 참조합니다.
  2. 클래스 내부에 있는 구조체는 값 타입(value type)입니다.
    • 하지만, 클래스가 참조로 전달되기 때문에 내부 구조체의 값은 동일한 참조를 통해 공유됩니다.

클래스 내부에 있는 구조체는 클래스 객체의 일부로서 관리됩니다.
구조체 자체는 여전히 값 타입이지만, 클래스 객체의 참조를 통해 접근되기 때문에 변경이 전체에 영향을 미칩니다.

 

 

2. 구조체 내부에 클래스가 있는 경우

구조체 내부에 클래스가 포함되면, 클래스는 여전히 참조 타입(reference type)으로 동작합니다.
즉, 구조체가 복사될 때, 클래스는 복사되지 않고 같은 객체를 참조합니다.

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

struct Shape {
    var origin: Point
}

let point1 = Point(x: 0, y: 0)
var shape1 = Shape(origin: point1)
var shape2 = shape1 // 구조체는 값 타입이므로 shape1과 shape2는 독립적인 복사본

shape2.origin.x = 10 // shape2 내부 클래스의 값을 변경
print(shape1.origin.x) // 10 (참조된 객체의 값이 변경)

 

  1. 클래스는 참조 타입(reference type)입니다.
    • shape1과 shape2는 같은 객체를 참조합니다.
  2. 클래스 내부에 있는 구조체는 값 타입(value type)입니다.
    • 하지만, 클래스가 참조로 전달되기 때문에 내부 구조체의 값은 동일한 참조를 통해 공유됩니다.

 

결론

  1. 값 타입과 참조 타입의 기본 특성:
    • 구조체는 값 타입으로 복사 시 독립된 인스턴스를 생성합니다.
    • 클래스는 참조 타입으로 복사 시 동일한 객체를 공유합니다.
  2. 내부에 포함된 타입의 동작:
    • 클래스 내부에 구조체가 있을 경우:
      • 구조체는 값 타입으로 복사되지만, 클래스가 참조 타입이므로 구조체를 포함한 클래스 전체가 참조됩니다.
    • 구조체 내부에 클래스가 있을 경우:
      • 구조체는 값 타입으로 복사되지만, 내부 클래스는 참조 타입이므로 동일한 객체를 공유합니다.

결국, 값 타입과 참조 타입의 기본 특성이 섞여 있는 상황에서 그대로 작동할 뿐입니다.

 

클래스 내부에 구조체

  • 초점: 클래스 자체는 참조 타입이라서 "구조체도 클래스와 함께 공유된다"는 동작.
  • 구조체가 값 타입이라는 점은 그대로 유지되지만, 클래스 참조의 특성으로 인해 구조체가 공유되는 것처럼 보인다는 점에 주목.

구조체 내부에 클래스

  • 초점: 구조체가 복사되더라도 내부 클래스가 참조 타입이라서 "같은 객체를 공유한다"는 동작.
  • 구조체가 독립적으로 복사된다는 점은 그대로 유지되지만, 내부 클래스가 참조를 공유한다는 점에 주목
728x90
LIST