Swift) Class와 Struct의 차이점에 대해 설명하시오.
Class와 Struct 차이점
Class
참조 타입(Reference Type)
상속
가능- heap memory 영역에 할당 (속도가 느림)
- 런타임에 직접 alloc하며 reference counting을 통해 dealloc이 필요
- memory fragmentation 등의 overhead가 존재
- NSData serialize 가능
- Codable 사용 불가능
- 런타임에 타입 캐스팅을 통해서 클래스 인스턴스에 따라 여러 동작이 가능
- deinitializer 존재
Struct / Enum
값 타입(Value Type)
상속 불가능
(protocol은 사용 가능)- stack memory 영역에 할당 (속도가 빠름)
- scope based lifetime: 컴파일타임에 compiler가 언제 메모리를 할당/해제할지 정확히 알고있음
- data locality: CPU 캐시 히트율이 높음
- NSData로 serialize 불가능
- Codable 프로토콜을 이용하여 손쉬운 JSON <-> struct 변환 가능 (Swift 4 이상)
- 항상 새로운 변수로 copy가 일어나기 때문에 multi-thread 환경에서 공유변수로 인해 문제를 일으킬 확률이 적음
참조 타입과 값 타입 비교
참조 타입(Reference Type)
- 데이터를 전달할 때 값의
메모리 위치를 전달
한다.
1 | // 클래스 생성 |
값 타입(Value Type)
- 데이터를 전달할 때
값을 복사하여 전달
한다.
1 | // 구조체 생성 |
값 타입(Value Type)을 사용하는 경우
- 연관된 몇몇의 값들을 모아서
하나의 데이터 타입으로 표현
하고 싶은 경우 - 다른 객체 또는 함수 등으로 전달될 때 참조가 아니라
복사(값 복사) 할 경우
- 자신을 상속할 필요가 없거나, 다른 타입을 상속 받을 필요가 없는 경우
스위프트에서의 사용
- 스위프트의
기본 데이터 타입
은 모두구조체
로 구현되어있다. - 스위스트는
구조체
와열거형
사용을선호
한다. Apple 프레임워크
는 대부분클래스를 사용
한다.- 구조체/클래스 선택과 사용은 개발자의 몫이다.
정리
- 클래스는 참조 타입이고, 데이터를 전달할 때 값의
메모리 위치를 전달
한다. - 두 번째 클래스가 첫 번째 클래스 인스턴스를 참조하기 할 때, 두 번째 클래스의 인스턴스 프로퍼티 값을 변경하면 첫 번째 클래스 인스턴스의 프로퍼티 값도 변경된다.
- 구조체는 값 타입입고, 데이터를 전달할 때
값을 복사하여 전달
한다. - 두 번째 구조체 인스턴스가 첫 번째 구조체를 복사하면 그것은 똑같이 복사된 별도의 인스턴스이기 때문에 두 번째 구조체 인스턴스의 프로퍼티 값을 변경해도 첫 번째 구조체 인스턴스의 프로퍼티 값에는 영향이 없다.
- class안에 struct 변수를 property로 정의하는것 가능하며, 반대로 struct의 property중 하나로 class 인스턴스 변수를 갖고있는 것도 가능하다.
- 이 경우 해당 struct 변수의 copy가 일어날때 class 인스턴스의 주소값만 복사된다.
- 우리가 사용하는 배열, 딕셔너리, 셋과 같은 컬렉션 타입은
구조체로서 구현
되어 있다.
참고
Swift) Class와 Struct의 차이점에 대해 설명하시오.