코딩하는 제리

[Swift] 인스턴스 초기화 본문

iOS/SwiftUI

[Swift] 인스턴스 초기화

JerryCho 2022. 1. 13. 11:36

- 모든 클래스들의 프로퍼티들은 초기화 과정에서 반드시 값이 할당되어야 한다. (상속 받은 클래스가 있는 경우는 상위 클래스들의 프로퍼티도 모두 초기 값이 할당되어야 함.)

Designated initializer (지정 초기화)

1. 클래스의 모든 프로퍼티를 초기화 해야함.
2. 클래스 타입은 반드시 한 개 이상의 지정 초기화가 필요.
3. 초기화가 끝나기 전에 다르 메서드 호출 불가.
4. 소멸자
  a. 인스턴스가 사라질 때 자동 호출
    - deinit{}
class Man {
	var age: Int
	var weight: Double

	func display() {
		print("\(age), \(weight)")
	}

	// designated initializer
	init(yourAge: Int, yourWeight: Double) {
		self.age = yourAge
		self.weight = yourWeight
	}
    
	// deinit
	deinit {
		// 메모리 정리 등
	}
}

var jerry: Man = Man(yourAge: 10, yourWeight: 20.5)
jerry.display()

 

init overloading

- 파라미터 개수, 타입이 다르면 overloading이 가능하다.
class Man {
	var age: Int
	var weight: Double

	func display() {
		print("\(age), \(weight)")
	}
	
	// designated initializer
	init() {
		age = 1
		weight = 3.5
	}

	// designated initializer
	// overloading
	init(yourAge: Int, yourWeight: Double) {
		self.age = yourAge
		self.weight = yourWeight
	}
    
	// deinit
	deinit {
		// 메모리 정리 등
	}
}

var jerry1: Man = Man() // init() 실행
var jerry2: Man = Man(yourAge: 10, yourWeight: 20.5) // init(parameters) 실행
jerry.display()

 

Convenience initializer (편의 초기화)

1. convenience initializer 내부에서 반드시 다른 initializer가 호출되어야 함. (self.init())
2. 일부 프로퍼티만 초기화 가능.
3. 다양한 방법으로 객체를 만들 수 있도록 편의를 제공하려면 init을 오버로딩해야 한다. (코드 중복 발생)
4. 코드 중복 방지를 위해 convenience init 사용
5. self.init() 은 convenience initializer 내부에서 가장 먼저 작성되어야 함.
convenience init(parameters) {
	self.init()
	statements
}
class Man {
	var age: Int
	var weight: Double

	func display() {
		print("\(age), \(weight)")
	}

	// designated initializer
	init(age: Int, weight: Double) {
		self.age = age
		self.weight = weight
	}
    
	// convenience initializer
	convenience init(age: Int) {
		self.init(age: age, weight: 3.5)
	}
    
	// deinit
	deinit {
		// 메모리 정리 등
	}
}


var jerry1: Man = Man(age: 10, weight: 20.5) // designated initializer
var jerry2: Man = Man(age: 20) // convenience init
jerry1.display()
jerry2.display()

 

Failable initializer (실패 가능한 생성자)

1. init 다음에 "?" 나 "!" 키워드를 사용하며, 옵셔널 값이 리턴됨. (init?, init!)
2. 오류 상황에 nil을 리턴하는 조건문이 존재.
class Man {
	var age: Int
	var weight: Double

	func display() {
		print("\(age), \(weight)")
	}

	// failable initializer
	init?(age: Int, weight: Double) {
		if age <= 0 {
			return nil
		} else {
			self.age = age
		}
		self.weight = weight
	}
}

// 1. 옵셔널 형으로 선언 후 옵셔널 바인딩
var jerry: Man? = Man(age: 10, weight: 20.5)
if let jerry1 = jerry {
	jerry1.display()
}

// 2. 인스턴스 생성과 동시에 옵셔널 바인딩
if let jerry2 = Man(age: 10, weight: 20.5) {
	jerry2.display()
}

// 3. 인스턴스 생성과 동시에 강제 언래핑 (비추천, 절대 nil이 나올 수 없다 판단되면 사용)
var jerry3: Man = Man(age: 10, weight: 20.5)!
jerry3.display()

// 4. 옵셔널 인스턴스 사용시 강제 언래핑 (비추천, 절대 nil이 나올 수 없다 판단되면 사용)
var jerry4: Man? = Man(age: 10, weight: 20.5)
jerry4!.display()

 


 

'iOS > SwiftUI' 카테고리의 다른 글

[Swift] delegate/datasource  (0) 2022.01.13
[Swift] Generic 제너릭  (0) 2022.01.12
[Swift] Error Handling (Exeption Handling)  (0) 2022.01.12
[Swift} 옵셔널 체이닝(Optional Chaining)  (0) 2022.01.12
[Swift] protocol  (0) 2022.01.12
Comments