apple/iOS, UIKit, Documentation

[iOS/Swift] init과 super.init에 대해서 알아보자. 🤔

lgvv 2022. 2. 25. 20:40

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")
    }
}

버튼 클릭의 결과