Q. Swift에서 Structure와 Class의 차이는 무엇이고 언제 써야 하는가?
우선 Structure와 Class는 데이터를 용도에 맞게 묶어서 표현하고자 할 때 사용하는 문법이다. (사용자 정의 Data Type)
이 둘은 Property(프로퍼티 - 값)와 Method(메소드 - 기능)를 가진다. Swift에서 Structure와 Class는 모습과 문법이 거의 흡사하다.
둘의 가장 큰 차이점을 먼저 말하자면, Structure는 값 타입(Value Types)인 반면, Class는 참조 타입(Reference Types)이다.
참고) 일부 프로그래밍 언어에서는 소스 파일 하나 당 하나의 Structure 또는 Class만 선언하고 구현할 수 있지만, Swift에서는 별도의 제약사항이 없다. 즉, 한 파일에 여러 개의 Structures, Classes를 선언하고 구현해도 된다.
참고) Structure와 Class는 새로운 타입을 정의해주는 것과 마찬가지이므로 UpperCamelCase를, 내부에 들어가는 Property나 Method는 lowerCamelCase를 사용해 이름을 지어주자.
Structure와 Class 비교
먼저 Structure와 Class의 공통점을 알아보자.
- Properties(속성): 값
- Methods(메소드): 기능
- Subscripts(서브스크립트): 서브스크립트 문법을 사용할 수 있다.
- Initialization(초기화): 둘 다 초기화를 통해 초기 상태 값을 설정할 수 있다. (방법은 좀 다름)
- Extensions(익스텐션): 기본 기능에 추가 기능을 더해주는 Extension을 사용할 수 있다.
- Protocols(프로토콜): 특정 종류의 표준 기능을 제공하는 Protocol을 준수할 수 있다.
Structure에는 없는 Class 만의 특성도 있다
- Inheritance: Class 끼리는 상속할 수 있다. (Structure 끼리는 상속 X)
- Type Casting: Class 인스턴스의 타입을 확인하거나 해석할 수 있다.
- Deinitialization: Class 인스턴스를 메모리에서 해제할 수 있다. (deinit)
- Reference Counting: Class는 Reference Types(참조 타입)이므로 참조횟수계산(Reference Counting)을 할 수 있다. (Structure은 Value Types(값 타입)이다.)
(참고: Swift에서 Type Casting은 다른 언어에서의 Type Casting과 의미가 다르다. 링크 확인.)
Class는 이외에도 다양한 기능을 제공하는데, 이런 복잡성으로 인해 일반적인 상황에서는 Structure를 주로 사용하고, Class는 특정 상황이나 꼭 필요한 경우에 사용된다. 실제로 대부분의 사용자 정의 데이터 타입은 Structure이거나 Enumeration일 가능성이 높다. 자세한 비교는 Choosing Between Structures and Classes 을 참고하자.
Use structures by default.
Use classes when you need Objective-C interoperability.
Use classes when you need to control the identity of the data you're modeling.
Use structures along with protocols to adopt behavior by sharing implementations.
정의 기본 (Structure, Class)
struct SomeStructure {
// structure definition goes here
}
class SomeClass {
// class definition goes here
}
정의 (Structure, Class)
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
인스턴스 생성 (Structure, Class)
let someResolution = Resolution()
let someVideoMode = VideoMode()
인스턴스 초기화 (Structure, Class)
초기화 방법은 다양한데, 자세한 초기화 방법은 링크를 참고하자.
아래는 Structure에만 제공하는 Memberwise Initializers의 예시이다.
// struct - Memberwise Initializers
let vga = Resolution(width: 640, height: 480)
값 타입 (Value Types: Structures, Enumerations, ...) vs 참조 타입 (Reference Types: Classes)
Reference
- Structures and Classes
- 스위프트 프로그래밍 3판 (야곰 저)
'Development > Swift' 카테고리의 다른 글
[Swift] 필수 개념 (feat. Coding Test) (0) | 2022.03.16 |
---|---|
[Swift] Higher Order Function / 고차함수 (0) | 2022.02.25 |
[Swift] Closure (0) | 2022.02.17 |
[Swift] Extensions (0) | 2021.12.17 |
[Swift] Optional (0) | 2021.12.07 |