Swift 부수기

[Swift 부수기] 클래스와 구조체의 차이

Anul 2022. 2. 5. 22:19

클래스와 구조체는 여러 면에서 비슷하지만 또 몇 가지 다른 점을 가지고 있다. 따라서 헷갈리기 쉬운데, 이번엔 그 둘의 공통점과 차이점을 공부해보았다!

 

클래스와 구조체의 공통점 & 차이점

  클래스 구조체
공통점 - 값을 저장할 프로퍼티를 선언할 수 있다.
- 함수적 기능을 하는 메서드를 선언할 수 있다.
- 내부 값에 .을 사용하여 접근할 수 있다.
- 생성자를 사용해 초기 상태를 설정할 수 있다.
- extension을 사용하여 기능을 확장할 수 있다.
- Protocol을 채택하여 기능을 설정할 수 있다.
차이점 - 참조 타입
- ARC로 메모리를 관리
- 상속이 가능
- 타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입을 확인 가능
- deinit을 사용하여 클래스 인스턴스의 메모리 할당을 해제 가능
- 같은 클래스 인스턴스를 여러 개의 변수에 할당한 뒤 값을 변경시키면모든 변수에 영향을 줌(메모리가 복사됨)
- 값 타입
- 구조체 변수를 새로운 변수에 할당할 때마다 새로운 구조체가 할당
- 즉 같은 구조체를 여러 개의 변수에 할당한 뒤 값을 변경시키더라도 다른 변수에 영향을 주지 않음(값 자체를 복사)

참조 타입, 값 타입?

클래스는 참조 타입, 구조체는 값 타입이라는데 이게 무슨 말일까?

예를 하나 들어보겠다.

class SomeClasses{
	var count: Int = 0
}

var class1 = SomeClasses()
var class2 = class1
var class3 = class2

class3.count = 2
class1.count //출력: 2

SomeClasses라는 클래스를 하나 만들고, class1이라는 변수를 만든 후 해당 인스턴스를 생성하였다. (난 아직도 이 인스턴스나 객체의 개념을 헷갈려서 워딩을 잘못하더라도 양해를 바란다...)

그리고 class2, class3이라는 변수를 만들고 각각 차례대로 인스턴스를 복사하였다. 이들의 관계는 결국 다음과 같은 것이다.

SomeClasses() = class1 = class2 = class3

그렇다면, 이 모든 과정이 끝난 후 class3의 count를 변경한다면 어떻게 될까?

 

정답은 '바뀐다'이다. 

클래스는 아까 말했듯이 참조 타입이다. 각 변수의 정보를 각 변수에 저장하는 것이 아닌, 맨 처음 인스턴스에 저장해놓고 그 주소만을 공유하는 것이다. 그래서 하나를 바꾸면 모두가 바뀌는 구조인 것이다. 

 

그럼 구조체는 어떻게 다른가? 구조체는 각 변수의 정보를 각 변수에 따로따로 저장한다. 

그 뿌리가 같을 뿐, 한번 생성되면 각자도생하는 것이다! 이것이 바로 클래스와 구조체의 참조 혹은 값타입의 차이점인 것이다.