• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

willSet, didSet 질문

23.01.25 20:06 작성 조회수 202

0

35강에서 willSet, didSet 관련하여 질문 드립니다.

class ClassA {

var a = 0

}

class ClassB {

var b = ClassA() {

willSet {

print(newValue)

}

didSet {

print(oldValue)

}

}

}

class는 레퍼런스 타입이라서 classB.b.a = 100이 안되고, struct는 된다고 하셨는데, 강의를 여러 번 들어도 이해가 가지 않아 질문 드립니다.

혹시 더 자세하게 설명해주실 수 있을까요?

답변 1

답변을 작성해보세요.

0

안녕하세요

 

레퍼런스 타입이라는건 생성할 때 그 생성된 객체 자체를 갖고있게 하지 않습니다.

다시말해 레퍼런스 타입으로 변수를 만든다는건 메모리 어딘가(힙영역)에 객체를 만들어 놓고 그 객체 원본이 있는 메모리 주소만 변수에 알려주는 것입니다.

 

var b = ClassA()

즉 이렇게 만들어진 변수 b는 ClassA가 만들어진 객체의 주소정보만 갖고 있게 되는거죠

이 상태를 참조한다고 표현합니다.

 

그러므로 ClassA안에 정보가 변경되도 변수 b는 변경되는게 전혀 없게됩니다.

변수 b는 객체 원본의 주소정보만 갖고 있기 때문이죠.

그러므로 변수 입장에서는 아무런 변경이 없기 때문에 property observer가 호출되지 않는 것입니다.

 

반대로 struct같은 value 타입은 변수로 생성할 때 그 객체 자체 정보를 갖고 있습니다.

var c = StructA()

이렇게 struct타입으로 만들었다고 한다면 변수 c는 StructA의 모든 객체 정보를 담고 있습니다.

 

이 차이가 property observer가 동작되고 안되고 차이를 만들게 됩니다.