Swift TIL(31)

웰디(Well-D)·2023년 9월 19일
0

Sweet & Soft, SWIFT

목록 보기
29/76

복습

드디어 상속과 생성자에 돌입... 헷갈릴수있는 개념이 많지만 차근차근 생각하면 사실은 너무나도 로지컬한 개념들인 듯
기본적인 지정생성자 / 편의생성자의 상속과 재정의 규칙은 쉽게 이해되는데 예외의 예시는 좀 더 익숙해질 필요가 있을 것 같다.
특히 편의생성자의 자동상속 논리 부분
편의생성자는 기본적으로 상속되지도 않고 재정의도 불가하지만 예외적으로 하위 서브 클래스에 자동상속 되는 경우가 있다.

  1. 상위 지정생성자를 자동으로 상속했을때
    (지정생성자 역시 따로 재정의 혹은 생성자를 정의해야하지만 자동상속되는 경우가 있는데 바로 지금 이 경우와 동일하다)
  • 새로 추가된 저장 상속이 없거나
  • 추가된 저장 상속의 기본값이 이미 셋팅 되었거나
    즉 지정생성자의 역할인 저장속성의 초기값 셋팅 역할을 굳이 하위 서브클래스에서 또 해줘야할 필요가 없을때(추가된 서브클래스의 저장속성이 없거나, 혹은 기본값이 셋팅되어 버렸기 때문) 이다.
  1. 상위 지정생성자 모두가 재정의로 구현되었을때
    여기서 조금 논리구조가 꼬리를 무는 줄줄이 소세지가 되는데 내가 이해한 바로는 이런 셈이다.

기본으로 돌아가서 편의생성자는 같은 레벨의 지정생성자를 호출해야한다(delegated across) 그런데 이 같은 레벨의 지정생성자들이 모두 상위 지정생성자의 재정의로 구현되어 있는 상태이다. 즉 편의생성자가 자동상속 되어도 이를 위한 필수조건인 delegated across 가 이미 구현되어있기 때문에 논리적으로 결함이 없다. (= 자동상속된다)

2번의 케이스는 사실 필수적인 부분이 아니라고 하니 현재 단계에서는 적당히 이해하고 넘어가는 것이 필요할 것 같다.

스위프트는 자바와 다르게 하위의 속성이 스택에 먼저 쌓이고, 그 이후에 super.init() 등 상위지정생성자를 호출하면서 상위클래스의 속성이 스택에 쌓이게 된다.

클래스의 경우 이렇게 속성을 저장할때 지난번에 배운것처럼 힙영역에 인스턴스를 생성하고 그 안에 저장속성등 데이터를 저장하기 때문에 힙영역 메모리의 특징을 따른다. 즉 힙영역을 스캔하고 => 할당 => 스캔하고 => 할당을 반복하기 때문에 선천적으로 구조체보다 느린 특징을 갖게되는 것이다.
물론 스택에는 이 인스턴스를 가르키는 주소가 남는다.

override 키워드의 경우 재정의 키워드, 즉 이름(파라미터 포함) 이 같을때 다른 역할을 부여하고 싶은 경우에 사용한다. 주로 하위 클래스에서 상위생성자와 같은 이름을 쓰고싶을때 (init()등) override키워드를 사용해서 재정의를 구현한다.

상속에서 두가지 기억해야할것은 delegated across 와 delegated up 이다. 그림으로 기억해볼것.
delegated across 는 convenience 편의생성자가 같은 레벨의 지정생성자(혹은 편의생성자를 거친 후 지정생성자)를 호출해야 한다는 것을
delegated up 은 상위, 하위 클래스에서 하위지정생성자가 (같은 레벨의 저장속성을 초기화 한 후) super.init()과 같이 상위 지정생성자를 호출해야하는 구조를 의미한다.

그리고 초기화를 할때 옵셔널로 nil을 할당해줄 수 있음도 고려해보자.

이렇게 복잡해지는 문법일때 명심해야할것은 가장 베이직한 용도 인 듯하다. 생성자는 초기화를 위한 메서드라는 것.

너무 구구절절해지는 것 같아서 여기까지 정리하고 마쳐야겠다. 문법도 재밌지만 좀 더 실질적인 것도 만들고싶은 요즘 :)

스터디 준비

FAQ 클래스 구조체 / 상속 부분을 1회독하고 가볍게 정리함
체화의 부족함을 느낌

profile
Wellness 잘사는 것에 진심인 웰디입니다. 여러분의 몸과 마음, 통장의 건강을 수호하고싶어요. 느리더라도, 꾸준히

0개의 댓글