init과 super.init에 대해서 알아보자.
✅ init과 super.init에 대해서 알아보자.
개발을 하면서 테스트코드 작성을 위해서 init으로 프로퍼티들을 초기화 시키다 보니 init에 대해서 궁금증이 생겼다.
그럼 정리 ㄱㄱ
SwiftUI를 통해서 코드를 작성해 보았음
✅ init에 대해서 큰 틀만 잡고 가자면
1. 초기화 메소드의 이름은 init으로 통일된다.
2. 매개변수의 개수, 이름, 타입은 임의로 정의할 수 있다.
3. 매개변서의 이름과 개수, 타입이 서로 다른 여러 개의 초기화 메소드를 정의할 수 있다.
4. 정의된 초기화 메소드는 직접 호출되기도 하지만, 대부분 인스턴스 생성 시 간접적으로 호출된다.
✅ 아래 코드를 보자.
class Student {
var age: Int
var name: String
init() {
self.age = -1
self.name = "파라미터 0개"
}
init(age: Int) {
self.age = age
self.name = "파라미터 1개"
}
init(age: Int, name: String) {
self.age = age
self.name = name
print("Student init")
}
}
학생에 대한 struct를 만들었는데 초기화를 저렇게 넣어서 자유롭게 할 수 있게 해봄.
그렇다면 학생이 학과에 속해있다고 하면 다른 구조체가 필요하겠지?
학과는 학생 구조체를 상속받아서 구현 ㄱ
class Department: Student {
var grade: Float
override init() {
self.grade = 3.0
super.init(age: 0, name: "")
}
init(age: Int, name: String, grade: Float) {
self.grade = grade
super.init(age: age, name: name)
print("Department init")
}
}
보이는가?
init을 이런식으로 사용할 수 있다.
🟠 여기서 잠깐!
Department(age: 25, name: "lgvv", grade: 4.4)
초기화를 실행하면 어떤 순서로 print문이 찍힐까?
결과는 바로
Student init // 실행 1
Department init // 실행 2
💡 여기서 주!목!
✅ override init과 super.init 은 어떻게 이해해야 할까?
override init은 Student의 구조체에 정의되어 있는 init 메소드를 사용할 때 적용하는 키워드이다.
근데 왜 사용?
그 이유는 바로, Department의 경우 Student에 선언된 init을 오버라이드하여 사용하고 있는데, Department에서 override 키워드를 붙여야 한다. 근데 문제가 Department의 경우에는 Student에서 초기화 된 프로퍼티를 사용할 수 없어서 이 경우에는 컴파일 에러가 발생하게 되고, 우리는 그에 맞게 대응해주면 된다.
우리는 이런 것을 바로 초기화 구문 델리게이션이라고 한다.
✅ 초기화 구문 델리게이션
초기화 구문 델리게이션이란, super.init을 쭉 타고 올라가는 것인데, 아래 그림을 한 번 보도록 하자.
init에 대해서 잘 알아보았다. 테스트 코드를 위해 이를 사용할 일이 많았는데, 앞으로도 더 공부해보도록 하자.
그렇다면 초기화 순서는 어떻게 진행될까?
자식클래스에 존재하는 것부터 역순으로 진행된다.
✅ 아래는 내가 테스트해보기 위한 코드
//
// ContentView.swift
// init_Training
//
// Created by Hamlit Jason on 2022/02/25.
//
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Text("Hello, world!")
.padding()
Button(
action: {
print("Button DidTap")
// _ = Department()
// print("next")
_ = Department(age: 25, name: "lgvv", grade: 4.4)
},
label: {
Text("마이버튼 이거 클릭좀 되게해주세요.")
}
)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
class Student {
var age: Int
var name: String
init() {
self.age = -1
self.name = "파라미터 0개"
}
init(age: Int) {
self.age = age
self.name = "파라미터 1개"
}
init(age: Int, name: String) {
self.age = age
self.name = name
print("Student init")
}
}
class Department: Student {
var grade: Float
override init() {
self.grade = 3.0
super.init(age: 0, name: "")
}
init(age: Int, name: String, grade: Float) {
print("Department init start")
self.grade = grade
super.init(age: age, name: name)
print("Deprtment init end")
}
}
'apple > iOS, UIKit, Documentation' 카테고리의 다른 글
[iOS] present 이후 pushViewController (0) | 2022.08.05 |
---|---|
iOS 최상단 ViewController + UIWindow (keywindow) (0) | 2022.03.15 |
iOS 오픈소스 라이선스 페이지 (뱅크샐러드) (0) | 2022.02.23 |
iOS Lottie 알아보기 (.json, .lottie) (0) | 2022.02.19 |
Showing All Messages Undefined symbol: __swift_FORCE_LOAD_$_XCTestSwiftSupport (0) | 2022.02.18 |