Swift는 처음부터 value types인 구조체(struct)에 중점을 두었습니다. Objective-C처럼 모든 것이 객체(클래스)인 것과 달리, Swift는 간단한 모델, 데이터 및 작은 비즈니스 객체를 위해 구조체 사용을 장려합니다.
많은 개발자들, 특히 다른 객체 지향 언어에 대한 경험이 있는 사람들은 모든 것에 클래스 사용을 잘못 적용합니다. 이는 메모리 문제(reference cycles), 객체 전달 시 예상치 못한 변경 및 thread safety 문제를 초래합니다. 클래스는 reference types이기 때문입니다.
Swift의 구조체는 value types로, 객체를 할당하거나 함수에 전달할 때 복사됩니다. 반면 클래스(reference types)는 참조를 전달합니다. 따라서 구조체는 복잡한 생명 주기 및 상속 논리가 필요 없는 모델에 더 적합합니다.
코드 예:
struct Point { var x: Int var y: Int } var p1 = Point(x: 10, y: 20) var p2 = p1 p2.x = 30 // p1.x는 여전히 10입니다.
주요 특징:
구조체에 상속자가 있을 수 있나요?
아니요, Swift의 구조체는 상속을 지원하지 않습니다. 모든 동작 확장은 오직 프로토콜과 extension을 통해서만 가능합니다.
구조체는 함수로 전달될 때 항상 복사되나요?
현실적으로 Swift는 Copy-On-Write 최적화를 사용합니다. 구조체를 변경하지 않으면 복사되지 않으며, 변경 시에만 복사가 이루어집니다. 이는 표준 컬렉션 및 복잡한 구조체에도 해당됩니다.
var arr1 = [1, 2, 3] var arr2 = arr1 arr2.append(4) // 여기서만 복사가 발생합니다.
어떤 경우에 구조체를 사용할 수 없나요?
동일한 유형의 데이터를 저장하기 위해 클래스를 사용했습니다 (예: 지도 위의 점들). 결과적으로 잦은 메모리 접근으로 인해 성능 저하, 메모리 관리의 복잡성 및 혼란스러운 참조로 인한 버그가 발생했습니다.
장점:
단점:
안전하게 복사되고 누수 없이 여분의 복잡성이 없는 데이터 모델을 위해 구조체를 사용했습니다.
장점:
단점: