하루에 0.01%라도 성장하자

Develop/iOS

Swift 이니셜라이저와 디이니셜라이저 ( init and deinit )

뚠님 2019. 5. 10. 15:14
반응형

Swift

 

인스턴스는 생성이 되면 언젠가 소멸된다.

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