본문 바로가기
iOS_Swift

Swift - Struct 와 Class 차이점

by DevJake 2022. 3. 22.

Swift 서적이나 일반적인 차이점에 대해서는 다음과 같이 설명하고 있다. 

 

기본적으로 Struct 는 값 타입, Class 는 참조 타입. 

값 타입이란? 

- Struct 에서 변수를 할당하면 스택 영역에 값이 저장된다.

- 변수를 복사한 후 복사본을 변경하더라도 원본에 영향을 주지 않는다.

- 힙 영역을 사용하지 않고 레퍼런스 카운팅이 필요하지 않다.

참조 타입이란?

- 스택 영역에는 포인터(레퍼런스)만 할당되고 실제 데이터는 힙 영역에서 할당된다.

- 변수를 복사하더라도 하나의 값을 가리키고 있기 때문에 복사본과 원본이 모두 같은 값을 갖는다.

- 변수를 복사하더라도 레퍼런스 카운트만 +1되고 실제 값이 복사되지는 않는다.

 

좀 더 쉽게 설명하면, 

Struct 로 구성하면, 해당 Struct 에 값이 저장된다. Class 로 구성하면 저장은 다른데 해놓고, 쓸때마다 다른데서 가져와서 쓰는것이다. 

Struct 는 복사해서 가져가면 가져간 곳에 또 다른 Struct 가 생기는 셈이니 원본과 복사본이 같을 수가 없지만

Class 는 복사해서 가져가는 게 '다른곳에 저장해 놓은 주소' 를 복사해 간 셈이니, 복사본에서 변경을 하게 되면 '다른데 저장해 놓은 그 값' 자체를 수정하는 게 된다. 그러므로 복사본에서 값을 바뀌면 원본도 같이 바뀔수 밖에 없다. 

Swift 에서는 ARC(Auto Reference Counting) 를 통해 메모리를 자체 관리하는 시스템을 가지고 있는데, 여기서 나오는 Reference Counting 는 참조하는 횟수를 관리하는 개념이다. 어떤 특정 변수를 여기 저기서 마구 가져다 쓰고 있는데 가져다 쓰면 쓸수록 메모리에 할당되는 양은 늘어나고, Swift 는 가져다 쓰는 것들을 보면서, 한번 쓰고 안쓰거나 이미 다 쓴것들은 없애는(deinit) 역할을 해줌으로서 메모리를 관리해준다. 

Class 는 참조 타입 즉, 기본적으로 Reference Count 를 활용해야만 작동할 수 있는 녀석이다 보니 ARC 에서 집중(?) 관리를 해야 할 수밖에 없고, Struct 는 참조(reference) 개념을 사용하지 않기 때문에 ARC 가 관리할 부분이 없다. 

이러한 내용을 알고 보면 아래에 기재한 Struct 와 Class 차이에 대해 좀 더 이해가 쉬울 것 같다. 

 

1. Struct는 상속할 수 없음

2. type casting(is나 as 를 사용하는) 은 class 만 가능

테이블뷰 셀 불러올때 가장 많이 사용하는 Downcasting. 셀은 class 로 만들어져 있고, as 를 사용하여 재사용 셀을 type casting 한다.

3. deinit (deinitializer) 는 class 에서만 활용 가능 

4. reference counting 은 class 에서만 적용

 

 

사용중에 아래와 같은 차이를 보았는데, 이건 위에 언급한 '일반적인 차이점' 중 3번에 해당하는 내용인 것 같다. 

Struct 는 initializer 를 자동으로 제공하지만 class 는 별도로 초기화 혹은 초기값을 지정해주어야 한다. 

struct 는 type 만 지정해도 에러가 없다
초기화되지 않으면 에러 발생
처음부터 값을 넣던지,
Optional로 하던지 아니면 별도 초기화를 해야 한다

 

잘못된 내용이나 틀린 설명 부분이 있다면 댓글로 꼭 부탁드립니다. 

댓글