나의 발자취
초기화의 과정과 생성자 본문
초기화(initialization) 와 생성자(initializer)
/**=====================================================================
- 초기화는 클래스, 구조체, 열거형의 인스턴스를 생성하는 과정임
- 각 "저장 속성"에 대한 초기값을 설정하여 인스턴스를 사용가능한 상태로 만드는 것
(열거형은 저장속성이 존재하지 않으므로, case중에 한가지를 선택 및 생성)
- 결국, 이니셜라이저의 실행이 완료되었을 때,
- 인스턴스의 모든 저장속성이 초기값을 가지는 것이 ==> 생성자(Initializer)의 역할
- 참고) 소멸자
- 생성자와 반대개념의 소멸자(Deinitializer)도 있음
- 소멸자 ==> 인스턴스가 해제되기 전에 해야할 기능을 정의하는 부분
=====================================================================**/
생성자 구현의 기본
// 클래스, 구조체, (열거형) 동일
class Color {
//let red, green, blue: Double // 동일한 타입일때, 한줄에 작성가능
let red: Double
let green: Double
let blue: Double
// 생성자도 오버로딩(Overloading)을 지원 (파리미터의 수, 아규먼트 레이블, 자료형으로 구분) -> 여러 버전의 생성자 생성이 가능
init() { // "init()" -> 기본 생성자. 저장 속성의 기본값을 설정하면 "자동" 구현이 제공됨
red = 0.0
green = 0.0
blue = 0.0
}
init(white: Double) {
red = white
green = white
blue = white
}
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
}
/**===================================================
- 초기화의 방법(저장속성이 초기값 가져야 함)
- 1) 저장 속성의 선언과 동시에 값을 저장
- 2) 저장 속성을 옵셔널로 선언 (초기값이 없어도 nil로 초기화됨)
- 3) 생성자에서 값을 초기화
- 반드시 생성자를 정의해야만 하는 것은 아님 ⭐️
- 1-2번 방법으로 이니셜라이저를 구현하지 않아도,
- 컴파일러는 기본 생성자(Default Initializer)를 자동으로 생성함 ==> init()
- ==> 이니셜라이저 구현하면, 기본 생성자를 자동으로 생성하지 않음
======================================================**/
var color = Color() // 기본 생성자 호출. 결국 Color()는 생성자를 호출하는 것임 (메서드 호출 문법과 형태 동일)
//var color2 = Color.init() 의 줄임말임.
// 하나의 인스턴스를 찍어낼 때 여러가지 버전을 생성시킬 수 있다.
//color = Color(white: <#T##Double#>)
//color = Color.init(white: <#T##Double#>)
//color = Color(red: <#T##Double#>, green: <#T##Double#>, blue: <#T##Double#>)
//color = Color.init(red: <#T##Double#>, green: <#T##Double#>, blue: <#T##Double#>)
* 멤버와이즈 이니셜라이저(Memberwise Initializer) - 구조체의 특별한 생성자
//:> 구조체는 멤버와이즈 이니셜라이저 자동 제공
// 기본값을 지워도 에러가 나지 않는다. -> XCODE가 memberwise initializer를 자동생성.
struct Color1 {
var red: Double = 1.0
var green: Double = 1.0
var blue: Double
}
/**============================================================
- 생성자 기본 원칙
- 컴파일러는 기본 생성자(Default Initializer)를 자동으로 생성함 ==> init()
- ==> 이니셜라이저 구현하면, 기본 생성자를 자동으로 생성하지 않음
- 구조체는 저장 속성들이 기본값을 가지고 있더라도,
- 추가적으로 Memberwise멤버와이즈(멤버에 관한) 이니셜라이저를 자동으로 제공함
- 개발자가 직접적으로 생성자를 구현하면, 멤버와이즈 이니셜라이저가 자동으로 제공되지 않음 ⭐️
(멤버와이즈 이니셜라이저는 편의적 기능일뿐)
==============================================================**/
//var color1 = Color1()
//color1 = Color1(red: 1.0, green: 1.0, blue: 1.0)
// 구조체에서만 선언된 저장 속성의 이름을 파라미터로 제공하기 때문에
// 멤버에 관한 생성자를 제공한다는 뜻에서 멤버와이즈 이니셜라이저라고 부름
// (Memberwise 뜻: 멤버에 관하여) ( ~ wise: ~ 에 관하여)
/**==================================================
- 왜 멤버와이즈 이니셜라이저를 제공할까?
- 굳이 이유를 찾자면, 클래스보다 더 편하게 쓰기 위함일 것으로 추측
- 클래스의 경우에는, 생성자가 상속하고 관련이 있기 때문에 복잡
=====================================================**/
'앱 개발 > iOS' 카테고리의 다른 글
디자인(Main)과 코드(ViewController) 연결 시 주의사항 (0) | 2022.09.20 |
---|---|
iOS:: 무선으로 시뮬레이터 빌드하는 법 (1) | 2022.09.20 |
클래스의 상속과 재정의 (0) | 2022.07.14 |
클래스의 상속과 초기화(Inheritance, Initialization) (0) | 2022.07.02 |
접근 제어(Access Control) (0) | 2022.07.01 |