[Swift] Override Initializer

김범수·2022년 6월 2일
0

Swift

목록 보기
1/1

1. Initializer의 존재 이유

class Test {
	var a: Int!  // nil로 초기화
	var b: Int?  // nil로 초기화
	var c: Int   // init으로 초기화
	var d: Int   // error

	init(tmp: Int) {
		self.c= tmp
	}
}

2. Initilalizer의 종류

1) 초기화 메소드 델리게이션: super.init()

  • 연쇄적인 초기화
class A{
    var a: Int
    
    init(value: Int) {
        self.a = value
    }
}
 
class B: A{
    init(value1: Int, value2: Int) {
        super.init(value: value1)
    }
}
 
class C: B {
    init(value1: Int, value2: Int, value3: Int) {
        super.init(value1: value1, value2: value2)
    }
}

2) 지정 초기화 메소드 (Designated Initializer)

  • 서브 클래싱 시 꼭 초기화 해줘야하는 메소드 : init(...)으로 작성
  • required init은 서브 클래스에서 super.init이 아닌 직접 구현해줘야하는 초기화 메소드
class A{
    var a: Int
    
    init(value: Int) {
        self.a = value
    }
    
    required init (val1: Int, val2: Int, val3: String){
        self.a = val1
    }
}
 
class B: A{
    required init(val1: Int, val2: Int, val3: String) {
        super.init(value: val1)
    }
}

3) 편의 초기화 메소드 (Convenience Initializer)

  • convenience init(...): 현재 정의되어 있는 초기화 메소드를 불러서 추가적인 내용을 덫붙이는 것
  • convenience가 아닌 init 키워드는 블록 안에 self.init과 같이 다른 초기화 메소드를 부를 수 있음
class A{
    var a: Int
    var name: String!
    
    init(val1: Int, val2: String) {
        self.a = val1
        self.name = val2
    }
    
    convenience init(newVal: Int) {
        self.init(val1: newVal, val2: "imustang")
    }
}

3. init의 오버리딩과 오버라이딩

서브 클래싱시, 수퍼 클래스에서 Init 키워드로 작성된 것은 꼭 super.init으로 초기화 필요

1) 오버리딩 : 같은 이름의 메소드, 다른 매개변수 or 다른 리턴 타입

(안할 시 a변수가 초기화 안된 상태로 남아있음)

class A{
    var a: Int
    
    init(inValue: Int) {
        self.a = inValue
    }
}

class B: A{
    var b: Int
    
    init(inValue: Int, inValue2: Int) {
        self.b = inValue2
        super.init(inValue: inValue)
        
    }
}

2) 오버라이딩: 메소드 이름, 매개변수, 리턴타입 모두 같아야함

서브클래싱시, 수퍼클래스와 같은 촉;화 이름으로 할 땐 override init으로 선언

class A{
    var a: Int
    
    init(inValue: Int) {
        self.a = inValue
    }
}

class B: A{
    var b: Int
    
    override init(inValue: Int) {
        self.b = inValue
        super.init(inValue: inValue)
    }
}

항상 init 메소드를 남발하는 경향이 있었는데, 클래스의 초기화가 필요한 변수에 대해 정확히 initializer 메소드를 구현하고 서브 클래싱 시 필요에 따라 require init을 작성하는 연습이 필요하다.

profile
iOS Developer

0개의 댓글