Class 와 Struct#
모든 언어의 class 와 struct 정의는 거이 비슷하다. swift 내에서의 class, struct 의 특성 및 사용가이드를 정의해보고자 한다.
Class 특성#
- Reference Type
- ARC로 메모리 관리
- 상속 가능
- 타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입을 확인할 수 있다.
- 인스턴스가 소멸될때 deinit 메서드가 호출된다. (참조타입이니까)
- 참조 비교 연산자 사용가능(
===
,!==
)
Struct 특성#
- Value Type
- 상속이 가능하지 않다
- 여러 인스턴스를 만들고 값을 변경해도 , 각 인스턴스의 값은 다르다. (값 타입이니까;)
차이점#
- 구조체는 상속할 수 없다.
- 타입캐스팅은 클래스의 인스턴스에만 허용된다.
- deinit은 클래스의 인스턴스에서만 호출된다.
- 참조 횟수 계산은 클래스의 인스턴스에만 적용된다.
- 구조체는 생성자를 구현하지 않아도 default initalizer 를 사용할 수 있다.
- 구조체 내부에 구조체, 클래스 내부에 클래스 등 중첩타입의 정의 및 선언이 가능하다.
- 반면에 구조체는 init은 사용 가능하다 deinit은 사용 불가능하다.
- Swift 표준 라이브러리의 기본 타입은 모두 구조체이다.(String, Bool, Int, Array, Dictionary, Set)
초기화 예제#
convenience init, required init 란 무엇이냐? 이 키워드의 쓰임새는 무엇인가 상황별 예제
Class
init
convenience init
required init
class Person {
var name: String
var age: Int
init(name: name, age: age){
self.name = name
self.age = age
}
convenience init(name: name){
self.init(name: name, age: 27) // 지정 이니셜라이저 호출
}
}
let aiden = Person(name: "Aiden")// Person(name: "Aiden", age: 27)
//==========================================================================
// convenience init을 사용하고 싶지 않다면 프로퍼티에 초기값을 할당해줘도 된다.
class Person {
var name: String
var age: Int = 27
init(name: name){
self.name = name
}
}
let aiden = Person(name: "Aiden")// Person(name: "Aiden", age: 27)
class SomeClass {
required init() {
// 이 곳에 이니셜라이저 구현 작성하기
}
}
class SomeSubclass: SomeClass {
required init() {
// 이 곳에 자식 클래스의 필수 이니셜라이저 구현 작성하기
}
}
class Shape {
var numberOfSides: Int = 0
var name: String
init(name: String) {
self.name = name
}
}
class Square: Shape {
var sideLength: Double = 0.0
init(sideLength: Double, name: String) {
self.sideLength = sideLength // 1. 자식 클래스의 속성에 값 할당
super.init(name: name) // 부모 클래스의 이니셜라이저 호출
numberOfSides = 4 // 부모 클래스가 정의한 속성 값 변경
}
}
Struct
nil 을 허용하는 형태의 var 만이 초기화시 자동 nil 할당.
struct People {
var weight: Double?
var footSize: Int
init(footSize: Int) {
self.footSize = footSize
}
}
var stark = People(footSize: 270)
print(stark) // People(weight: nil, footSize: 270)
stark.weight = 82.9
print(stark) // People(weight: Optional(82.9), footSize: 270)
struct People {
let footSize: Int
init(footSize: Int) {
self.footSize = footSize
}
}
let leedsStark = People(footSize: 270)
print(leedsStark) // People(footSize: 270)