Swift의 초기화 ( Convinience init 에 대하여 )

Jee.e (황지희)·2022년 3월 7일
0

이니셜라이저의 역할

  • 초기화를 진행해야, 메모리에 인스턴스가 생성된다.
  • 빈 메모리에 접근하면 예상치 못한 에러가 발생될 수 있으므로, 에러에 대한 안전을 처리하는 과정이다. (스위프트는 에러에 대한 안전을 최우선 시 한다.)
  • 타입 내부에 프로퍼티가 있다면, 해당 프로퍼티에는 무조건 값이 있다는 것을 보장해야 한다. (저장 프로퍼티의 초기값을 설정)



▸ 저장 프로퍼티에 초기값 설정

  • 인스턴스의 모든 저장 프로퍼티는 사용 전, 반드시 초기값을 갖고 있어야 한다.
  • 프로퍼티 작성 시 초기값을 지정해주거나, Designated initializer 을 통해 초기값을 전달할 수 있다.

사용 예시

class Person {
    var name: String = "Jee"
    var age: Int = 29
}



▸ 지정 이니셜라이저 (Designated initializer)

  • 클래스의 주요 이니셜라이저이다. (모든 클래스는 하나 이상의 지정 이니셜라이저를 갖는다.)
  • 부모클래스의 이니셜라이저를 호출할 수 있다.
  • 만약 부모 클래스에서 자식 클래스 이니셜라이저를 대체할 수 있다면, 자식클래스는 지정 이니셜라이저를 갖지 않아도 된다. (Ex. 상속받은 저장 프로퍼티, 옵셔널 저장 프로퍼티만 존재하는 경우)
  • 메서드도 이니셜라이저가 가능하다. (인스턴스 생성 시 해당 메서드 호출)

사용 예시

// 지정 이니셜라이저
class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

// 메서드 이니셜라이저
class Person {
    var name: String = "Jee"
    var age: Int = 29
    
    func sayHello() {
    	print("안녕 나는 \(name)이야. \(age)살 이지!")
    }

    init() {
        sayHello()
    }
}



▸ 편의 이니셜라이저 (Convenience initializer)

  • 클래스의 Designated initializer을 도와준다.
  • convenience init은 같은클래스에서 다른 이니셜라이저를 호출해야한다.
  • self.init 으로 자신의 지정 이니셜라이저를 호출
  • 사용하기 위해서는 Designated init 즉, 지정이니셜라이저가 먼저 선언이 되어있어야 한다.
  • 쉽게 말해, 정의되어 있는 초기화 메서드에 추가적인 내용을 덫 붙이는 것이다.

사용 예시

class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    convenience init(age: Int) {
        self.init(name: "Jee", age: 29)
    }
}

🤔 왜 혹은 언제 써야 하는가?

  • extension 을 하거나, 시간이 흐른 뒤 생성자를 추가해야 하는 상황이 생길 때
  • 지정 이니셜라이저의 매개변수가 많아 외부에서 일일이 전달인자를 전달하기 어려울 때
  • 일부 프로퍼티에 항상 같은 값으로 초기 값을 줘야할 때

❗️초기화 위임 규칙 모식도




▸ 옵셔널 사용

  • 프로퍼티를 옵셔널로 선언한 경우, 초기값이 없어도 된다.
  • 초기값이 없는 경우에는 자동으로 nil 로 초기화

사용 예시

class Person {
    var name: String?
    var age: Int

    init(age: Int) {
        self.age = age
    }
}

var test = Person(age: 29)
test.name = "Jee" // name: Optional("Jee")



참고 문서
1. https://zeddios.tistory.com/141
2. https://medium.com/@jgj455/1e3d329050c6

profile
교훈없는 경험은 없다고 생각하는 2년차 iOS 개발자입니다.

0개의 댓글