일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- COLOR
- 비동기
- 프로세스 스케줄링
- @state
- 100 days of SwiftUI
- Codable
- 동기화
- UserDefaults
- 운영체제
- Apple Developer Academy
- 상호배제
- Algorithm
- 가상 메모리
- struct
- 오브젝트
- deadlock
- 인프런
- async
- IOS
- SwiftUI
- 알고리즘
- Linked List
- core data
- 앨런
- Swift
- decode
- 동시성
- scrollview
- forEach
- 데드락
- Today
- Total
기어가더라도 제대로
220310. Protocol 외 다수 본문
수업을 듣고 정리한 필기를 옮긴 글입니다.
오류가 있을 수 있으나, 이는 전적으로 저의 무지에서 비롯된 것입니다. 많은 양해 바랍니다.
# 프로토콜을 안쓴다면 ..?
슈퍼 클래스에서 구현체를 만들어놔야 해결이 된다. 프로토콜 처럼 추상적인 인터페이스를 만들어 놓으면 그안에 세부 내용은 그것을 받을 인스턴스마다 다르게 설정 가능한데, 상속에 의한 방식은 내부의 기능을 일단 상위클래스에서 만들어놓고 하위클래스에서 override하는 식으로 써야한다. 다시 말하면, 수퍼 클래스에서 그 기능을 사용하지 않더라도 구현을 준비해놔야한다는 이야기.
* 수퍼클래스 - 서브 클래스
* protocol - 채택
이 두 차이는 이미 구현체가 구체 타입으로 있는 '수퍼 클래스 - 서브 클래스' 관계와 추상타입을 채택하는 '프로토콜-채택'의 관계의 일부를 보여준다.
# POP : Protocol Oriented Programing
다음과 같은 공식이 성립 할 수 있다.
POP = Value Type + OOP + FP
Struct Obeject Oriented Programing Functional Programing
Swift가 지향하는 목표와 POP가 향하는 목표가 비슷해 보인다는 생각이 들면 이미 초보자는 아니다. Swift는 Value Type의 지원을 위해 많은 부분에서 Struct로 타입을 지정하고, 객체지향을 지원하고, 또한 함수형 프로그래밍도 장려한다. 참 셋 중에 어느 하나 쉬운 주제가 없는데 이를 다 합쳐서 Swifty 하게 프로그래밍하라니.. 매우 어려운 임무다. 그치만 우리는 프로토콜이란 산을 정복하진 못해도 그 곳에 산이 있다고 지도에 점은 하나 찍어야한다.
# Dynamic Types(메타 타입)
수업 시간에 듣기로는 타입을 나타내는 타입 자체? 라고 들었는데 ... 잘 와닿지는 않는 개념이다. 다만, 덕분에 프로그램에서 사용하는 타입들을 enum 에 case 로 담지 않고도 정해진 종류의 타입만 사용할 수 있다고 한다. 더더욱 모르겠다. 일단 수업시간에 들은 코드만 정리를 한다.
# 리스코프 치환 원칙
예를들어 줄줄이 소세지가 있다고 하자. 슈퍼 클래스와 그 서브 클래스, 그리고 서브 클래스의 서브 클래스가 이번 소세지의 주인공들이다.
* S가 T 서브 타입일 때, 모든 T 타입 인스턴스는 S 타입 인스턴스로 대체 가능하다
* T 타입을 extension하면 하위 타입도 확장된다
* 프로토콜 일치는 서브 클래스에도 상속된다
* 한 번의 일치로 모든 서브클래스에서 동작해야 한다
직접 코드로 보면 이해가 쉽다.
슈퍼 클래스에서 확장하면 서브 클래스에서도 확장이 된다는 내용이고, 프로토콜 일치는 서브 클래스에도 상속이 된다는 내용입니다. 다만 위의 그림에서 처럼 가장 상위 클래스에 확장 extension을 넣기보단 꼭 필요한 하위 클래스에 extension을 넣어서 최적화를 해주는 것이 중요합니다. (경찰차가 일요일에 놀러 나가면 안되잖아요)
# Getter 와 Setter
여기 코드에서 get 과 set 을 지정해준 'height' 속성은 마지막 줄에서 180.0 이라는 값을 저장 받습니다.
그렇다면 출력을 했을 때 aiden.height 는 180.0 일까요? 183.0 일까요?
(... 고민을 해보시고 ...)
(... 조금더 고민을 해보시고 ...)
정답은 183.0 입니다. 그 이유는 set에 있습니다. set 은 새로운 값을 넘겨 받기위해 'newValue'라는 파라미터를 가지고 있는데, 이는 자주 생략이 됩니다. 밑에서 aiden.height = 180.0 을 했을 때 사실 set 의 newValue에 180.0 이라는 값을 넘긴거와 마찬가지인거죠. 그치만 우리의 height는 newValue를 받을 준비가 되어있지 않고 183.0으로 하드 코딩이 되어있습니다. 경우에 따라 다르겠지만 여기서 "aiden.height = 180.0" 이라는 명령문이 효과를 발휘하려면 다음과 같이 코드를 구성하면 됩니다.
# 그 외 ..
집중을 놓쳐서 대선 뉴스를 보고 말았습니다.. 대한민국 화이팅.. 아프지마..
이게 중요한게 아니고 다음에 학습을 위한 키워드를 적어 놓고 마무리 하겠습니다.
* 프로토콜과 클래스를 위한 <제네릭>
* 책임 할당하기 -> '오브젝트' (- 조영호 저) 읽기
* 전체 프로그램을 스모크 테스트 하는 것이 아닌 정확히 딱 그 부분만 테스트하기,
또한 그 함수를 읽기만 해도 해당 함수가 무슨일을 하는지 알게끔 이름 짓기
'기타' 카테고리의 다른 글
20220407. 놀라운 사실 (0) | 2022.04.07 |
---|---|
네트워크 프로그래밍 (0) | 2022.04.07 |
객체지향적으로 사고를 해보자 (from 2022.03.07 강의, 코드스쿼드) (0) | 2022.03.07 |
객체지향의 사실과 오해 - 1 - (0) | 2022.03.04 |
20220224 - Struct vs Class 외 다수 (0) | 2022.02.24 |