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를 변경한다면 어떻게 될까?
정답은 '바뀐다'이다.
클래스는 아까 말했듯이 참조 타입이다. 각 변수의 정보를 각 변수에 저장하는 것이 아닌, 맨 처음 인스턴스에 저장해놓고 그 주소만을 공유하는 것이다. 그래서 하나를 바꾸면 모두가 바뀌는 구조인 것이다.
그럼 구조체는 어떻게 다른가? 구조체는 각 변수의 정보를 각 변수에 따로따로 저장한다.
그 뿌리가 같을 뿐, 한번 생성되면 각자도생하는 것이다! 이것이 바로 클래스와 구조체의 참조 혹은 값타입의 차이점인 것이다.