분류 전체보기

    DI Container

    Dependency와 injection & SOLID의 의존관계 역전 원칙(DIP)의 사전지식이 필요하다. https://clamp-coding.tistory.com/447 Dependency Container란 무엇인가. 의존성 주입을 해줄 때는 외부에서 인스턴스를 만들어서 주입해준다. 외부에서 인스턴스를 만들어서 주입해주는 곳은 여러곳일 수 있다. 즉 인스턴스를 만드는 위치가 분산되어있다. 근데 Container라는 것이 있고 Container가 모든 인스턴스를 다 가지고 있고, 관리한다고 생각해보자.. Container에 앞으로 내가 사용할 모든 인스턴스를 다 만들어서 등록해두고 => register 필요한 시점에 Container에게 특정 타입의 인스턴스를 달라고하면 Container가 꺼내주는 ..

    [iOS] Coordinator Pattern

    Coordinator Pattern Coordinator 패턴은 ViewController가 보유하던 책임 중 Navigation과 관련된 부분을 다른 인스턴스에서 책임지도록 하는 패턴이다. 기존의 ViewController에서 직접 화면 전환 방식 기존의 방식은 ViewController에서 직접적으로 화면 전환을 시행하고, 다음에 띄워질 다른 ViewController에대해 기존 ViewController가 알고있어야 하는 구조이다. 이는 ViewController간에 심한 커플링을 발생시킨다. 이를 해결한 것이 Coordinator 패턴이다. Coordinator 패턴 모든 ViewController는 Coordinator 인스턴스만 보유할 뿐, 다른 ViewController 인스턴스를 직접적으로..

    [iOS] Static/Dynamic Library

    Library Xcode Target의 일부로 빌드되지 않은 코드 및 데이터 조각을 정의한 것. 라이브러리는 다른 프로젝트에서 재사용 할 수 있는 코드 및 리소스 모음을 나타낸다. 여기에는 특정 기능을 제공하거나 일반적인 프로그램이 문제를 해결하는 미리 작성된 함수, 클래스 및 기타 구성 요소가 포함되어있다. 단순히 코드 및 데이터 조각을 정의했고 이걸 내 앱 코드에 가져다 쓰고싶다. 라이브러리와 앱의 소스코드 파일을 병합(merge)하는 프로세스를 Link라고 한다. 라이브러리는 앱에 Link되는 방식에 따라 두 가지로 나뉘게 된다. Static Library - ".a" 접미사를 가진다 Dynamic Library - "dylib" 접미사를 가진다 Static Library Static Library..

    [iOS] Class의 성능을 향상시킬 수 있는 방법들

    final, private키워드를 사용해 성능을 향상시킬 수 있다. 여러 방법이 있지만 메서드 디스패치(Method Dispatch)와 관련이 있다. https://clamp-coding.tistory.com/364 [Swift]. Method Dispatch Method Dispatch 실제로 Method는 CPU에대한 명령어이며, 실제론 코드 영역에만 존재한다. 그렇기 때문에 코드 영역에 있는 메서드를 실행시키려면 메서드 주소가 필요하다. 그런데 그 메서드 주소를 clamp-coding.tistory.com final final이 붙은 클래스는 상속이 불가하기 때문에 하위 클래스에서 이들을 오버라이딩 될 수 없게 되므로 자연스럽게 Static Dispatch로 동작하게 된다. private(접근제어)..

    [iOS] Boudns와 Frame

    Bouns: 뷰의 위치가 뷰 자신의 좌표계에 의해 결정된다. Frame: 뷰의 위치가 부모뷰에 의해 결정된다. Frame Frame은 뷰의 좌표가 부모뷰를 기준으로 결정된다. Bounds Bouns는 본인의 좌표계에 의해 위치가 정해지기 때문에 어느 위치에 있던 (0, 0)을 유지한다. 왜 굳이? 이유를 알기 위해 Frame을 이해해야한다. Frame은 단순히 만드려는 뷰를 나타내는 것이 아니라 만드려는 뷰를 감싸는 사각형 모양의 뷰이다. 그리고 Frame의 좌표와 크기도 이렇게 감싸는 사각형의 좌표와 크기를 나타낸다. Frame은 감싸고 있는 뷰가 회전한다면 그에 맞춰 크기와 좌표가 바뀌게된다. 하지만 Bounds는 본인의 크기와 좌표 (0, 0)을 유지하게 된다. 용도의 차이 Frame: 좌표를 기준..

    [Clean Architecture] Clean Architecture에서 Entity, Use case, Presenter등 구성요소가 무엇인가.

    Clean Architecture + MVVM에대한 글을 읽다보면 아무 지식 없이는 이해할 수 없는 부분이 있다. Entity, Usecase, Repository등 단어자체의 개념적인 이해가 정확히 정리되어있지 않다보니 완벽하게 이해할 수 없다. 이런 용어들을 정리한 블로그를 너무 찾기 힘들기 때문에 이에대한 용어의 정리가 필요하다고 느껴 정리해보려한다. 혹시 틀린점이 있다면 정중히 댓글 부탁드립니다. Entity Entity( = Enterprize Business Rules): Actor가 필요로 하는 데이터의 모델을 의미한다. 특정 '도메인'에서 사용되는 struct 모델 ex) Actor가 필요로 하는 Movie와 MoviewPage에 대한 Entity struct Movie: Equatable..

    [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 { ..