class 생성자 문법 정리

J.Noma·2022년 2월 13일
0

Swift : 문법

목록 보기
10/11
post-thumbnail

Reference


🌀 기본

🔸 자식 class 생성자 작성법 정리

class Person {
	let name: String
    var age: Int
    init(name: String) {
        self.name = name
        self.age = 10
    }
}

class Employee: Person {
	var salary: Int
    
    init(name: String) {
    	self.salary = 10 // 1. 자신의 프로퍼티 초기화
        super.init(name: name) // 1. super의 Designated 호출
    	self.age = 20 // 2. super의 프로퍼티 변경
    }
    
    convenience init() {
    	self.init(name: "김씨") // 3. Designated부터 호출
        self.salary = 20 // 3. 프로퍼티 변경
    }
}
  1. Designated 생성자에서, 프로퍼티를 초기화해주고 super.init을 호출할 것

  2. super의 프로퍼티를 변경하려면, super.init 이후에 해줄 것 (overwrite 방지)

  3. convenience에서 프로퍼티를 변경하려면, Designated 생성자 호출 이후에 변경할 것 (overwrite 방지)

  4. 모든 stored 프로퍼티가 초기화 된 이후부터 프로퍼티/메서드 사용이 가능하다

🔸 required 생성자

여기에 더 잘 정리해놓았다. 과거의 나 칭찬해..


🌀 심화

🔸 상속

Swift에서 생성자는 다른 일반 메서드와 달리 특정 조건을 만족시켜야만 상속이 된다. 생성자 상속과 관련한 2가지 Rule이 있다

🔘 Rule 1 : 자식 class에 Designated가 하나도 없는 경우

  • 자식 class에 Designated가 하나도 없는 경우, 부모의 Designated/Convenience를 전부 상속한다
  • 자식 class에 프로퍼티를 정의했다면 선언과 동시에 초기화 해주거나 optional 타입으로 지정할 것 (Designated가 반드시 필요한 경우를 피하기 위함)

🔘 Rule 2 : 자식 class에 부모의 모든 Designated를 구현하면

  • 자식 class에 부모 class의 모든 Designated 생성자를 구현하면, convenience를 상속받을 수 있다

🔸 override

부모의 생성자를 override하는데 있어 2가지 규칙이 있다

  • override는 부모의 Designated 생성자만 가능하다
  • self의 프로퍼티부터 초기화해야 한다
  • 재정의하려는 super.init을 호출해야 한다
class ABC {
    var a: Int

    init() {
    	self.a = 1
    }
}

class DEF: ABC {
	let b: Int
    override init() {
    	self.b = 2 // self의 프로퍼티부터 초기화
    	super.init() 
    	self.a = 2 // super의 프로퍼티 변경은 super.init 호출 이후부터 가능
    }
}

🔸 super.init을 생략할 수 있는 경우

이를 생략할 수 있는 특수한 경우가 있는데, 아래 조건을 만족해야 한다. 이 두 조건을 만족할 경우 super.init()이 마지막줄에 암시적으로 호출되어 생략할 수 있다

  • super가 기본생성자 init()"만"을 Designated로 가진다
  • self에서 super의 프로퍼티를 변경하지 않는다
class ABC {
    let a: Int
    init() {
        self.a = 1
    }
    //기본생성자 외 다른 생성자가 있으면 안됨
}

class DEF: ABC {
    let b: Int
    init(b: Int) {
        self.b = 2
        //super의 프로퍼티를 변경하지 않는 경우
        //super.init() 생략가능
    }
}
profile
노션으로 이사갑니다 https://tungsten-run-778.notion.site/Study-Archive-98e51c3793684d428070695d5722d1fe

0개의 댓글