# 참조 타입과 값 타입(feat. class, struct)

minin·2022년 4월 26일
0

Swift연습장

목록 보기
11/11
post-thumbnail

값 타입, 참조 타입?

class와 struct의 차이점에 대해 이야기하면서 이미 참조 타입, 값 타입의 특징에 대해 언급했지만, 다시 살펴보자.

1. Class - 참조 타입

class Shirt {
    var size: Int
    var color: String
    var brand: String
    
    init(size: Int, color: String, brand: String){
        self.size = size
        self.color = color
        self.brand = brand
    }
}

var blueShirt = Shirt(size: 66, color: "blue", brand: "8Seconds")
var favoriteShirt = blueShirt

파란색 셔츠 샀는데 너무 맘에 들어서 최애 셔츠가 되었음.
근데 사이즈가 쪼꼼 애매해서 블루셔츠의 사이즈를 바꾸기로 했음.

blueShirt.size = 77

👉 그리고 블루셔츠와 최애셔츠의 사이즈를 출력해보면,

print("blueShirt size: ", blueShirt.size)
print("favoriteShirt size: ", favoriteShirt.size)

  • 요렇게 둘 다 사이즈가 바뀌어있다.

2. Struct - 값 타입

앞과 똑같이 파란색 셔츠를 사고 맘에 들어서 최애셔츠 되었음. 그런데 사이즈를 바꾼다고 하자.

struct Shirt {
    var size: Int
    var color: String
    var brand: String
}

var blueShirt = Shirt(size: 66, color: "blue", brand: "8Seconds")
var favoriteShirt = blueShirt

blueShirt.size = 77
  • 이 곳에 init()이 없는 이유는 struct는 모든 속성에 대해 초기화해주는 Memberwise Init을 통해 자동 생성 초기화가 제공되기 때문이다.
  • 초기화 함수를 생성할 수는 있지만, 커스텀하게 작성해 줄 경우, Memberwise Init은 더이상 동작하지 않는다.

👉 이 상황에서 두 블루셔츠와 최애 셔츠의 사이즈를 출력하면,

print("blueShirt size: ", blueShirt.size)
print("favoriteShirt size: ", favoriteShirt.size)

  • 같이 값이 변경되었던 class와는 다르게, 블루셔츠의 사이즈만 바뀌고 최애 셔츠의 사이즈는 바뀌지 않았다.

두 값의 변화에 차이가 나는 이유는 class는 참조 타입, struct는 값 타입이기 때문이다.

🙋 그렇다면, 위의 예제가 내부적으로 어떻게 동작하는지 알아보자!

Class - 참조 타입 동작

  • 참조 타입의 경우에는, 위와 같이 메모리에는 주소 정보가 저장된다.
  • 최애 셔츠에 파란 셔츠를 대입했을 때에도(favoriteShirt = blueShirt), 파란 셔츠가 가리키고 있는 곳의 주소가 저장되는 것을 볼 수 있다.

  • 추후에 파란 셔츠의 사이즈 값을 바꾸었을 때, 주소를 따라가 값이 변경된다.
  • 같은 곳을 가리키고 있는 최애 셔츠의 사이즈 값 역시 변경된 것이다.

Struct - 값 타입 동작

  • 값 타입의 경우에는, 위와 같이 메모리에는 이 저장된다.
  • 최애 셔츠에 파란 셔츠를 대입하면(favoriteShirt = blueShirt), 복사되어 새로운 인스턴스가 생성된다.

  • 추후에 파란 셔츠의 사이즈 값을 바꾸었을 때, 파란 셔츠의 값이 변경된다.
  • 최애 셔츠의 경우에는 독립적인 인스턴스를 가지고 있기 때문에, 파란 셔츠의 사이즈 변경에 대해 영향을 받지 않는다.

이렇게... 참조 타입과 값 타입에 대해서 알아보았는데요!(갑자기 존댓말..)
공부하며 작성한 글이기 때문에 틀린 정보가 있다면, 알려주시면 감사히 수정하겠습니다!🐾

🔖 참고

profile
🍫 iOS 🍫 Swift

0개의 댓글