이 포스팅은 iOS BoostCourse 시리즈 23 편 중 5 번째 글 입니다.

  • Part 1 - 01: Asset, App thinning
  • Part 2 - 02: Foundation, UIKit
  • Part 3 - 03: Auto Layout
  • Part 4 - 04: View 체계
  • Part 5 - This Post
  • Part 6 - 06: MVC
  • Part 7 - 07: Apple Development Documents
  • Part 8 - 08: Human Interface Guidelines
  • Part 9 - 09: 화면 전환
  • Part 10 - 10: 뷰의 상태 변화 감지
  • Part 11 - 11: Delegation
  • Part 12 - 12: Singleton
  • Part 13 - 13: Target-Action
  • Part 14 - 14: Gesture Recognizer
  • Part 15 - 15: TableView
  • Part 16 - 16: Segue
  • Part 17 - 17: Json 다루기
  • Part 18 - 18: PhotoKit
  • Part 19 - 19: 동시성, 비동기, 병렬 프로그래밍
  • Part 20 - 20: OperationQueue
  • Part 21 - 21: SchrollView
  • Part 22 - 22: Naviagtion item, Bar button item
  • Part 23 - 23: CollectionView
▼ 목록 보기

이전에도 공부해보았는데, 보다 실전적으로 이해해보자.

  • 유사한 상황에서 대처하는 방법을 정형화해 둔 것.
  • 정답은 아니지만 참고할 수 있다.

디자인 패턴이란?

  • Design Patterns라는 책이 출간되면서 부터 영향을 끼치게 됨
  • Gang of Four의 저자들이 23개의 객체지향설계를 위한 패턴을 기술함
  • 이를 시작으로 패턴에 대한 것들이 출간되게 됨

Gof : 특정한 상황에서 일반적 설계문제를 해결하기 위해 상호교휴하는 수정 가능한 객체와 클래스에 대한 설명이다.

라만 : 숙련된 객체지향 개발자 및 기타 소프트웨어 개발자는 소프트웨어 개발의 가이드라인이 되는 일반적인 원칙들과 관용적인 해결책들의 레퍼토리(repertoire)를 구축한다. 패턴은 이러한 원칙들과 관용적 해결책들이 문제와 해결책을 기술하는 구조적인 형태로 체계화되고 명명된 것이다.

프로그래밍 디자인 패턴은 소프트웨어를 설계할 때, 특정 상황에서 자주 사용되는 패턴을 정형화한 것.

특징

  • 경험…이 중요하다.
  • 형식을 갖고 체계적으로 작성됨
  • 추상화 수준이 존재하고, 계속 진화함
  • 의사소통에 도움을 줌
  • 이 패턴은 어느정도 검증된 것임. 그렇기 때문에 빠른시간에 높은 완성도를 기대할 수 있음
    • 소프트웨어 개발 비용을 줄일 수 있음
    • 또한 잘 사용하면 코드의 수준을 높여줌
  • 좋은 설계나 아키텍쳐를 추상화하여 패턴이란 이름으로 명시해두었기 때문에 구조를 빠르게 파악할 수 있음
    • 결국 빠른 적용, 재사용에 용이

분류

새로운 소프트웨어를 개발할 때마다, 대부분 클래스 정의, 생성, 소멸, 처리, 구조설계 등의 고민을 한다. 이러한 방법에 있어서 GoF는 디자인 패턴을 목적과 범위로 분류했다.

  • 목적
    • 패턴이 무엇을 하는지 정의
    • 생성
      • 객체의 생성 과정에 관여하는 패턴
    • 구조
      • 클래스나 객체의 구성을 통해 더 큰 구조로 만들 수 있게 해주는 것과 관련된 패턴
    • 행위
      • 패턴을 주로 클래스에 적용하는지, 객체에 적용하는지에 따라 구분되는 패턴
  • 범위
    • 패턴을 클래스에? 아니면 객체에 적용하는지에 따라 구분되는 패턴
    • 클래스 패턴
      • 클래스들과 하위 클래스 간의 관계를 다루는 패턴
      • 컴파일 시 관계가 결정된다.
    • 객체 패턴
      • 객체 간의 관계를 다루며, 보통 구성을 통해 정의
      • 일반적으로 런타임에 관계가 생성됨
      • 그렇기 때문에 동적이면서 유연함

종류

  • 싱글턴 패턴 (Singleton Pattern)
    • 목적 : 생성
    • 범위 : 객체
    • 객체에 생성에 관련된 패턴
    • 특정 클래스의 인스턴스가 오직 하나임을 보장하고
    • 이 인스턴스에 접근하는 방법을 제공
  • 파사드 패턴 (Facade Pattern)
    • 목적 : 구조
    • 범위 : 객체
    • 건물 정문에 있는 안내소처럼 개발자가 사용하는 시스템의 가장 앞쪽에 위치
    • 하위 시스템에 있는 객체들을 사용할 수 있게 함
    • 시스템이 복잡할 경우 서브 시스템을 구조화하고
    • 접근을 하나의 객체로 하기위해 사용함
    • 즉 앞단에서 감싸서 쉽게 사용할 수 있게 만든다는 것
  • 옵저버 패턴 (Observer Pattern)
    • 목적 : 행위
    • 범위 : 객체
    • 객체의 상태 변화를 관찰하는 관찰자의 목록을 객체에 등록하여
    • 상태 변화가 있을 때마다 메서드를 통해 옵저버에게 통지하도록 하는 패턴
  • 스트래티지 패턴 (Strategy Pattern)
    • 목적 : 행위
    • 범위 : 객체
    • 알고리즘을 담당하는 각각의 클래스를 만들어 책임을 분산하기 위한 목적으로 만든 행위 패턴
  • 팩토리 패턴 (Factory Pattern)
    • 목적 : 생성
    • 범위 : 클래스
    • 객체를 생성하기 위한 인터페이스를 정의하지만
    • 어떤 클래스의 인스턴스를 생성할지에 대한 결정을 하위 클래스에서 이루어지도록 인스턴스의 생성의 책임을 떠넘기는 패턴
  • 어댑터 패턴 (Adapter Pattern)
    • 목적 : 구조
    • 범위 : 클래스, 객체
    • 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환
    • 기존의 클래스를 수정하지 않고 어댑터 클래스를 만들어 함께 동작할 수 있도록 해줌

생각해 볼 점

  • 경험의 산물이자 방법론
  • 따라서 만능이 아니다.
  • 잘못 사용하면 큰 독이 될 수 있다.
  • 제대로 알고 사용해야 한다.

연습

싱글턴 패턴은 iOS 애플리케이션 어디에 사용되고 있을까?

imagesingleton pattern

  • 어플리케이션이 요정하는 횟수에 관계없이 동일한 인스턴스 반환
  • NSFileManager
    • 파일 시스템 컨텐츠를 상호작용하기 위한 인터페이스
  • NSWorkspace
    • 파일, 디바이스에 대한 정보를 열고 다룰 수 있음
    • 파일 시스템의 변화를 추적함
    • 유저 데이터 베이스 변화 추적
    • 파일을 위한 탐색기 정보를 세팅, 및 가져옴
    • 앱 실행
  • UIKit/UIApplication
    • 앱에 하나씩 있는 중앙집중 제어 객체
  • UIKit/UIAccelerometer
    • 가속도 계