[야우쓰] 3주차(3) Initializer Delegation

hello_hidi·2022년 11월 29일
0

야우쓰

목록 보기
16/20
post-thumbnail

Initializer Delegation

생성자에서 또 다른 생성자를 호출하여 초기화 코드의 중복을 최대한 제거하고, 모든 프로퍼티를 효율적으로 초기화 하기위해 사용하는 것! 값타입과 참조타입을 나눠서 설명하겠당!

Delegation을 안한 예시

아래 코드는 모든 프로퍼티 x, y값을 초기화 하는 코드를 두 곳 모두에서 작성하고 있으니
=> 중복된 코드 => Initializer Delegation을 따르고 있지 않음!
물론 이렇게 작성해도 이상할거 하나 없지만 중복을 줄이면서 유지보수가 좋은 방향으로 코드를 구현하는것이 또 개발자의 낭만 아니겠습니까~?~?

struct Position {
	var X: Int
    var Y: Int
    
    init(xPos: Int, yPos: Int) {
    	x = xPos
        y = yPos
    }
    
    init(pos: Int) {
    	x = pos
        y = pos
    }
}

값 타입의 Initializer Delegation

생성자에서 또 다른 생성자를 호출하여 초기화 코드의 중복을 최대한 제거!
코드로 보면 바로 아~ 할것임

  • 모든 프로퍼티를 초기화 하는 Initializer를 먼저 하나 만들고
  • 다른 Initializer가 이 Initializer를 사용하게 만든다! (self.init)
struct Position {
	var X: Int
    var Y: Int
    
    init(xPos: Int, yPos: Int) {
    	x = xPos
        y = yPos
    }
    
    init(pos: Int) {
    	self.init(xPos: pos, yPos: pos)
    }
}

참조 타입의 Initializer Delegation

값 타입과 똑같지만! 3가지 규칙을 지켜야 한다!
하지만 앞에서 다 배운것들이야! 걱정하지마!

Designated, Convenience Initializers

Designated Initializers

  • init 함수가 끝나기 전에 모든 프로퍼티의 값이 초기화 되어있어야 한다!
  • 서브 클래스인 경우, super 클래스의 init 메서드를 반드시 호출 해줘야 한다!

Convenience Initializers

  • Designated Initializers의 초기화를 보조해주는 역할
  • 파라미터 중 일부를 기본값으로 설정해서 호출할 수 있따!
  • 반드시 같은 클래스 계층 내에 있는 Designated Initializers가 호출되어야 한다!

규칙 1) Delegate Up

Designated Initializer는 반드시 슈퍼클래스의 Designated Initializer를 호출해야 한다!

규칙 2) Delegate Across(1)

Convenience Initializer는 반드시 동일한 계층의 initailizer를 호출해야 한다!

규칙 3) Delegate Across(2)

Convenience Initializer는 최종적으로 동일한 계층의 Designated initialize를 호출해야 한다!

class Figure {
  let name: String

  init(name: String) {
    self.name = name 
  }

  // Delegate Across
  convenience init() {
    self.init(name: "unknown")
  }
}

class Rectangle: Figure {
  var width = 0.0
  var height = 0.0

  // Delegate Up
  init(n: String, w:Double, h: DOuble){
    weidth = w
    height = h
    super.init(name: n)
  }

  // Delegate Across
  convenience init(value: Double) {
    self. init(n: "rect", w: value, h: value) // initialize Delegate
  }
}

class square: Rectangle {
  convenience init(value: Double) {
    self.init(m: "square", w: value, h: value)
  }

  convenience init() {
    self.init(value: 0.0)
  }
}
profile
안뇽희디

0개의 댓글