구조체와 클래스?
OOP(Object-Oriented Programming)를 위한 필수 요소로, 프로그램의 코드를 추상화하기 위해 사용합니다.
1. Struct (구조체) - Value Type
하나 이상의 변수를 묶어서 새로운 자료형을 정의하는 도구입니다.
- Struct 명 : 대문자 카멜 케이스 사용
- Property, Method 명 : 소문자 카멜 케이스 사용
상속이 불가능 합니다.
AnyObject로 타입캐스팅이 불가능합니다.
생성자를 구현하지 않을 시, 기본 initializer를 사용할 수 있습니다.
Swift에서 Struct를 사용할 경우,
- let -> Instance 내부의 Property 값을 변경할 수 없음.
- var -> Instance 내부의 Property가 var로 선언된 Property에 한하여 값 변경이 가능함.
struct 구조체 이름 {
프로퍼티와 메서드
}
struct Lecture: Custom {
// Stored Property
let name: String
var instructor: String
var numOfStudent: Int
var numOfRegistered: Int = 0
// Computed Property : 있는 값을 가지고 조합해서 나타냄. (readonly)
var description: String {
return "Title: \(name), Teacher: \(instructor)"
}
//stored property 값을 직접 변경하려고 할때 (mutating)
mutating func register() {
numOfRegistered += 1
}
}
* Struct 자료 형태 사용 권장 (Apple 공식 문서)
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적인 경우
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 적합한 경우
- 구조체에 저장된 프로퍼티가 값 타입 이며, 참조하는 것보다 복사하는 것이 적합한 경우
- 다른 타입으로부터 상속 받거나 자신을 상속할 필요가 없는 경우
2. Class (클래스) - Reference Type(참조 타입)
객체 지향 프로그래밍에서, 데이터와 그 조작 절차인 메소드를 정리한 객체의 추형을 정의한 것입니다.
- Class 명 : 대문자 카멜 케이스 사용
- Property, Method 명 : 소문자 카멜 케이스 사용
클래스는 상속받을 수 있기 때문에 상속받을 때에는 클래스 이름 뒤에 콜론(:)을 써주고 부모클래스 이름을 명시합니다.
class 클래스 이름 {
프로퍼티와 메서드
}
class 클래스 이름: 부모 클래스 이름 {
프로퍼티와 메서드
}
Struct와 Class의 공통점 & 차이점
구분 | Struct | Class |
공통점 | 여러 변수를 담을 수 있는 컨테이너 | |
데이터를 용도에 맞게 묶어 표현하고자 할 때 용이함 | ||
Property, Method를 사용하여 구조화된 데이터와 기능을 가짐 | ||
초기화 ( Initializer )를 정의 (초기화 될때의 상태를 지정함) | ||
확장 ( extension ) 이 가능함 (새로운 기능 추가) | ||
Protocol 사용이 가능함 (특정 기능 실행) | ||
Subscript 사용이 가능함 | ||
타입 | Value Type | Reference Type |
특징 | Copy | Share |
상속 | X | O |
타입 캐스팅 | X | O |
Deinitializer - 인스턴스 메모리 해제 | X | O |
Reference Counting - 메모리 관리 (참조해서 사용할 때 카운트) | X | O |
언제, 어떤 것을 사용해야 할까?
Struct
1. 두 Object를 "같다, 다르다"로 비교해야 하는 경우 (데이터 자체)
2. Copy된 각 객체들이 독립적인 상태를 가져야 하는 경우
3. 코드에서 Object의 데이터를 여러 스레드에 걸쳐 사용할 경우
Class
1. 두 Object의 인스턴스 자체가 같음을 확인 해야 할때
2. 하나의 객체가 필요하고, 여러 대상에 의해 접근되고 변경이 필요한 경우
참고
'iOS > Swift' 카테고리의 다른 글
UIWebView 와 WKWebView 차이 (0) | 2021.12.12 |
---|---|
[Swift] Array, Dictionary, Set, Tuple (0) | 2021.12.12 |
[Swift] 메모리를 참조하는 방법 (Strong, Weak, Unowned) (1) | 2020.07.30 |
[Swift] Type Casting (0) | 2020.07.29 |
[Swift] Closure (0) | 2020.07.29 |