###### tags: `STUDY` # 불타는 토요 스터디 7기 A반 #### Index [1주차](#1주차-A반-스터디), [1주차wiki](https://github.com/jjpush/BurnningSaturdayStudy/wiki/1주차) [2주차](#2주차-A반-스터디), [2주차wiki](https://github.com/jjpush/BurnningSaturdayStudy/wiki/2주차) [3주차](#3주차-A반-스터디), [3주차wiki](https://github.com/jjpush/BurnningSaturdayStudy/wiki/3주차) [4주차](#4주차-A반-스터디) // 추석 이슈 [5주차](#5주차-A반-스터디), [5주차wiki](https://github.com/jjpush/BurnningSaturdayStudy/wiki/5주차) [6주차](#6주차-A반-스터디), [6주차wiki](https://github.com/jjpush/BurnningSaturdayStudy/wiki/5주차) [7주차](#7주차-A반-스터디), [7주차wiki](https://github.com/jjpush/BurnningSaturdayStudy/wiki/7주차) [8주차](#8주차-A반-스터디) // 방학 전주 [9주차](#9주차-A반-스터디), [9주차wiki](https://github.com/jjpush/BurnningSaturdayStudy/wiki/9주차) [10주차](#10주차-A반-스터디), [10주차wiki] [11주차](#11주차-A반-스터디) [12주차](#12주차-A반-스터디) [13주차](#13주차-A반-스터디) [14주차](#14주차-A반-스터디) [15주차](#15주차-A반-스터디) --- # 18주차 A반 스터디 1.7 🧑‍💻 모각코 주제 - CAAnimation ⭐️ 공부하면서 나눴던 이야기와 질문들 - CALayer의 path를 통해 그림을 그릴 수 있다. - 방법은 Core Graphics 학습 때 베지어 패스를 사용한 것과 같다. - layer의 path 프로퍼티에 베지어 패스의 cgPath를 할당해준다. - CALayer의 mask 프로퍼티를 활용하면 레이어를 특정 범위 안쪽만 보이게 마스킹할 수 있다. - ![](https://i.imgur.com/SmooI5t.png) ![](https://i.imgur.com/S9e1w0w.png) - 적절한 key를 활용해야 원하는 애니메이션을 그릴 수 있다. - 가령 이번 주제는 position.y, rotation.z 등이 적합하다. - context를 사용하지 말라는 문장을 안 읽은 나(Gundy)는 바보다. - 한시간동안 그렸더니 레이어로 그리라그래서 갈아엎었다. - ![](https://i.imgur.com/PiY8r5A.gif) - 이건 예시 이미지고 성공은 못했다...밥먹고 2트 ㄱㄱㄱㄱ ```swift import UIKit class ColaView: UIView { override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { let animation = CABasicAnimation(keyPath: "position.y") let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") switch isFilled { case true: animation.toValue = height * 0.3 rotateAnimation.fromValue = 0 rotateAnimation.toValue = Double.pi / -24 case false: animation.toValue = height * -0.3 rotateAnimation.fromValue = Double.pi / -24 rotateAnimation.toValue = 0 } isFilled.toggle() animation.duration = 1 rotateAnimation.duration = 1 animation.fillMode = .forwards rotateAnimation.fillMode = .forwards animation.isRemovedOnCompletion = false rotateAnimation.isRemovedOnCompletion = false let straw = layer.sublayers![0] straw.add(rotateAnimation, forKey: nil) let layer = layer.sublayers![1].sublayers![0] layer.add(animation, forKey: nil) } var isFilled: Bool = true lazy var width = bounds.width lazy var height = bounds.height lazy var cupOutLineLayer: CAShapeLayer = { let layer = CAShapeLayer() let path = UIBezierPath() path.move(to: CGPoint(x: width * 0.2, y: height * 0.2)) path.addLine(to: CGPoint(x: width * 0.3, y: height * 0.9)) path.addLine(to: CGPoint(x: width * 0.7, y: height * 0.9)) path.addLine(to: CGPoint(x: width * 0.8, y: height * 0.2)) path.stroke() layer.path = path.cgPath layer.fillColor = UIColor.clear.cgColor layer.lineWidth = 3 layer.strokeColor = UIColor.systemGray.cgColor return layer }() lazy var strawLayer: CAShapeLayer = { let layer = CAShapeLayer() let path = UIBezierPath() path.move(to: CGPoint(x: width * 0.95, y: height * 0.05)) path.addLine(to: CGPoint(x: width * 0.75, y: height * 0.2)) path.addLine(to: CGPoint(x: width * 0.35, y: height * 0.85)) layer.path = path.cgPath layer.fillColor = UIColor.clear.cgColor layer.lineWidth = 3 layer.strokeColor = UIColor.darkGray.cgColor return layer }() lazy var drinkLayer: CAShapeLayer = { let layer = CAShapeLayer() let path = UIBezierPath() path.move(to: CGPoint(x: 0, y: height * 0.6)) path.addLine(to: CGPoint(x: 0, y: height * 1.3)) path.addLine(to: CGPoint(x: width, y: height * 1.3)) path.addLine(to: CGPoint(x: width, y: height * 0.6)) layer.path = path.cgPath layer.fillColor = CGColor(red: 100/255, green: 50/255, blue: 50/255, alpha: 0.9) return layer }() lazy var cupLayer: CAShapeLayer = { let layer = CAShapeLayer() let path = UIBezierPath() path.move(to: CGPoint(x: width * 0.2, y: height * 0.2)) path.addLine(to: CGPoint(x: width * 0.3, y: height * 0.9)) path.addLine(to: CGPoint(x: width * 0.7, y: height * 0.9)) path.addLine(to: CGPoint(x: width * 0.8, y: height * 0.2)) path.close() layer.path = path.cgPath layer.fillColor = UIColor.clear.cgColor layer.addSublayer(drinkLayer) layer.mask = maskingLayer return layer }() lazy var maskingLayer: CAShapeLayer = { let layer = CAShapeLayer() let path = UIBezierPath() path.move(to: CGPoint(x: width * 0.2, y: height * 0.2)) path.addLine(to: CGPoint(x: width * 0.3, y: height * 0.9)) path.addLine(to: CGPoint(x: width * 0.7, y: height * 0.9)) path.addLine(to: CGPoint(x: width * 0.8, y: height * 0.2)) path.close() layer.path = path.cgPath return layer }() override init(frame: CGRect) { super.init(frame: frame) layer.addSublayer(strawLayer) layer.addSublayer(cupLayer) layer.addSublayer(cupOutLineLayer) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } ``` # 17주차 A반 스터디 12.31 🧑‍💻 모각코 주제 - ⭐️ 공부하면서 나눴던 이야기와 질문들 - # 16주차 A반 스터디 12.24 🧑‍💻 모각코 주제 - animate ⭐️ 공부하면서 나눴던 이야기와 질문들 - 애니메이션이 교체될 때 이전에 있던 애니메이션이 삭제된다!? 왜 why? - Layer 넌 도대체 뭐니?? - CABasicAnimation은 또 뭐지?? - 결국 공부할 것만 더 늘어가네 😵‍💫 - 1 2 3 2 3 2 3 - https://i.imgur.com/qo9LhU0.gif # 15주차 A반 스터디 12.3 🧑‍💻 모각코 주제 - Core Data - Autolayout - 건디 ⭐️ 공부하면서 나눴던 이야기와 질문들 - 코어데이터는 DB인가?? - DB는 아닌것같음. DB같은 프레임워크? - 코어데이터는 내용이 굉장히 방대하다 - 대학 1년 과정 - Model, Object, Context - 위를 다 가진 Container - codegen 코데겐? 코드젠? 코드근? - class definition - manual/non - 월욜 활동학습에서 다시... - 아얀이 7기 짱(전국구) - 건디가 7기 오야 - 쿄가 7기 이진(바이너리라는 뜻) - 제이푸시가 7기 협객 - 준호가 7기 통 # 14주차 A반 스터디 11.26 🧑‍💻 모각코 주제 - 고기굽기 - 레크리에이션 ⭐️ 공부하면서 나눴던 이야기와 질문들 - 몸으로 말해요 - 인간 제로 - 한 번 야아는 영원한 야아다. # 13주차 A반 스터디 11.19 🧑‍💻 모각코 주제 - Collection View - URLSession ⭐️ 공부하면서 나눴던 이야기와 질문들 - CollectionView - layout 객체 vs UICollectionViewDelegateFlowLayout - Cell 코드로 짜면`addSubview()` 잊지않기! - 배너 형식의 컬렉션뷰는 보통 여백이 없는데 스크롤 딱딱을 구현하면서 여백을 구현할 일이 있을까? - ![](https://i.imgur.com/wbw5eJZ.png) 있었다. - indexPath.row vs indexPath.item - 감속률 - `collectionView.decelerationRate = .fast` - URLSession - PostMan - 술이 너보다 낫더라 - 결석짜이가 다음주까지 해옴 검사할거임 --- # 12주차 A반 스터디 11.12 🧑‍💻 모각코 주제 - Recognizer - Responder Chain ⭐️ 공부하면서 나눴던 이야기와 질문들 - Responder Chain - 터치가 되나 안되나 - 왜 hitTest가 두번 되나 - 바깥 영역 터치 구현 어떻게 해야할까?? - Recognizer - backgroundColor 비교 웨않됌? (system한정) - recognizer delegate - `touch.view?.isDescendant(of: orangeView)` 요런게 있다. --- # 11주차 A반 스터디 11.05 🧑‍💻 모각코 주제 - Protocol Oriented Programming ⭐️ 공부하면서 나눴던 이야기와 질문들 - 프로젝트 머지하면 왜 컨플릭남? - Git을 직접 만들어보면 Git을 더 잘 이해할 수 있지 않을까? - 제이푸시가 만들 예정. ^^7 - `quotientAndRemainder(dividingBy: <Self>)` 👍 - 건디의 시간 계산 로직이 So Good 👍👍 - 프로젝트 비동기 처리는 어떻게 해야할까? --- # 10주차 A반 스터디 10.29 🧑‍💻 모각코 주제 - Concurrency Programming, Accessibility, UITest ⭐️ 공부하면서 나눴던 이야기와 질문들 - 하드웨어적으로 1코어 2스레드라면 병렬 프로그래밍을 수행할 수 있는가? - 설계의 차이에 따라 달라질 수도 있지만, 이론상으로는 문제가 없다. - 재밌는 주제였다. 질문한 나 칭찬해(Gundy) - 균형의 수호자 제이푸시(나서스) 반박애호가, 토론러 - 오랜만에 한 CS 공부가 재미있는 Kyo - CS싫어증 아얀 네트워크도 싫엉 운영체제도 싫엉 ㅇㅈ 아몰랑 코딩만할래 --- # 9주차 A반 스터디 10.22 🧑‍💻 모각코 주제 - 테이블뷰, JSON ⭐️ 공부하면서 나눴던 이야기와 질문들 - 이거 왜 안되죠? - import한 asset 파일과 원본 asset 파일이 달라질 수 있어서 안 되는 이유가 뭔지 모르겠으면 꼭 내부 파일을 확인하자 - 딕셔너리 사용시 indexPath 사용 - let a = ["f" : 'f', "h" : 'h'] - a.keys = ["f", "h"] - 음식 이미지 - 보니 배고프다 - 현재 시각 12시 44분 공복(건디는 아님) - 각 메서드는 언제, 어떤 상황에서 호출될까요? ```swift= // Section의 개수를 요청받았을 때 func numberOfSections(in tableView: UITableView) -> Int {} // 섹션 개수를 파악한 후 각 섹션 내부의 행의 개수를 파악하기 위해 테이블 뷰가 호출 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {} //Row에 해당하는 Cell을 불러오고 싶을 때 호출한다. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {} //Section의 Header의 Title을 알려달라고 요청받았을 때 func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {} ``` - 우리는 메서드를 정의만 할 뿐, 직접 호출해주고 있지 않습니다. 누가 호출해주고 있는 것일까요? - TableView --- # 7주차 A반 스터디 10.01 🧑‍💻 모각코 주제 - 클로저, 고차함수 ⭐️ 공부하면서 나눴던 이야기와 질문들 - @escaping: Escaping 클로저는 클로저가 함수의 인자로 전달됐을 때, 함수의 실행이 종료된 후 실행되는 클로저 입니다. Non-Escaping 클로저는 이와 반대로 함수의 실행이 종료되기 전에 실행되는 클로저 입니다. - `map()`: 각 배열의 item을 새롭게 매핑해서 새룬 배열을 반환한다. - `filter()`: Bool 타입의 클로저를 매개변수로 받아 true일 경우의 값만 배열로 만들어서 반환한다. - `reduce(:)`: 주어진 초기값에 요소들을 결합합니다. - `flatMap()`: N차원 배열을 N-1차원 배열로 만들어준다. **`Array(s.map(transform).joined())`와 같다.** - `compactMap()`: Map의 기능 + 옵셔널 요소를 제거해준다. (nil도 제거) - `forEach()`: 요소를 순서대로 돌면서 작업을 수행한다. - `sort(by: )`: 정렬, 원본은 정렬하고 정렬 후 반환값이 없다. - `sorted(by: )`: 정렬, 원본은 건들이지 않고 정렬 후 반환값이 있다. - `reversed`: 원본 배열의 역순으로 된 배열을 반환한다. --- # 6주차 A반 스터디 09.24 🧑‍💻 모각코 주제 - TDD, Unit Test ⭐️ 공부하면서 나눴던 이야기와 질문들 - 다들 야곰닷넷의 유닛 테스트를 공부했으니 알쓸신잡의 '성장하는 iOS 개발자 되기 [전수열]'을 보기로 했습니다. - TDD의 실무 예시를 볼 수 있어서 더 이해에 도움이 되는 경험이었습니다. ## Unit Test 란? - 유닛 테스트는 다른 말로 단위 테스트라고도 한다. - 하나의 함수, 메서드를 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다. - 메서드를 하나하나 테스트하는 것과 같은 맥락이다. ## Unit Test를 사용하는 이유 - 메서드를 하나씩 테스트하는 유닛 테스트를 작성한다면 다음과 같은 이점이 발생할 수 있다. - 해당 부분(메서드)에 대해서 독립적으로 테스트를 하기 때문에 빠른 리팩토링 반영과 빠른 테스트를 진행할 수 있게 된다. - 코드의 확장이나 리팩토링 시에도 안정성을 확보한 채로 빠르게 대응할 수 있게 된다. ## 테스트가 이루어지는 방식 - 예상 값과 결과 값을 비교하는 방식으로 진행된다. ## FIRST 원칙 - Fast: 테스트는 빠르게 동작할 수 있어야 한다. - Independent/Isolated: 각각의 테스트는 독립적이며 서로 의존해서는 안 된다. - Repeatable: 테스트는 언제 어디서나 같은 결과가 반복되어야 한다. - Self-Validating: 테스트는 Bool을 이용하여 성공/실패에 대해서 스스로 검증이 가능해야 한다. - Timely: 테스트는 코드를 구현하기 직전에 구현해야 한다. ## 사용 방법 - @testable - `@testable`은 Unit Test에서 실제 앱 타깃에 있는 코드들에 접근하기 위한 키워드이다. - 보통 앱 코드 내부에서는 internal 수준의 접근 제한으로 타입을 만들어주는 것이 일반적이다. - 앱 타깃의 타입들에 외부 타깃에서 접근하는 것이 불가능한데 `@testable`은 테스트하는 동안에는 다른 타깃의 코드에 접근할 수 있도록 해주는 것이다. - SUT(System Under Test) - `sut`는 System Under Test라는 의미이다. - 즉 테스트할 타입이다. - 꼭 `sut`라는 네이밍을 사용하지 않아도 괜찮다. - `sut`의 타입이 옵셔널인 이유 - `setUpWithError`에서 `sut`을 초기화하고, `tearDownWithError`에서 `sut`에 nil을 할당하기 때문에 `sut`의 타입을 옵셔널로 하는 것이 적절하다. - 테스트 코드 작성하기 > 코드를 given/when/then으로 나누어 작성하는 방법은 BDD(Behavior Driven Development)라는 테스트 방식에서 가져온 것이다. BDD는 시나리오를 설정하여 예상대로 결과가 나타나는지를 확인하는 방법론으로, 어떤 상황이 주어지고(given) 어떤 코드를 실행하고(when) 테스트 결과를 확인하는(then) 단계로 구분하여 테스트의 흐름을 보다 쉽게 파악할 수 있다. > - given: 시나리오상의 예정된 행위(behavior)를 하기 전에 조건 등을 설정한다. - when: 예정된 행위를 한다. - then: 예정된 행위로 인해 예상한 결과를 도출하는지 확인한다. ## TDD 란? - TDD는 개발을 하는 데에 있어서 테스트가 주가 되어 개발을 이끌어나간다는 의미로 소프트웨어를 개발하는 방법론 중 하나이다. - 테스트 주도 개발은 테스트를 작성하면서 코드를 완성시켜나가는 방법론이다. ## TDD 방법 및 순서 - TDD는 Red, Green, Refactor의 세 가지 영역으로 나누어서 진행된다. - Red: 실패하는 테스트를 작성하는 구간 - Green: 실패한 테스트를 통과하기 위해 최소한의 변경을 하여 테스트에 성공하는 구간 - Refactor: 테스트의 성공을 유지하면서 코드를 더 나은 방향으로 개선해나가는 구간 ## TDD 장,단점 - 장점 - 테스트를 항상 통과하면서 코드를 작성해나가면 더 안전한 코드를 작성할 수 있다. - 테스트를 통과하는 코드를 작성하기 위해 재사용성과 의존성에 대해 고민하여 보다 의존성이 낮은 코드를 작성할 수 있다. - 유지 보수가 용이하다. - 테스트가 잘 작성되어 있다면 코드를 수정하는 일이 덜 두려울 것이다. - 단점 - 개발 속도(치명적) - 모든 돌 다리를 두드려보고 건너면 당연히 안전함은 보장되겠지만 매번 그 과정이 있다면 진행 속도는 저하될 것이다. --- # 5주차 A반 스터디 09.17 🧑‍💻 모각코 주제 - UML ⭐️ 공부하면서 나눴던 이야기와 질문들 - Coffee 타입 안에 amount 뭔가요 - 저는 oz인가 했습니다. - UML은 의사소통 수단일 뿐 너무 의존하지 말자. - 집합 관계와 합성 관계의 차이 ## UML 이란? Unified Modeling Language 통합 모델링 언어. 언어에 걸맞게 프로젝트에 관해 의사소통을 하는데 쓰임 ## 클래스간의 관계 일반화, 실체화, 의존, 연관, 직접연관, 집합(집합연관), 합성(합성연관) ![](https://i.imgur.com/q3zpW5U.png) 화살표의 의미는 참조 유지나 수정의 여파 등으로 생각하면 좋다. ### 일반화 관계 A -▷ B, 속이 빈 화살표. B가 A를 일반화 한 형태. 상속관계로 구현 class A: B ### 실체화 관계 A --▷ B, 점선과 속이 빈 화살표. 명세, 정의만 있는 B로 A를 구현 class A: B(Protocol) ### 의존 관계 A -> B, 점선 화살표. A 클래스 내에서 B클래스를 참조하는 것을 의미 이 참조 형태는 객체 생성, 메서드 호출, 매개변수로 객체 사용 등 직접 연관과 차이 나는 점. **사용 후 참조를 유지 하지 않음.** ### 연관 관계 A - B, 실선. A 클래스가 B 클래스를 참조할 수도, B 클래스가 A 클래스를 참조할 수도 또는 둘다일 수도 있음. ### 직접 연관 관계 A → B, 실선 화살표. A 클래스가 B클래스를 참조하는 경우 프로퍼티를 생성해서 타입이 직접 가지고 있는 경우 **사용 후에도 참조가 유지된다** ### 집합 ```swift= class Computer { var screen: Monitor var body: Body var keyboard: Keyboard init(screen: Monitor, body: Body, keyboard: Keyboard) { self.screen = Monitor() self.body = Body() self.keyboard = Keyboard() } } ``` A♢->B 작은 단위를 모아서 큰 단위를 만드는 것 모니터, 키보드, 메인보드 등의 클래스를 모아 컴퓨터로 만듬 ### 합성 ```swift= class Computer { var screen: Monitor var body: Body var keyboard: Keyboard init() { self.screen = Monitor() self.body = Body() self.keyboard = Keyboard() } } ``` A ♦︎-> B 작은 단위들을 합쳐서 큰 단위를 만드는 것 전체 인스턴스가 부분 인스턴스의 전체 수명을 책임집니다. 부분 인스턴스는 공유 될 수 없습니다. ## 다이어그램의 종류 총 14개의 다이어그램 종류가 있다. - 행위 다이어그램 - 활동 다이어그램 - 상태 머신 다이어그램 - 유스케이스 다이어그램 - 상호 작용 다이어그램 - 커뮤니케이션 다이어그램 - 시퀀스 다이어그램 - 타이밍 다이어그램 - 구조 다이어그램 - 클래스 다이어그램 - 객체 다이어그램 - 패키지 다이어그램 - 컴포넌트 다이어그램 - 배치 다이어그램 - 복합체 구조 다이어그램 - 프로필 다이어그램 --- # 3주차 A반 스터디 09.03 🧑‍💻 모각코 주제 - MVC, NotificationCenter ⭐️ 공부하면서 나눴던 이야기와 질문들 - cocoa MVC와 기존 MVC의 차이점 - TextFieldDelegate - Interface Builder 객체들 커서없이 하는 방법 - IBOutlet은 view? controller? - Cocoa MVC 패턴은 View와 Controller를 분리하기 어려운 이유 # cocoa MVC와 기존 MVC의 차이점 ![](https://i.imgur.com/cLx4Fu1.png) 기존 MVC : 모델과 뷰가 직접적으로 엮여있다. 의존성 높음. ![](https://i.imgur.com/xNts8Sp.png) cocoa MVC : 모델과 뷰가 분리되어 재사용성이 높아진다. VC에 모델 하나 뷰 하나 일경우에는 의존성이 적지만 모델 여러개, 뷰 여러개 일 경우에 뷰와 모델코드가 VC에 매우 많아지게 되고 뷰와 모델 사이에 의존성이 생기게 된다. ## 추가 ### - 왜 Cocoa MVC 패턴은 View와 Controller를 분리하기 어려운지? 1. view면서 controller의 역할을 하는 객체가 많기 때문이다. model의 값이 변했을 때 controller를 거치지 않고 바로 view가 변화하는 IBOutlet 등만 봐도 그러하다. 2. 스토리보드로 구현시 outlet, action, 컨트롤 로직이 모두 VC에 존재, 모델에 전달하는것도 VC에 존재해서 매우 비대해짐. 3. Cocoa MVC 패턴은 Controller에서 View객체를 연결해서 사용하기 때문에 분리하기 어렵다 4. Cocoa MVC 패턴의 Controller 역할을 UIViewController가 담당함. UIViewController는 View를 소유하며 View의 생명주기와 강하게 연결되기 때문에 View와 Controller의 분리가 쉽지 않음. 5. Cocoa MVC 구조는 View와 Model의 Controller는 중재자 역할을 함으로 서로 의존성이 높아 분리하기가 어렵다.?? @IBOutlet var button: UIButton @IBOutlet var tableView: UITableView <- 이것도 소유? ㅇㅇ ### - StoryBoard는 MVC 패턴의 관점에서 View라고 볼 수 있는지? View - 사용자가 볼 수 있는 object. - view object는 스스로 그리는 방법을 알고 user actions에 응답할 수 있음. - controller object를 통해 model object의 변경사항을 전달 받음. - controller object를 통해 user로 인한 변경사항을 model object에 전달함. 사용자가 볼 수 있고 스스로 그리는 방법을 알고 있으니 View이지 않을까요? 요기 한표 스토리 보드를 InterfaceBuilder를 통해 코드와 연결하는 것으로 보아 view에 더 가까운 것 같다. View에 기능이 추가된 형태라고 볼 수 있을 것 같다. View만 있지만 ID를 추가해준다던지, Segue를 연결한다던지 등의 Controller가 할 것 같은 일을 하기 때문 요기 두표 야호 # Notification Center란? 등록된 관찰자에게 정보를 전달할 수 있는 알림 전달 메커니즘. 일대다 또는 다대다 값전달을 위해 사용하는 것 Notification.post() 를 통해 값을 보내고 Notification.addObserver() 로 값을 받아서 처리한다. 객체간의 알림을 송수신하기 위해 사용하는 것 이벤트들의 발생 여부를 옵저버 등록한 객체들에게 Notification을 post하는 싱글턴 객체이다. # KVO란? 추후 이해하면 정리 예정.. --- # 2주차 A반 스터디 08.27 🧑‍💻 모각코 주제 - Type, Initializer ,H.I.G. ⭐️ 공부하면서 나눴던 이야기와 질문들 - struct, class의 차이점 - 값 타입과 참조 타입의 차이 - `mutating` 키워드 `inout` 키워드의 차이점 - inout 키워드를 사용하지 않고 인스턴스 밖에서 구조체의 저장 프로퍼티에 접근하는 방법 - Delegate Design Pattern - enum의 initializer - 기본앱 H.I.G 요소 분석 - 캘린더 앱 Ayaan - 팁 앱 준호 - 앨범 앱 Kyo - keynote 앱 Gundy - 설정 앱 jpush # Struct와 Class의 차이점 - Struct는 값 타입, Class는 참조 타입. - Struct는 상속불가능 - 타입캐스팅은 클래스만 허용한다. - 멤버와이즈 이니셜라이저는 구조체에서만 사용가능하다.(클래스에서는 따로 멤버와이즈처럼 init을 구성할 수 는 있다.) - 디이니셜라이저는 클래스에서만 활용할 수 있다. - 참조 횟수 계산은 클래스에서만 적용된다. - Struct를 사용하는 것이 유리한 경우 - 값의 집합을 캡슐화하는 것만이 목적일 때 - 캡슐화된 값을 참조하는 것보다 복사하는 것이 합당할 때 - 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때 - 상속받거나 자신을 상속할 필요가 없을 때 # mutating이란? - 구조체나 열거형같은 값타입의 메서드 내에서 프로퍼티의 값을 변경하고 싶을 때 사용하는 키워드 # inout 키워드란? - [inout 문서](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID545), [inout 번역문서](https://bbiguduk.gitbook.io/swift/language-reference/declarations#in-out-in-out-parameters) - 함수의 파라메터는 기본적으로 상수로 제공이 되는데, 파라미터의 값을 함수 바디내에서 바꾸고 싶을 때 inout키워드를 사용한다. 그리고 실제 함수 사용시 & 키워드 사용. - Copy-In-Copy-Out - 함수가 호출될 때 인자의 값은 복사된다. - 함수의 바디 내에서 복사본은 수정된다. - 함수가 반환될 때 복사본의 값는 기존 인자에 할당된다. - 예를들어 연산프로퍼티나 프로퍼티 옵저버가 있는 프로퍼티가 inout으로 전달되면 getter는 함수 호출부분, setter는 함수 반환부분으로 호출된다. # delegate 패턴 - 디자인 패턴의 한 종류 💯 - 위임자의 delegate 변수를 자신으로 설정함으로써, 자신이 위임자의 일을 대신 처리하겠다는 의미이다. - 원하는 기능을 가진 프로토콜을 채택한 타입의 변수를 가지고 그 변수에 일을 맡길 대상을 할당한다. 이후 그 변수를 이용해서 일을 처리한다. ### TMI IBAction의 IB: Interface Builder의 줄임말 --- # 1주차 A반 스터디 08.20 🧑‍💻 모각코 주제 • Optional, 예외처리, 에러처리 ⭐️ 공부하면서 나눴던 이야기와 질문들 • 옵셔널 언래핑에 대한 토론 진행. • try?로 nil을 할당할 수도 있는 코드에서 try!로 변경하면 일어나는 일. • Result 타입을 사용하면 엄청 코드가 깔끔해진다. • do - try - catch 문에서 catch 를 let error로 받아서 메소드나 프로퍼티를 사용하면 do - catch 지옥에 빠지지 않아도 된다. • Associated Values의 사용방법 # Optional 이란? - 값이 있을수도 있고 없을 수도 있다는 것을 표현한다. - # Optional 언래핑 하는 방법들 - Optional Binding - 옵셔널 바인딩 - `if let` `guard let` `switch` - Optional Chaining - 옵셔널 체이닝 - Nil-Coalescing - nil 병합연산 - Unconditional Unwrapping - 강제 언래핑 - `!`를 사용해서 강제로 언래핑한다. 런타임 에러가 발생할 수 있다. # Optional을 활용한 경우 예외사항을 처리하는 방법 # throws - throw / do - try - catch # try, try?, try! # Result 타입 # Associated Values -