Swift TIL(32)

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

Sweet & Soft, SWIFT

목록 보기
30/76

확실히 복습하니 FAQ 볼 여력(?) 이 생긴다. 특히 스터디하면서 FAQ를 준비하니까 더 자연스럽게 보게되는 듯.

FAQ를 보면 비슷한 궁금증도 해결할 수 있고, 생각지 못한 부분도 새로 알아갈 수 있어서 많이 도움이 된다.
강의를 보면서 궁금한 부분을 찾아보고 + 눈길가는 부분을 먼저보고 => 스터디 준비하면서 제대로 정독하는 식으로 FAQ를 사용하고 있다.

복습

실패가능 생성자, 소멸자와 타입캐스팅에 대해 복습했다.
처음 들었을때는 열거형에서의 실패가능 생성자의 사용과 열거형의 원시값타입으로 인스턴스를 생성하는 것의 유사함을 이해하지 못했는데, 옵셔널타입으로 생성된다는 관점에서 보면 훨씬 이해가 쉽다는 것을 느꼈다.


내가 부여하지 않은 원시값으로 인스턴스를 생성했을때 => nil
(rawValue: ) 타입으로 인스턴스를 생성하면 옵셔널로 생성된다는 것을 알고있다는 전제하에 설명

열거형에서 실패가능 생성자로 인스턴스를 생성했는데, 실패가능 조건을 만족했을때 => nil

이런식으로 비슷한 개념이라고 느끼면 된다.

실패가능 생성자 역시 델리게이트 업, 델리게이트 어크로스 측면에서 고려해줘야하는 부분들이 있다.
이것도 범위를 생각해보면 크게 어려운 부분은 아닌데, 한마디로 실패불가능(init)이 실패가능(init?)보다 더 범위가 작다는 것을 염두에 두면 된다.

  • 호출관계일때
    델리게이트 어크로스(동일단계에서의 호출) 과 델리게이트 업(상/하위 단계에서의 호출,위임) 개념을 정리할 수 있다.

나중에 if let 바인딩 까지 적용하면 인스턴스가 nil일때 else구문을 실행하게끔 로직을 구현도 가능하다.

  • 재정의 관계일때
    이때도 범위로 바로 직관적으로 가능, 불가능을 생각해주면 되지만 내가 의아했던 점이 있었는데 바로 직관적으로 실패불가능 생성자(하위) 에서 실패가능 생성자(상위)를 호출하는 경우,
    이경우에는
super.init(name="당근")!

처럼 억지로 강제추출연산자 !로 강제언래핑 한 경우에는 nil상황을 완전 제거한 셈이므로 하위 클래스의 실패불가능생성자 안에서도 실패가능 생성자를 호출할 수 있게 된다(상식적으로 생각해보면 됨)

소멸자는 말그대로 클래스에서(클래스에서만 임) heap영역에 메모리가 해제될때 자동으로 구현되는 일종의 메서드로 파라미터가 없는 메서드다. deinit키워드를 사용한다 deinit { 어쩌구 }

타입캐스팅은 개인적으로 흥미를 느끼는(메서드 디스패치와 다른 흥미로움이다) 부분인데 논리적으로 잘꾸며진 부분이라는 생각이 들어서 그런듯 하다.
우선 is 연산자로 타입과 인스턴스를 비교해서 true/false 결과를 반환할 수 있고
as 연산자를 통해 업캐스팅, as? as! 연산자로 다운캐스팅을 구현한다.

핵심은 인스턴스는 생성될때 메모리에 저장된다는 것이다. 그 이후에 설정되는 타입들은 이 인스턴스를 어디부터 어디까지 가르킬것이냐(볼것이냐)만을 결정한다고 생각하면 된다.

그래서 as? 와 같이 불가능한 경우에 대비한 옵셔널이 붙게 되는 것이다. 내가 상위클래스의 인스턴스를 생성해놓고, 하위 클래스로 타입을 설정해 보고자(인스턴스에 접근하고자) 한다면 해당 하위클래스에만 구현되어있는 메서드, 속성에는 당연히(!) 접근이 불가능하다. 없는걸 보여달라고 하는거랑 마찬가지 이기 때문..
즉 타입설정을 한다는 것은 어떤 타입으로 내가 인식하고 바라볼것이냐에 달려있는 것이지 객체 그자체를 변경하는 행위가 아니라는 것을 기억해야한다.

이런 부분이 다형성(Polymorphism)의 한 예시라고 하는데..개인적으로 재미있고 (아마도 구현하다보면 재미없어질 수 있겠지만) 효율적으로 느껴지는 부분이다.

추가로 Any 타입과 AnyObject 타입도 배웠는데 사실상 AnyObject타입은 프로토콜에 가깝다고 하니 뒤에 프로토콜을 다룰 때 다시 복습의 필요성을 느끼게 될듯하다.

Any 타입의 경우 Switch문과 활용되어서 타입별로 타입캐스팅하여 case 패턴매칭을 해서 사용하는 방식으로 종종 쓰이는 듯 하다. 참고로 이때는 다운캐스팅을 하더라도 as?나 as! 대신 as 를 쓸수있는데, 어차피 nil과 같은 불확실한(실패하는)경우는 default문에서 처리를 해주기 때문이다.

추가로 as Any를 나는 얘를 계속 옵셔널로 사용할거란말이야. 그러니까 경고창 그만띄워줘. 하는 의미로 쓰기도 한다고 한다.
옵셔널의 원래 탄생이 임시값으로 쓰이기 위함이니까 swift에서는 너 지금 임시값쓰고 있다. 옵셔널 쓰고있어~ 라고 알려주는 모양인데, 그게 귀찮을때 as Any 타입캐스팅을 통해 나 이거 옵셔널까지 포함하는 전체 타입으로 쓸 생각이 확실하거든..? 경고창 띄워주지마.. 하는 의미로 사용한다.

오늘도 쓰다보니 길어졌다.

스터디준비

준비 후 기록

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

0개의 댓글