본문 바로가기

iOS

📱Swift Struct vs Class : Class 안에 Struct가 있으면 어떻게 복사될까

취업 준비를 하거나 이직 준비를 하면서 가장 많이 찾아본 면접 질문 중 하나는 "Struct와 Class의 차이를 설명해주세요." 라는 것이였습니다. 기본적으로 Struct는 call by value이고 Class는 call by reference라는 것은 조금만 찾아봐도 쉽게 발견할 수 있어서 면접에서 손쉽게 말할 수 있었습니다. 

그런데 추가 질문으로 Class 안에 변수로 Struct가 있거나 Struct안에 class가 변수로 있으면 어떻게 될까요? 라는 질문을 받았을 때에는 너무 혼란스러웠습니다..ㅋㅋ 당시에 대답을 제대로 하지 못하고 나왔었지만.. 나와서 궁금해서 한번 해봤습니다.


Class안에 Struct가 있는 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class classA {
  var booleanInClass = true
  var structInClass = StructInClass()
}
 
struct StructInClass {
  var booleanInStruct = true
}
 
var instance1 = classA()
var instance2 = instance1
 
instance2.structInClass.booleanInStruct = false
instance2.booleanInClass = false
 
print(instance1.booleanInClass)  // false
print(instance1.structInClass.booleanInStruct) // false
cs

 

classA라는 이름을 가진 클래스 안에 boolean 변수 하나와 boolean 변수 하나를 가진 구조체를 만들어서 실험을 해보았습니다.
두개의 인스턴스를 만들어서 값을 바꿔보고 출력을 해보았습니다.
Class 안에 있는 Boolean 타입 변수는 당연히 Class 안에 있는 변수라 instance2 값을 바꾸게 되면 instance1 값도 변경됩니다.
Class안에 있는 Struct도 마찬가지로 Class로 감싸지고 있기 때문에 Struct가 따로 복사되지 않습니다.
instance2에 instance1에 저장되어있는 전체 클래스의 reference가 복사되어서 클래스 안에 존재하는 Struct도 그대로 딸려옵니다.
그림으로 그려보자면 아래와 같습니다.

Class안에 Struct가 있는 경우


Struct안에 Class가 있는 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct StructA {
  var booleanInStruct = true
  var classInStruct = ClassInStruct()
}
 
class ClassInStruct {
  var booleanInStruct = true
}
 
var instance1 = StructA()
var instance2 = instance1
 
instance2.classInStruct.booleanInStruct = false
instance2.booleanInStruct = false
 
print(instance1.booleanInStruct)
print(instance1.classInStruct.booleanInStruct)
cs

 

이번에는 반대로 Struct 안에 Class가 변수로 있으면 어떻게 값변경이 일어날까요? 
위에서 했던 방식과 마찬가지로 두개의 인스턴스를 만들어서 두번째 인스턴트의 값을 변경해보았습니다.
Struct 안에 있는 Boolean타입의 변수는 call by value로 값이 복사되었기 때문에 instance2의 값을 바꿔도 instance1의 값이 변경되지 않습니다. 반면에 Struct 안에 있는 Class 변수는 값이 변경되었습니다.
이를 통해 Struct안에 Class가 있는경우 해당 클래스는 reference로 복사가 일어난다는 것을 알 수 있습니다.
그림을 보면 아래와 같습니다.

Struct 안에 Class가 있는 경우

instance1, instance2 두개의 변수가 생성될 때 Struct기 때문에 value가 복사되었습니다. 하지만 Struct안에 Class변수가 있어서 해당 Class변수는 reference가 복사된 것입니다. 그래서 instacne2변수의 클래스 내부 변수의 값을 변경하게 되면 instance1 안에 있는 클래스변수까지 영향을 미칩니다.