클래스와 구조체의 공통점
- 값을 저장할 프로퍼티를 선언할 수 있다.
- 함수적 기능을 하는 메서드를 선언 할 수 있다.
- 내부 값에. 을 사용하여 접근할 수 있다.
- 생성자를 사용해 초기 상태를 설정할 수 있다.
- extension을 사용하여 기능을 확장할 수 있다.
- Protocol을 채택하여 기능을 설정할 수 있다.
//구조체와 클래스의 기본적인 형태
struct 구조체 이름 {
프로퍼티와 메서드
}
class 클래스 이름 {
프로퍼티와 메서드
}
차이점
클래스(Class)
- 참조 타입 -> 값을 복사하는 것이 아닌 메모리를 참조
- ARC(Automatic Reference Counting)로 메모리를 관리한다.
- 같은 클래스 인스턴스를 여러 개의 변수에 할당한 뒤 값을 변경시키면 모든 변수의 값에 변화가 생긴다. -> 인스턴스를 참조하기 때문
- 상속이 가능하다
- 타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입을 확인할 수 있다.
- Init을 필수적으로 만들어줘야한다.
- deinit을 사용하여 클래스 인스턴스의 메모리 할당을 해제할 수 있다.
구조체(Struct)
- 값 타입 -> 값을 복사
- 구조체 변수를 새로운 변수에 할당할 때마다 새로운 구조체가 할당되기 때문에 하나의 구조체를 여러 개의 변수에 할당하고 값을 바꾸더라도 다른 변수의 값에 영향을 미치지 않는다. -> 값 타입이기 때문
클래스 -> 스프레드시트 UIKIT에서 사용
구조체 -> 엑셀 SwiftUI에서 사용
어떤 상황에 클래스를 쓰고, 구조체를 쓸까 ?
구조체를 사용하는게 좋은 경우
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 경우
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할때
- 구조체에 저장된 프로퍼티가 값 타입이며, 참조하는 것보다 복사하는것이 합당할때
- 다른 타입으로부터 상속받거나, 자신을 상속할 필요가 없을때
- Swift 표준 라이브러리의 기본 타입은 모두 구조체