728x90
728x90
Swift의 클래스와 구조체: 자세한 비교와 예시
Swift에서 클래스와 구조체는 데이터를 저장하고 기능을 수행하는 데 사용되는 중요한 개념입니다. 비슷해 보이지만 몇 가지 중요한 차이점이 있습니다. 이 차이점을 이해하는 것은 효율적이고 안전한 코드를 작성하는 데 필수적입니다.
1. 값 타입 vs. 참조 타입
- 구조체(Struct): 값 타입입니다. 변수에 구조체를 할당하면 값이 복사되어 새로운 인스턴스가 생성됩니다. 즉, 원본 값은 변경되지 않습니다.
- 클래스(Class): 참조 타입입니다. 변수에 클래스 인스턴스를 할당하면 메모리의 같은 객체를 참조하는 포인터가 할당됩니다. 따라서 하나의 인스턴스를 여러 변수에서 참조할 수 있으며, 한 변수에서 값을 변경하면 다른 변수에서도 변경된 값이 반영됩니다.
2. 상속
- 구조체: 상속을 지원하지 않습니다. 즉, 다른 구조체로부터 기능을 상속받을 수 없습니다.
- 클래스: 상속을 지원합니다. 부모 클래스의 프로퍼티와 메서드를 상속받아 코드 재사용성을 높일 수 있습니다.
3. 초기화
- 구조체: 멤버와 동일한 이름의 프로퍼티를 가진 이니셜라이저를 통해 초기화됩니다.
- 클래스: 지정 이니셜라이저와 편의 이니셜라이저를 사용하여 초기화할 수 있으며, 상속을 통해 초기화 과정을 커스터마이징할 수 있습니다.
4. 타입 캐스팅
- 구조체: 값 타입이므로 타입 캐스팅 시 값이 복사됩니다.
- 클래스: 참조 타입이므로 타입 캐스팅 시 참조가 변경됩니다.
5. 디이니셜라이저
- 구조체: 디이니셜라이저를 사용할 수 없습니다.
- 클래스: 디이니셜라이저를 사용하여 인스턴스가 메모리에서 해제되기 전에 필요한 정리 작업을 수행할 수 있습니다.
예시
struct Point {
var x: Int
var y: Int
}
class Shape {
var name: String
init(name: String) {
self.name = name
}
}
class Circle: Shape {
var radius: Double
init(radius: Double) {
self.radius = radius
super.init(name: "Circle")
}
}
- Point: 값 타입으로, 좌표를 나타냅니다.
- Shape: 부모 클래스로, 도형의 기본적인 정보를 저장합니다.
- Circle: Shape을 상속받아 원을 나타내는 클래스입니다.
var point1 = Point(x: 1, y: 2)
var point2 = point1 // point1의 복사본이 생성됨
point2.x = 3 // point1의 x 값은 변경되지 않음
var shape = Shape(name: "Square")
var circle = Circle(radius: 5.0)
언제 클래스를, 언제 구조체를 사용해야 할까요?
- 구조체:
- 값이 복사되는 것이 적절한 경우 (예: 좌표, 크기, 색상 등)
- 작고 간단한 데이터를 나타내는 경우
- 상속이 필요 없는 경우
- 클래스:
- 복잡한 객체를 표현하고 싶을 때
- 상속을 통해 코드를 재사용하고 싶을 때
- identity를 가지는 객체를 표현하고 싶을 때 (예: 사용자, 계정 등)
결론
Swift에서 클래스와 구조체는 서로 다른 특징을 가지고 있으며, 사용 목적에 따라 적절한 타입을 선택해야 합니다. 값 타입인 구조체는 안전하고 효율적인 코드를 작성하는 데 도움이 되며, 참조 타입인 클래스는 복잡한 객체를 모델링하고 상속을 통해 코드를 재사용하는 데 유용합니다.
요약:
특징구조체클래스
타입 | 값 타입 | 참조 타입 |
상속 | 불가 | 가능 |
초기화 | 멤버와 동일한 이름의 프로퍼티를 가진 이니셜라이저 | 지정 이니셜라이저, 편의 이니셜라이저 |
타입 캐스팅 | 값 복사 | 참조 변경 |
디이니셜라이저 | 사용 불가 | 사용 가능 |
728x90
728x90
'IOS개발: SWIFT > 4. 객체 지향 프로그래밍 심화' 카테고리의 다른 글
Swift 프로토콜 정의와 채택: 프로토콜 상속, 프로토콜 연장 (0) | 2024.09.13 |
---|---|
Swift 상속: 상속의 기본 개념, 오버라이딩, 오버로딩 (0) | 2024.09.13 |
Swift 초기화: 초기화 위임, 실패 가능한 초기화 (0) | 2024.09.12 |
Swift 메서드: 인스턴스 메서드, 타입 메서드 (0) | 2024.09.12 |
Swift 프로퍼티: 저장 프로퍼티, 계산 프로퍼티, 지연 저장 프로퍼티 (0) | 2024.09.12 |