Custom Data Type
Apple이 만든 Swift언어에서 Int, String 등 많은 형식을 제공하는 것은 맞지만, 우리에게 필요한 모든 형식을 제공하는 것은 아닙니다.
그래서 구조체, 클래스를 사용해 필요한 형식을 직접 만들 수 있습니다.
오늘 주제는 아니지만, 여기엔 열거형(enum)도 있습니다.
직접 구현한 형식을 Custom Data Type이라고도 부릅니다.
Struct and Class
구조체나 클래스는 설계도라는 표현을 많이 씁니다.
설계도를 바탕으로 상품을 만들어야 합니다.
마찬가지로 구조체나 클래스 생성자를 사용해, 메모리에 실제로 값 또는 객체를 생성해야 합니다.
이 때 만들어진 값 또는 객체를 인스턴스라고 합니다.
값 : 구조체, 열거형 인스턴스
객체 : 클래스 인스턴스
Struct VS Class
struct | class | |
---|---|---|
Type | 스택이라고 부르는 메모리 공간에 값을 저장 값을 전달할때마다 복사본을 생성 값형식 | 힙에 값을 저장 스택에는 값의 주소를 저장함 값을 전달하면 복사본은 생성하지 않고, 주소만 전달 참조 형식 |
Deinitializer (소멸자) | X | O |
Inheritance (상속) | X | O |
클래스에서만 가능한 기능으로 생각해 보면 정리하기 쉽습니다.
상속과 재정의가 가능하고 소멸자를 사용할 수 있습니다.
Copy On Write
메모리 저장 방식에도 차이가 있습니다.
String, Array 등과 같은 구조체 타입은 값을 다른 상수나 변수에 할당하거나, 함수나 메소드의 파라미터로 전달할 때 값을 복사합니다.
반면 NSString, NSArray와 같은 타입은 클래스로 구현 돼 있습니다. 그래서 이 데이터들은 값이 전달될 때 값의 주소만 전달(참조)합니다.
그렇지만 Swift는 Copy On Write 최적화가 되어있는 언어입니다.
그래서 Swift 구조체에선, 값이 할당 되어도 값을 실제로 사용할 때만 데이터 복사가 이루어 집니다.