LinkedList 자료구조 구현시 class/struct 선택

jane·2021년 12월 23일
0

iOS

목록 보기
10/32

클래스와 구조체

은행창구 매니저 프로젝트 STEP1의 자료구조를 설계하다가
LinkedList 안의 Node가 class일 때 LinkedList를 class 로 만들지 struct로 만들지 고민하였다.

이에 두가지 의문이 생겼는데, 다음과 같다.

  1. class로 만들어진 classLinkedList를 복사해서 copyClass를 만들 경우 LinkedList 안의 Node는 어떻게 될까?

  2. struct로 만들어진 structLinkedList를 복사해서 copyStruct를 만들 경우 LinkedList 안의 Node는 어떻게 될까?

이를 확인하기 위해 lldb를 이용하여 메모리 주소를 찍어보았다.

1. LinkedList가 class 인 경우

let classLinkedList = LinkedList<Int>()
classLinkedList.append(value: 1)
classLinkedList.append(value: 2)
classLinkedList.append(value: 3)

let copyClass: LinkedList<Int> = classLinkedList


결과
1. classLinkedList 자체의 메모리 주소값을 그대로 copyClass에 전달해주었다.
2. 안의 Node들의 메모리 주소도 서로 동일하게 가지게 된다.

2. LinkedList가 struct 인 경우

var structLinkedList = LinkedListt<Int>()
structLinkedList.append(value: 1)
structLinkedList.append(value: 2)
structLinkedList.append(value: 3)

var copyStruct: LinkedListt<Int> = structLinkedList


결과
1. 구조체이기때문에 structLinkedList는 메모리 주소값이 없다.(변수가 스택 영역에 저장)
2. 하지만 안의 Node들의 메모리 주소는 structLinkedList와 copyStruct가 서로 동일하게 가지게 된다.

🧐
값타입의 경우 복사시 값만 복사된다고 알고 있었는데 값타입 안에 참조타입이 들어가 있으면 참조타입의 메모리주소가 복사되어 들어간다니...

이를 통해 구조체와 클래스를 겹쳐서 사용하게 되는 경우 구조체의 값타입을 값타입처럼 사용할 수 없게 된다는 사실을 확인했다.

이렇게 내부 참조타입의 메모리주소가 복사되어 들어가지만, 껍데기는 구조체이므로 원본과 다르게 관리가 된다.

실험을 더 해보자.
copyStruct와 copyClass의 요소들을 모두 삭제했을 때
1. copyStruct 변경
copyStruct의 내부 값들을 모두 지워도 원본인 structLinkedList에는 영향을 주지 않는다.

copyStruct.removeAll()

2. copyClass 변경
반면, 내부요소와 껍데기 모두 클래스인 classLinkedList를 복사한 copyClass는 사실상 classLinkedList의 메모리 주소를 전달받은 것이 되기 때문에 copyClass의 내부 값들을 모두 지우면 원본인 classLinkedList의 내부 값들도 모두 지워진다.

copyClass.removeAll()

copyStruct와 copyClass의 첫번째 요소를 삭제했을 때
class의 경우 완전히 동일하므로 동일하게 삭제가 되어 head가 다음 주소로 변하지만,
struct의 경우 copyStruct의 head만 다음 주소로 변하는 모습을 확인할 수 있다.

결론

값타입내에 참조타입이 구현되어있으면 값타입의 값을 복사했을 때 안에있는 요소들은 원본과 같은 주소값을 가지고 있어서 값타입의 특성이 사라진다.

따라서, 값타입은 값타입과 함께, 참조타입은 참조타입과 함께 사용해야 각자의 특성을 유지할 수 있어 바람직하다는 결론을 내렸다.

profile
제가 나중에 다시 보려고 기록합니다 ✏️

0개의 댓글