드디어 상속과 생성자에 돌입... 헷갈릴수있는 개념이 많지만 차근차근 생각하면 사실은 너무나도 로지컬한 개념들인 듯
기본적인 지정생성자 / 편의생성자의 상속과 재정의 규칙은 쉽게 이해되는데 예외의 예시는 좀 더 익숙해질 필요가 있을 것 같다.
특히 편의생성자의 자동상속 논리 부분
편의생성자는 기본적으로 상속되지도 않고 재정의도 불가하지만 예외적으로 하위 서브 클래스에 자동상속 되는 경우가 있다.
기본으로 돌아가서 편의생성자는 같은 레벨의 지정생성자를 호출해야한다(delegated across) 그런데 이 같은 레벨의 지정생성자들이 모두 상위 지정생성자의 재정의로 구현되어 있는 상태이다. 즉 편의생성자가 자동상속 되어도 이를 위한 필수조건인 delegated across 가 이미 구현되어있기 때문에 논리적으로 결함이 없다. (= 자동상속된다)
2번의 케이스는 사실 필수적인 부분이 아니라고 하니 현재 단계에서는 적당히 이해하고 넘어가는 것이 필요할 것 같다.
스위프트는 자바와 다르게 하위의 속성이 스택에 먼저 쌓이고, 그 이후에 super.init() 등 상위지정생성자를 호출하면서 상위클래스의 속성이 스택에 쌓이게 된다.
클래스의 경우 이렇게 속성을 저장할때 지난번에 배운것처럼 힙영역에 인스턴스를 생성하고 그 안에 저장속성등 데이터를 저장하기 때문에 힙영역 메모리의 특징을 따른다. 즉 힙영역을 스캔하고 => 할당 => 스캔하고 => 할당을 반복하기 때문에 선천적으로 구조체보다 느린 특징을 갖게되는 것이다.
물론 스택에는 이 인스턴스를 가르키는 주소가 남는다.
override 키워드의 경우 재정의 키워드, 즉 이름(파라미터 포함) 이 같을때 다른 역할을 부여하고 싶은 경우에 사용한다. 주로 하위 클래스에서 상위생성자와 같은 이름을 쓰고싶을때 (init()등) override키워드를 사용해서 재정의를 구현한다.
상속에서 두가지 기억해야할것은 delegated across 와 delegated up 이다. 그림으로 기억해볼것.
delegated across 는 convenience 편의생성자가 같은 레벨의 지정생성자(혹은 편의생성자를 거친 후 지정생성자)를 호출해야 한다는 것을
delegated up 은 상위, 하위 클래스에서 하위지정생성자가 (같은 레벨의 저장속성을 초기화 한 후) super.init()과 같이 상위 지정생성자를 호출해야하는 구조를 의미한다.
그리고 초기화를 할때 옵셔널로 nil을 할당해줄 수 있음도 고려해보자.
이렇게 복잡해지는 문법일때 명심해야할것은 가장 베이직한 용도 인 듯하다. 생성자는 초기화를 위한 메서드라는 것.
너무 구구절절해지는 것 같아서 여기까지 정리하고 마쳐야겠다. 문법도 재밌지만 좀 더 실질적인 것도 만들고싶은 요즘 :)
FAQ 클래스 구조체 / 상속 부분을 1회독하고 가볍게 정리함
체화의 부족함을 느낌