반응형
인스턴스는 생성이 되면 언젠가 소멸된다.
Swift는 init, deinit으로 생성과 소멸을 관리한다.
인스턴스 생성과 초기값.
인스턴스가 생성될 때 가지고 있는 저장 프로퍼티는 초기값을 가져야만 한다.
//인스턴스가 생성될 때 저장 프로퍼티는 초기값을 가져야만 한다.
class TempA {
var name : String = "뚠님";
var age : Int = 10;
var seconName : String = "비밀";
// var seconName : String; // 이렇게 초기값을 지정하지 않으면 에러 발생.
}
그러나 초기값을 주지 않거나, 초기값을 다른 변수값으로 가져와야 하는 경우가 있는데 그때 사용하는 것이 init이다.
init
class TempB {
var name : String;
var age : Int;
var seconName : String;
//이니셜라이저
init(name:String, age:Int, seconName:String){ // init을 자바의 생성자처럼 사용할 수 있다.
self.name = name;
self.age = age;
self.seconName = seconName;
}
}
let tempPerson = TempB(name:"뚠님", age:10, seconName:"비밀"); // 이런식으로 사용한다.
이렇게 init으로 지정하면 자동으로 인스턴스가 생성되면서 실행된다.
옵셔널( Optional )의 사용
[ CASE 1 ]
모든 저장 프로퍼티에 초기값이 필요할 수도, 그렇지 않을 수도 있다.
초기값이 필요 없을 경우 옵셔널을 사용하여 처리할 수 있다.
class TempC {
var name : String
var age : Int
var seconName : String? // 옵셔널 사용, 값이 있을 수도 , nil일 수도 있다!
init(name:String, age:Int, seconName : String){
self.name = name;
self.age = age;
self.seconName = seconName;
}
init(name:String, age:Int){
self.name = name;
self.age = age;
// 보면 seconName에 대한 초기값을 지정하지 않았다!
}
}
[ CASE 2 ]
저장 프로퍼티에 옵셔널(!)을 넣어주면 나중에 해당 초기값을 별도로 입력하겠다 라는 의미다.
class TempC {
var name : String
var age : Int
var seconName : String! // 나중에 인스턴스를 받겠다!
init(name:String, age:Int){
self.name = name;
self.age = age;
}
func printInfo(){
print("내 이름은 \(name) 이고 내 두번째 이름은 \(seconName)이다.");
}
}
let myInfo : TempC(name:"뚠님", age:10);
// myInfo.printInfo(); // 실행 불가!!! seconName이 지정되지 않았기 때문! 에러 발생!!!
myInfo.seconName = "비밀"; // seconName을 지정해 주면 아래 printInfo()실행이 가능하다.
myInfo.printInfo();
[ CASE 3 ]
아래는 특정조건에 따라 인스턴스를 생성해서 할당되는 값이 nil일 가능성이 있기 때문에 아래와 같이 init?으로 옵셔널 선언을 한다.
class TempC {
var name : String
var age : Int
var seconName : String? // 옵셔널 사용, 값이 있을 수도 , nil일 수도 있다!
init?(name:String, age:Int, seconName : String){
if(0...20).contains(age) == false{
return nil; // nil반환 가능성이 있는 인스턴스라 init을 옵셔널로 지정한다.
}
self.name = name;
self.age = age;
self.seconName = seconName;
}
}
let tempPerson : TempC = TempC(name:"뚠님", age:10, seconName:"비밀"); // TempC를 옵셔널로 처리하지 않으면 에러 발생!!!
let tempPerson : TempC? = TempC(name:"뚠님", age:10, seconName:"비밀"); // nil값이 올 수도 있기 때문에 옵셔널로 받아야 한다.
convenience init
class TempC {
var name : String
var age : Int
var seconName : String? // 옵셔널 사용, 값이 있을 수도 , nil일 수도 있다!
convenience init(name:String, age:Int, seconName : String){ // 아래 init과 구분되도록 convenience를 붙여줌
self.init(name:name, age:age); // 아래 init을 불러와 사용
self.seconName = seconName;
}
init(name:String, age:Int){
self.name = name;
self.age = age;
// 보면 seconName에 대한 초기값을 지정하지 않았다!
}
}
init안에 init을 사용할 경우 구분되기 위해 convenience 사용한다.
deinit
deinit은 인스턴스가 소멸(메모리 해제)될 때 자동으로 실행되는 부분이다.
class TempC {
var name : String
var age : Int
var seconName : String? // 옵셔널 사용, 값이 있을 수도 , nil일 수도 있다!
convenience init(name:String, age:Int, seconName : String){ // 아래 init과 구분되도록 convenience를 붙여줌
self.init(name:name, age:age); // 아래 init을 불러와 사용
self.seconName = seconName;
}
init(name:String, age:Int){
self.name = name;
self.age = age;
// 보면 seconName에 대한 초기값을 지정하지 않았다!
}
deinit{
print("나는 이제 갑니다...메모리 해제!");
}
}
deinit의 특징
- 인스턴스가 소멸될 때 실행됨
- 매개변수를 가질 수 없음.
- 자동으로 호출됨
- 클래스 타입에서만 구현 가능
- 메모리가 해제되는 시점은 ARC(Automatic Reference Counting)의 규칙에 따라 결정
반응형
'Develop > iOS' 카테고리의 다른 글
Swift assert 와 guard (0) | 2019.05.10 |
---|---|
Swift nil병합 연산자 (0) | 2019.05.10 |
Swift 클래스의 상속 (0) | 2019.05.10 |
Swift 프로퍼티 (Property) (0) | 2019.05.09 |
Swift 클래스 와 구조체 ( Reference and Value ) (0) | 2019.05.09 |