본문 바로가기

전체 글

(30)
[Object] Chapter 03 - 역할, 책임, 협력 01 협력 협력이란 어떤 객체가 다른 객체에게 무엇인가를 요청하는 것이다. 한 객체는 어떤 것이 필요할 때 다른 객체에게 전적으로 위임하거나 서로 협력한다. 즉, 두 객체가 상호작용을 통해 더 큰 책임을 수행하는 것이다. 메시지 전송을 통해 자신의 요청을 전달할 수 있다. 메시지를 수신한 객체는 메서드를 실행해 요청에 응답한다. 여기서 객체가 메시지를 처리할 방법을 스스로 선택한다는 점이 중요하다. 외부 객체는 메시지만 전할 수 있을 뿐, 메시지를 어떻게 처리하는지는 메시지를 수신한 객체가 결정한다. 이는 객체는 자신의 일을 스스로 처리하는 자율적인 존재라는 것을 의미한다. 객체를 자율적으로 만드는 가장 기본적인 방법은 내부 구현을 캡슐화하는 것이다. 정리하자면, 자율적인 객체는 외부의 도움이 필요한 경..
[Object] Chapter 02 - 객체지향 프로그래밍 01 협력, 객체, 클래스 객체지향은 객체를 지향하는 것이다. 1. 어떤 클래스가 필요한지를 고민하기 전에 어떤 객체들이 필요한지 고민하라. 클래스의 윤곽을 잡기 위해서는 어떤 객체들이 어떤 상태와 행동을 가지는지를 먼저 결정해야 한다. 객체를 중심에 두는 접근 방법은 설계를 단순하고 깔끔하게 만든다. 2. 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 일원으로 봐야 한다. 객체는 다른 객체에게 도움을 주거나 의존하면서 살아가는 협력적인 존재다. 02 도메인의 구조를 따르는 프로그램 구조 문제를 해결하기 위해 사용자가 프로그램을 사용하는 분야를 도메인(domain)이라고 부른다. 객체지향 패러다임이 강력한 이유는 요구사항을 분석하는 초기 단계부터 프로그램을 구현하는 마지막 단계까지..
[Object] Chapter 01 - 객체, 설계 객체지향 패러다임을 설명하기 위해 추상적인 개념이나 이론을 앞세우지 않고, 가능하면 개발자인 우리가 가장 잘 이해할 수 있고 가장 능숙하게 다룰 수 있는 코드를 이용해 객체지향의 다양한 측면을 설명하려고 노력할 것이다. 소프트웨어 모듈은 세 가지 목적이 있다. 1. 실행 중에 제대로 동작 2. 변경을 위해 존재 3. 코드를 읽는 사람과 의사소통하는 것 (이해하기 쉬움) public class Theater { private var ticketSeller: TicketSeller init(ticketSeller: TicketSeller) { self.ticketSeller = ticketSeller } public func enter(audience: Audience) { if audience.bag.ha..
[UIKit] LSP 위반 케이스 (Forced Unwrapping의 위험성) 설명하기 앞서, 다음 함수에서 Crash가 발생할 수 있는 케이스가 있을까요? setDelegate(to:) 함수 내에서는 Crash가 발생되지 않는다는 가정을 하겠습니다. . . . 정답은 Crash가 발생할 수 있는 케이스가 있습니다. Crash가 발생한다면, 강제 언랩핑 부분에서 발생할 것이라는 게, 합리적인 생각일 텐데... 근데 왜? 이상하죠, UITableViewDelegate 타입인, tableView의 delegate가 nil이 아닌데 강제 언랩핑한다고 Crash 발생한다니요. 어떤 케이스에서 Crash가 발생할까요? 예를 들어 setDelegate function 이 다음과 같이 구현되어 있을 경우 Crash가 발생합니다. 분리해서 본다면, 각 function은 문제 될 것이 없어 보입니..
[RxSwift] Subject - ObserverType Encapsulation Subject는 RxSwift에서 빼놓을 수 없는 타입으로, 다양한 부분에서 활용이 가능합니다. Subject에 대한 개념적인 내용이 필요하시다면, 이전 포스팅 참고하시면 됩니다. [RxSwift] - [RxSwift] Subject에 대한 개념 [RxSwift] Subject에 대한 개념 Subject는 RxSwift를 사용하여 프로젝트를 진행할 경우 많이 접하게 될 항목들입니다. 여기에서는 Subject 자체에 대한 설명만 하려 합니다. Subject는 PublishSubject, BehaviorSubject, ReplaySubject세 가지.. ntomios.tistory.com 많이 사용하면서 개인적으로 필요하다고 느꼈던 부분은, ObserverType으로써의 기능을 숨기는 것입니다. 위 메서드를..
[RxSwift/Combine] RxSwift Disposable vs Combine AnyCancellable RxSwift의 Disposable, Combine의 AnyCancellable은 모두 구독을 처분, 취소하는 역할을 한다는 점에서 동일한 역할을 합니다. 중요한 차이점은 retain에 차이가 있어, 동작이 상이한 부분이 있다는 것입니다. 먼저 RxSwift의 Disposable은 subscribe 함수 내에서 observer에 의해 retain 되고 있습니다. 따라서 구독(subscribe) 이후 명시적으로 처분(dispose) 하지 않는다면, disposable은 complete, error가 발생하기 전까지 살아있게 됩니다. 반면 Combine의 AnyCancellable은 명시적으로 처분하지 않더라도, AnyCancellable을 소유하고 있는 객체가 소멸할 경우, 처분이 됩니다. 또한 AnyCa..
[SwiftUI/Combine] RxSwift 토이 프로젝트 Combine으로 작업 후 비교 분석 SwiftUI, Combine을 학습하면서 개념은 이해가 가지만 어떤 식으로 사용하면 좋을지 감이 잡히지 않았습니다. Combine은 RxSwift와 유사한 부분이 많기에, 난이도가 낮은 RxSwift를 사용하여 작업했던 토이 프로젝트를 SwiftUI + Combine으로 변경해보면 어느 정도 사용 방법을 터득하고, 이해할 수 있을 거 같아 시작하게 되었습니다! 2020/07/15 - [RxSwift] - [RxSwift] 토이 프로젝트를 통해 알아보는 RxSwift x MVVM [RxSwift] 토이 프로젝트를 통해 알아보는 RxSwift x MVVM 위와 같은 토이 프로젝트를 만들어 보면서, RxSwift 활용과 MVVM을 적용하는 방법에 대해서 다루고자 합니다. 이 토이 프로젝트는 실제 네트워크 통..
[UIKit] systemLayoutSizeFitting 사용 시, 주의 사항 이전 포스팅에서 systemLayoutSizeFitting을 사용하여 dynamic cell sizing 하는 방법에 대해 알아보았습니다. 2020/10/29 - [UIKit] - [UIKit] Dynamic cell sizing - systemLayoutSizeFitting [UIKit] Dynamic cell sizing - systemLayoutSizeFitting TableView/CollectionView를 포함하여 일반적인 View 사용 시, 텍스트 등의 내부 컨텐츠를 바탕으로 사이즈 구성이 필요한 경우가 있습니다. 이런 경우에는 Layout Constrains를 기반으로 뷰의 사이즈를 계산 ntomios.tistory.com systemLayoutSizeFitting에 대한 개념, 사용 방법..