분류 전체보기

    [Clean Architecture] SOLID원칙 06. 의존성 주입과 의존성 역전원칙(DI, DIP)

    Dependency(의존성) 객체지향 프로그래밍에서 Dependency, 의존성은 서로 다른 객체 사이에 의존 관계가 있다는 것을 말한다. 즉, 의존하는 객체가 수정되면 다른 객체도 영향을 받는다는 것이다. 예를들어 아래의 코드를 보자. class A{ var num = 1 } class B{ var internalVariable = A() } let b = B() print(b.internalVariable.num) // 1 B클래스는 A클래스를 내부변수로 사용하고있다. 이로써 B클래스는 A클래스에 의존성이 생긴다. 객체끼리 의존하는 경우 많은 문제가 야기된다. 만일 A클래스에 문제가 생긴다면 이를 의존하고 있는 B클래스에도 문제가 생길 수 있으며 재사용성이 낮아진다. (재사용이 가능한건 최상위 클래스..

    [Clean Architecture] SOLID원칙 05. ISP(Interface Segregation Principle) 인터페이스 분리 원칙

    클라이언트는 그들이 사용하지 않는 인터페이스에 의존해서는 안된다. 불필요한 인터페이스 요소들을 포함시키지 말라는 의미이다. 불필요한 요소들이 포함되면서 복잡해지고, 무거워짐에 따라 진작 원하는 정보를 얻을 수 없는 지경에까지 이르기도 한다. 이 문제는 클래스나 프로토콜 모두에게 영향을 줄 수 있다. Protocol protocol의 경우를 먼저 본다. "터치"를 했을 때 반응을 구현해줄 didTap 메서드를 가지고 있는 GuestureProtocol을 보자. protocol GusetureProtocol{ func didTap() } 이후에 더 많은 제스처들을 추가해주고싶어서 프로토콜에 추가한다면? protocol GusetureProtocol{ func didTap() func didDoubleTap(..

    [Clean Architecture] SOLID원칙 04. LSP(Liscov Substitution Principle) 리스코프 치환 원칙

    부모(super class)로 동작하는 곳에서 자식(sub class)를 넣어주어도 대체가 가능해야 한다는 원칙. 자식 클래스를 구현할 때, 기본적으로 부모클래스의 기능이나 능력들을 물려받는다. 여기서 자식클래스는 동작을 할 때, 부모 클래스의 기능들을 제한하면 안된다는 뜻. 부모클래스의 타입에 자식클래스의 인스턴스를 넣어도 똑같이 동작하여야 한다. 나쁜 예. class Rectangle { var width: Float = 0 var height: Float = 0 var area: Float{ return width * height } } class Square: Rectangle { override var width: Float{ didSet{ height = width } } } func prin..

    [Clean Architecture] SOLID원칙 03. OCP(Open-Closed Principle) - 개방 폐쇄 원칙

    확장에는 열려있으나 변경에는 닫혀있어야 한다는 원칙 어떤 기능을 추가할 때, 기존의 코드는 만지지 않고 새로 동작하는 기능에 대해서만 코드가 작성되어야 한다. 이런 원칙을 지키기 위해서는 다양한 방법들이 있다. 프로토콜을 활용할 수 있다. 만약 동물의 소리를 내는 동물원이라는 변수가 있는데 여기에 새로운 동물이 추가된다고 생각하면 어떻게 구현했느냐에 따라 OCP를 지키느냐 안지키느냐로 나뉠 수 있다. 이전의 SRP 예제에서도 프로토콜을 이용해서 OCP원칙을 잘 지키고 있다. 만약 새롭게 DB, API Call, Decoding의 로직을 수행하고 싶으면 단지 각각의 프로토콜을 구현하고 있는 객체를 외부에서 주입하면 되기 때문에 새로운 기능에도 변화없이 대응 가능하게 된다. 안좋은 예 class Dog { ..

    [Clean Architecture] SOLID원칙 02. SRP(Single Responsibility Principle) 단일 책임 원칙

    SRP(Single Responsibility Principle) 개념 하나의 객체는 하나의 책임을 가져야 한다. 즉 하나의 class가 여러 기능을 담당하면 안된다. 예제코드 class LoginService { func login(id: String, pw: String) { let userData = requestLogin() let user = decodeUserInform(data: userData) saveUserOnDatabase(user: user) } private func requestLogin() -> Data { // Call API return Data() } private func decodeUserInform(data: Data) -> User { // Decoding User..

    [Clean Architecture] SOLID원칙 01. 클래스 다이어그램 표현

    https://www.raywenderlich.com/books/design-patterns-by-tutorials/v3.0/chapters/2-how-to-read-a-class-diagram Class Disagram 클래스 다이어그램은 엔지니어링의 청사진이다. 그림, 기호 및 주석을 통해 시스템에 대한 정보를 제공한다. 클래스 다이어그램, 아키텍쳐 도면 및 시스템 일러스트레이션을 만들기 위한 UML(Unified Modeling Language)에 대해 간단히 정리한다. 클래스 다이어그램에는 무엇이 있는가? 클래스 다이어그램에는 클래스, 프로토콜, 속성, 메서드 및 관계가 포함된다. 클래스 네모는 클래스를 나타낸다. 아래는 매우 간단한 클래스(Dog) 다이어그램이다. 상속 관계 한 클래스가 다른 클..

    [iOS] Clean Architecture

    https://tech.olx.com/clean-architecture-and-mvvm-on-ios-c9d167d9f5b3 Clean Architecture and MVVM on iOS When we develop software it is important to not only use design patterns, but also architectural patterns. There are many different… tech.olx.com 클린아키텍처에 대해 공부해보려한다. 모든 소스코드와 내용은 상단 글의 번역과 정리를 토대로 한 내용입니다. 클린아키텍처(Clean Architecture)? 소프트웨어를 개발할 때 디자인 패턴 뿐 아니라 아키텍처 패턴도 사용하는 것이 중요하다. 소프트웨어 엔지니어링..

    [Swift] 메타타입(Metatype)

    메타타입 메타타입이란 타입의 타입이다. 클래스의 타입, 구조체의 타입, 열거형 타입, 프로토콜의 타입도 메타타입이다. 어떤 클래스 SomeClass의 메타타입은 SomeClass.Type이다. 어떤 프로토콜 SomeProtocol의 메타타입은 SomeProtocol.Protocol이다. 어떤 타입에 .self를 붙이면 해당 타입을 어떤 값으로 접근할 수 있다. 예를 들어 SomeClass.self는 SomeClass의 인스턴스를 리턴하는게 아니라 SomeClass 라는 것 자체를 리턴한다.(프로토콜도 마찬가지)

    [iOS] UIResponder

    Xcode 프로젝트를 만들면 AppDelegate와 SceneDelegate가 존재한다 이 클래스는 UIResponder를 상속받게된다. https://developer.apple.com/documentation/uikit/uiresponder UIResponder | Apple Developer Documentation An abstract interface for responding to and handling events. developer.apple.com 이벤트에 응답하고 처리하기 위한 추상 인터페이스이다. UIResponder는 터치, 동작 및 키보드 이벤트와 같은 사용자 이벤트에 응답하는 개체의 기본 클래스이다. 즉 애플리케이션의 뷰 계층 구조에 있는 개체로 이벤트를 처리하고 전달하는 역할을..

    [iOS] NSObject

    iOS의 Cocoa는 NSObject를 상속받는 모든 클래스를 가리키는 단어이다. 따라서 CocoaTouch프레임워크란 iOS환경을 구축하기위한 최상위 프레임워크이며 일반적으로 옵씨에서의 NSObject와 스위프트에서 사용되는 UIKit, Foundation 등에 포함되는 대부분의 클래스가 여기에서 속한다. NSObject는 Objective-C 및 Swift 프로그래밍 언어의 기본 클래스이며 해당 언어에서 대부분의 다른 클래스의 루트 클래스 역할을 한다. UIButton은 UIControl을 상속하고, UIView는 UIResponder, UIResponder는 NSObject를 상속한다. NSObject는 어플리케이션의대부분의 객체에 필요한 기본 동작을 정의하는 클래스이다. 객체를 생성, 복사, 비교..