[Swift] 인스턴스
참조 : Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition
(iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)
인스턴스 생성
- 초기화 과정 : 새로운 인스턴스를 사용할 준비를 하기 위하여 저장 프로퍼티의 초깃값을 설정하는 일을 함
- 이니셜라이저(Initializer)을 정의하면 초기화 과정 직접 구현할 수 있음
- 구현된 이니셜라이저는 새로운 인스턴스를 생성할 수 있는 특별한 메서드가 됨
- 스위프트의 이니셜라이저에는 반환 값이 없음
- 이니셜라이저의 역할은 인스턴스의 첫 사용을 위해 초기화하는 것
- init 키워드를 사용하여 이니셜라이저 메서드임을 표현
- init 메서드는 클래스, 구조체, 열거형 등의 구현부 또는 해당 타입의 익스텐션 구현부에 위치
프로퍼티의 기본값
- 구조체와 클래스의 인스턴스는 처음 생성할 때 옵셔널 저장 프로퍼티를 제외한 모든 저장 프로퍼티에 적절한 초기값 할당해야 함
- 초기화 후에 값이 확정되지 않은 저장 프로퍼티는 존재 불가
- 프로퍼티를 정의할 때 프로퍼티 기본값을 할당하면 이니셜라이저에서 따로 초깃값을 할당하지 않더라도
프로퍼티 기본값으로 저장 프로퍼티의 값이 초기화됨
※ 이니셜라이저를 통해 초깃값을 할당하거나, 프로퍼티 기본값을 통해 처음의 저장 프로퍼티가 초기화될 때는
프로퍼티 감시자 메서드가 호출되지 않음
- Area 구조체와 이니셜라이저(init)
struct Area{
var squareMeter: Double
init(){
squareMeter: 0.0
}
}
let room: Area = Area()
print(room.squareMeter) // 0.0
- 위의 예시는 이니셜라이저로 저장 프로퍼티에 초깃값을 성정하는 방식
- 프로퍼티를 정의할 때 프로퍼티에 기본값을 할당하는 방식도 사용 가능
- 프로퍼티의 기본값 지정
struct Area{
var squareMeter: Double = 0.0
}
let room: Area = Area()
print(room.squareMeter) // 0.0
이니셜라이저 매개변수
- 이니셜라이저도 매개변수로 가질 수 있음
- 인스턴스를 초기화하는 과정에 필요한 값을 전달받을 수 있음
- 이니셜라이저 매개변수
struct Area{
var squareMeter: Double
init(fromPy py: Double){
squareMeter = py * 3.3056
}
init(fromSquare squareMeter: Double){
self.squareMeter = squareMeter
}
init(value: Double){
squareMeter = value
}
init(_ value: Double){
squareMeter = value
}
}
let roomOne: Area = Area(fromPy: 15.0)
print(roomOne.squareMeter) // 49.587
let roomTwo: Area = Area(fromSquare: 33.06)
print(roomTwo.squareMeter) // 33.06
let roomThree: Area = Area(value: 30.0)
print(roomThree.squareMeter) // 30.0
let roomFour: Area = Area(55.0)
print(roomFour.squareMeter) // 55.0
- 사용자 정의 이니셜라이저를 만들면 기존의 기본 이니셜라이저(init())는 별도로 구현하지 않는 이상 사용 불가
옵셔널 프로퍼티 타입
- 인스턴스가 사용되는 동안에 값을 꼭 갖지 않아도 되는 저장 프로퍼티가 있다면 해당 프로퍼티를 옵셔널로 선언 가능
- 초기화 과정에서 값을 할당해주지 않는다면 자동으로 nil이 할당됨
상수 프로퍼티
- 인스턴스를 초기화하는 과정에서만 값을 할당할 수 있으며, 처음 할당된 이후로는 값을 변경할 수 없음
기본 이니셜라이저와 멤버와이즈 이니셜라이저
- 기본 이니셜라이저는 저장 프로퍼티의 기본값이 모두 지정되어 있고, 동시에 사용자 정의 이니셜라이저가
정의되어 있지 않은 상태에서 제공됨
- 구조체는 사용자 정의 이니셜라이저를 구현하지 않으면 프로퍼티의 이름으로 매개변수를 갖는 이니셜라이저인 멤버와이즈
이니셜라이저를 기본으로 제공
- 클래스는 멤버와이즈 이니셜라이저를 지원하지 않음
초기화 위임
- 값 타입인 구조체와 열거형은 코드의 중복을 피하기 위하여 이니셜라이저가 다른 이니셜라이저에게 일부 초기화를 위임하는
초기화 위임을 간단하게 구현 가능
- 클래스는 상속을 지원하기 때문에 간단한 초기화 위임도 불가능
- 값 타입에서 이니셜라이저가 다른 이니셜라이저를 호출하려면 self.init을 사용
- self.init은 이니셜라이저 안에서만 사용 가능, self.init을 사용한다는 것 자체가 사용자 정의 이니셜라이저를 정의하고 있다는 뜻
- 사용자 정의 이니셜라이저를 정의하면 기본 이니셜라이저와 멤버와이즈 이니셜라이저를 사용 못함
→ 초기화 위임을 하려면 최소 두 개 이상의 사용자 정의 이니셜라이저를 정의해야 함
실패 가능한 이니셜라이저(Failable Initializer)
- 이니셜라이저의 전달인자로 잘못된 값이나 적절치 못한 값이 전달되었을 때, 이니셜라이저는 인스턴스 초기화에 실패할 수 있음
- 실패 가능성을 내포한 이니셜라이저
- 실패 가능한 이니셜라이저는 클래스, 구조체, 열거형 등에 모두 정의 가능
- 실패했을 때 nil을 반환해주므로 반환 타입이 옵셔널로 지정
- init? 키워드 사용
※ 실패 가능한 이니셜 라이저는 실제로 특정 값을 반환하지 않음
→ 초기화 실패 시 return nil을, 반대로 성공했을 때는 return을 적어 성공과 실패만을 표현함
- 열거형에서 유용하게 사용 가능
함수를 사용한 프로퍼티 기본값 설정
- 클로저를 사용하여 프로퍼티의 기본값을 설정한다면, 클러저 내부에서는 인스턴스의 다른 프로퍼티를 사용하여 연산할 수 없음
- 다른 프로퍼티에 기본 값이 있다 하여도 연산 불가
- 클로저 내부에서 self 프로퍼티 사용 불가, 인스턴스 메서드 호출 불가
struct Student{
var name: String?
var number: Int?
}
class SchoolClass{
var students: [Student] = {
var arr: [Student] = [Student]()
for num in 1...15{
var student: Student = Student(name: nil, number: num)
arr.append(student)
}
return arr
}()
}
let myClass: SchoolClass = SchoolClass()
print(myClass.students.count) // 15
※ iOS의 UI 등을 구성할 때, UI 컴포넌트를 클래스의 프로퍼티로 구현하고, UI 컴포넌트의 생성과 동시에 컴포넌트의 프로퍼티를
기본적으로 설정할 때 유용하게 사용 가능
인스턴스의 소멸
- 클래스의 인스턴스는 디이니셜라이저(Deinitialize)로 구현 가능
- 이니셜라이즈와 반대 역할을 함
- 메모리에서 해제되기 작전 클래스 인스턴스와 관련하여 원하는 정리 작업 구현 가능
- deinit 키워드 사용
- 클래스의 인스턴스에서만 단 하나만 구현 가능
- 자동으로 호출되기 때문에 별도의 코드로 호출 불가
'iOS > Swift' 카테고리의 다른 글
[Swift] Codable vs JSONSerialization (1) | 2022.10.15 |
---|---|
[Swift] 접근제어 (0) | 2022.09.28 |
[Swift] Extension (0) | 2022.09.27 |
[Swift] 상속 (0) | 2022.09.25 |
[Swift] 서브스크립트 (2) | 2022.09.22 |