인스턴스 생성 및 소멸
안녕하십니까. 그린입니다!
오늘 포스팅에서는 인스턴스의 생성 및 소멸에 관해 나눠보겠습니다.
지금까지 클래스나 구조체를 생성 시 이니셜라이저를 통해 기본적인 인스턴스를 생성했습니다.
초기화 되는 과정이죠. 그런데 이번 주제에서는 초기화 과정에서 초기값을 설정하고 소멸시키는걸 알아보겠습니다.
1. 인스턴스 생성
-. 이니셜라이저를 정의하여 초기화 과정을 통해 초기값을 직접 할당할 수 있습니다.
즉 이니셜라이저가 초기값을 지정하는 메서드입니다!
-. init 키워드를 사용합니다. 클래스/구조체/열거형 함수 안 혹은 익스텐션으로 구현할 수 있습니다.
(클래스에선 익스텐션으로 구현할 수 없습니다.)
class TestClass {
init() {
//초기값 구현
}
}
1-1) 프로퍼티 기본값
-. 클래스.구조체 등 전역 프로퍼티의 기본값을 이니셜라이저를 통해 초기값을 할당해 줄 수 있습니다. (기본값을 할당합니다.)
struct Test {
var testData: Int
init() {
testData = 10 // 초기값 할당
}
}
let test: Test = Test()
print(test.testData) // 10 출력
1-2) 이니셜라이저 매개변수
-. 클래스.구조체 등 정의 시 이니셜라이저도 여러 매개변수를 가질 수 있습니다.
struct Test {
var testData: Int
init(first firstNumber: Int) {
testData = firstNumber
}
init(value secondNumber: Double) {
testData = secondNumber
}
}
let first: Test = Test(first: 10) // 초기값 10 저장
let second: Test = Test(value: 20) // 초기값 20 저장
1-3) 옵셔널 프로퍼티 타입
-. 인스턴스 사용되는 동안 값을 가지지 않아도 되는 저장 프로퍼티가 있으면 옵셔널로 선언 가능
-. 값을 주지 않는다면 nil로 선언됨
class Test {
var firstNum: Int
var secondNum: Double?
init(firstNum: Int) {
self.firstNum = firstNum
}
}
let test: Test = Test(firstNum: 10)
test.secondNume = 20
1-4) 상수 프로퍼티
-. 프로퍼티를 변수가 아닌 상수로 선언해준다면 초기값 설정 후 프로퍼티로 접근하여 다른 값으로 변경할 수 없습니다.
class Test {
let num: Int
init(num: Int) {
self.num = num
}
}
let test: Test = Test(num: 10) // 초기값 상수 10 저장
test.num = 20 // 오류
1-5) 기본 이니셜라이저 / 멤버와이즈 이니셜라이즈
-. 함수 내에서 기본적으로 값을 저장해주는 기본 이니셜라이저 (프로퍼티에 기본값이 저장되어있어야 함)
-. 프로퍼티 기본값으로 초기화하여 인스턴스 생성
-. 멤버와이즈 이니셜라이저란??? 프로퍼티 이름으로 매개변수를 갖는 이니셜라이저 !!!
-. 사용자 정의 이니셜라이저를 구현하지 않는다면 멤버와이즈 이니셜라이저가 기본으로 구현됨
(클래스는 멤버와이즈 이니셜라이저 지원 안됨)
struct Test {
var first: Int = 10
var second: Int = 20
}
1-6) 초기화 위임
-. 이니셜라이저가 다른 이니셜라이저에게 일부 초기화를 위임할 수 있습니다.
(클래스는 상속을 사용함으로 초기화 위임 지원되지 않습니다.)
-. self.init을 사용
1-7) 실패 가능한 이니셜라이저 (Failable initializer)
-. init? 키워드를 사용
-. 열거형에서 주로 사용
class Test {
var num: Int
init?(num: Int) {
//조건 구현
}
}
1-8) 함수 사용한 프로퍼티 기본값 설정
-. 클로저 뒤 소괄호를 붙임
-. 클로저를 실행한 결과값이 프로퍼티의 기본값이 됩니다.
class Test {
let num: NumType = {
//인스턴스 생성 반환
return someNume
}()
}
2. 인스턴스 소멸
-. 디이니셜라이저를 통해 구현
-. 메모리에서 소멸되기 직전에 호출됨
-. deinit 키워드 사용
-. 클래스의 인스턴스에서만 구현 가능
-. 한 클래스에서 하나의 디이니셜라이저만 구현 가능
-. 매개변수를 갖지않고 소괄호도 붙이지 않습니다.
-. 자동 호출됨으로 별도 코드로 호출할 수 없습니다.
이상으로 인스턴스의 사용자 정의 생성 혹은 기본 이니셜라이저 더 나아가 멤버와이즈 이니셜라이저까지
생성에 대해 알아봤으며, 인스턴스 소멸에 대해 알아봤습니다.
Swift 문법에서 인스턴스의 생성은 빠질 수 없는 부분이라 꼭 다시 되새기며 학습해보면 좋을것 같습니다.
해당 포스팅의 학습 내용의 출처는 스위프트 프로그래밍 3판 (야곰 지음) 교재에서 학습한 내용입니다!!
감사합니다 :D