[Swift] 9. 인스턴스 생성 및 소멸

Hoojeong Kim·2022년 3월 7일
0

Swift Base

목록 보기
11/22
post-thumbnail

인스턴스 생성

초기화(initialization)

초기화 과정은 클래스, 구조체, 또는 열거형의 인스턴스를 사용하기 위한 준비 과정으로, 저장 프로퍼티의 초깃값을 설정하는 등의 일을 한다.

생성자(initializer)

이니셜라이저는 특정 타입의 새로운 인스턴스가 생성될 때 호출된다.

struct User {
	var name: String = "Hoojeong"
    
    init(){
    
    }
}

let user = User()

위와 같이 User라는 구조체에 대해 인스턴스가 생성될 때 init() 블록이 실행된다. 블록 내에는 프로퍼티의 값을 초기화 하거나, 새 인스턴스를 사용하기 전에 필요한 설정을 하면 된다.


사용 방법은 다음과 같다.
init(매개변수: 데이터 타입, ...) {
	프로퍼티 초기화
    인스턴스 생성 시 필요한 코드 작성
}

다음은 이니셜라이저 사용 예시이다.
class User {
	var name: String
    var age: Int
    var sex: Character
    
    init(name: String, age: Int) {
    	self.name = name
        self.age = age
        sex = "F"
    }
}

var user = User(name: "Hoojeong", age: 23)

print(user.name)
print(user.age)
print(user.sex)
Hoojeong
23
F

init() 안에서 매개변수로 프로퍼티를 초기화해도 되고, 그냥 직접 초기화해도 된다.
또한 매개변수를 다르게 해서 여러 개의 init()를 만드는 것도 가능하다.


하지만, 매번 프로퍼티를 초기화하기 위해 이니셜라이저를 추가하거나 변경하는 일은 귀찮다. 때문에 구조체는 멤버와이즈 이니셜라이저를 제공한다.

멤버와이즈 이니셜라이저란?
구조체에서 사용자 정의 이니셜라이저를 구현하지 않으면, 프로퍼티의 이름으로 매개변수를 갖는 이니셜라이저.


설명을 봐도 이해가 안 된다면, 다음 코드를 보자.
struct UserInfo {
	var name: String
    var age: Int
    
    func introduce() {
    	print("\(name) \(age)")
    }
}

var userInfo = UserInfo(name: "Hoojeong", age: 23)

코드에서 구조체 블록을 보면, 프로퍼티 name, age에 대해 초기화가 이루어지지 않았다.(이니셜라이저도 물론 없고.)
하지만, 인스턴스 생성 코드를 보면 매개변수로 프로퍼티 name와 age의 값을 초기화 하고 있다.

자, 이게 바로 멤버와이즈 이니셜라이저다. 굉장히 간편하지만, 클래스에서는 사용할 수 없다. ^0^

인스턴스 소멸

클래스는 참조 타입이기 때문에 더는 참조할 필요가 없을 때 메모리에서 해제된다. 이 과정을 '소멸'이라고 하는데, 소멸하기 직전에 deinit 메서드가 호출된다.

클래스 내부에 deinit 메서드를 구현하면, 소멸 직전 호출되며 클래스 당 하나의 deinit 메서드만을 구현할 수 있다. 또한 매개변수나 반환 값을 가질 수 없다.

class Cat {
	var name: String = ""
    var age: Int = 0
    
    func introduce() {
    	print("\(name) \(age)")
    }
    
    deinit {
    	print("extinction")
    }
}

var cat: Cat? = Cat()
cat = nil

이때 클래스의 인스턴스는 메모리가 해제되어 '없을 수' 있다. 때문에 옵셔널을 사용해야 한다.

참고로 deinit클래스에서만 사용할 수 있다. 구조체? 어림도 없지

profile
나 애기 개발자 👶🏻

0개의 댓글