swift init과 super.init 헷갈리는 부분 정리 (초기화 구문 델리게이션)
개발을 하면서 init과 super.init에 대해서 궁금증이 생겼다.
안드로이드 개발 시절에 개인적으로는 상속보다는 합성을 매우 선호해서, super.init과 같은 상속 코드는 지양하다보니까 자주 쓰지를 않아서, 이번 기회에 정리해보자.
상속보다 합성을 좋아하는 이유는 상속 기반 코드는 프로젝트 진행 및 커짐에 따라서 문제가 발생하는 지점이 너무 많다.
특히 정부나 기업 프로젝트에는 소프트웨어 공학 기반의 문서를 많이 작성하는데, 상속을 지양하는 프로젝트가 UML 등이 심플해지고 더 나은거 같다.
init과 super.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")
}
}
학생에 대한 구조체를 만들고, 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) {
self.grade = grade
super.init(age: age, name: name)
print("Department init")
}
}
위처럼 init은 이런 형태로 쓰인다.
여기서 학과를 초기화하여 console에 로그를 찍어보자.
Department(age: 25, name: "lgvv", grade: 4.4)
어떤 순서로 로그가 찍히는지 따라가보면 아래처럼 나타난다.
Student init // 실행 1
Department init // 실행 2
override init과 super.init은 정리하면서 이해하기.
override init은 Student의 구조체에 정의되어 있는 init 메서드를 사용할 때 적용하는 메서드다.
왜 사용하나면, Department의 경우 Student에 선언된 init이란 이름의 메서드를 Department에서도 초기화를 위해 init이라는 메서드로 구현하고 있는데 같은 이름의 경우 override 키워드를 붙여야 한다.
우리는 이런 것을 바로 초기화 구문 델리게이션이라고 일컬음.
초기화 구문 델리게이션
초기화 구문 델리게이션이란, 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 (1) | 2022.08.05 |
|---|---|
| iOS 최상단 ViewController + UIWindow (keywindow) (1) | 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 |