✏️구조체
구조체란 사용자가 정의하여 사용하는, 사용자 정의 자료형으로 하나 이상의 변수들을 그룹화하여 새로운 자료형을 만드는 것이다.
스위프트에서의 구조체 형태
struct 이름 { 내용 }
예시
구조체 안의 변수 : "속성(property)"
구조체 안의 함수 : "메소드(method)"
struct Sample{
var mutableProperty: Int = 100
let immutableProperty: Int = 100
static var typeProperty
func instanceMethod() { }
static func typeMethod() { }
}
var exampleStruct : Sample = Sample()
print(exampleStruct.mutableProperty)
exampleStruct.instanceMethod()
✏️클래스와 구조체의 차이
💡클래스와 구조체의 차이점을 알고 적절하게 사용할 수 있어야 한다
공통점
- 값을 저장할 프로퍼티를 선언할 수 있다
- 함수적 기능을 하는 메서드를 선언 할 수 있다
- 내부 값에. 을 사용하여 접근할 수 있다
- 생성자를 사용해 초기 상태를 설정할 수 있다
- extension을 사용하여 기능을 확장할 수 있다
- Protocol을 채택하여 기능을 설정할 수 있다
차이점
Class (클래스)
- 참조 타입이다 (Reference Type)
- Reference 값을 공유하며 같은 리소스를 향하는 Shallow Copy가 일어남
- ARC로 메모리를 관리한다
- 같은 클래스 인스턴스를 여러 개의 변수에 할당한 뒤 값을 변경시키면 할당한 모든 변수에 영향을 준다 (메모리만 복사)
- 상속을 할 수 있다
- 타입 캐스팅을 통해 런타임에서 클래스 인스턴스 타입을 확인할 수 있다
- deinit을 사용하여 클래스 인스턴스의 메모리 할당을 해제할 수 있다
Struct (구조체)
- 값 타입이다 (Value Type)
- 새로운 Struct에 이미 존재하는 Struct를 할당하면 독립된 공간을 사용하고 값만 같은 Deep Copy가 일어남
- 상속을 받는 것, 시키는 것이 불가능하다
- 구조체 변수를 새로운 변수에 할당할 때마다 새로운 구조체가 할당된다
- 같은 구조체를 여러 개의 변수에 할당한 뒤 값을 변경시키더라도, 값 자체를 복사했기 때문에 다른 변수에 영향을 주지 않음
- 한 번 생성되면 변경할 수 없다. 값을 바꾸려면 새로운 struct를 생성해야 한다
Struct는 언제 사용하는 것이 좋을까.
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 경우
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 값 타입일 때
- 다른 타입으로부터 상속받거나, 자신을 상속할 필요가 없을 때
💡기본적으로 Struct를 사용하고, 상속이 필요한 경우에만 Class로 바꾸는 방법을 애플에서 공식적으로 장려한다.
Struct가 유연성은 부족하지만, Class보다
- 간단하고 더 빠르다
- True immutability를 지원한다
- Memory leak이 적다
- thread safety를 더 보장한다
정보 감사합니다.