소프트웨어를 설계할 때 특정 상황에서 자주 사용하는 패턴을 정형화한 것이며, 좋은 소프트웨어 설계를 위한 개발자들의 경험적 산물
장점
새로운 소프트웨어를 개발시 어떤 클래스를 만들고 어느 시점에 객체를 생성하고 소멸시킬지, 데이터를 어떻게 받아서 처리할지, 구조 설계를 어떻게 할지 정해야 하는데, 디자인 패턴이 코드 작성시 반복되는 특정 상황에서 설계를 용이하게 하며, 코드의 재사용이 용이하도록 패턴을 정리해 놓은 것이다.
패턴이 무엇을 하는지 정의하는 것으로 "생성","구조","행위" 중 한가지 목적을 갖습니다.
패턴을 클래스에 적용하는지 아니면 객체에 적용하는지에 따라 구분되는 패턴
클래스 패턴
객체 패턴
객체 간의 관계를 다루며 보통 구성을 통해 정의
일반적으로 실행시간에 관계가 생성
→ 동적이면서 유연
목적 / 범위
Q. 디자인 패턴이 모든 상황에서 좋은 건 아닙니다. 예를 들어 싱글톤 패턴이 적절치 못한 상황에서는 독이 될 수 있는데 어떤 경우에는 오히려 싱글톤 패턴이 사용하면 안좋을까요?
A.
MVC 디자인 패턴은 애플리케이션의 객체를 모델, 뷰, 컨트롤러 세가지 역할 중 하나의 역할로 할당합니다.
이 패턴은 애플리케이션 내에서 객체가 수행하는 역할 뿐만 아니라 객체가 서로 소통하는 방식을 정의합니다.
애플리케이션과 관련된 데이터를 캡슐화
해당 데이터를 조작하고 처리하는 로직과 계산을 정의
하나의 모델 객체는 다른 모델 객체와 일대일 , 일대다 대응 관계를 맺을 수 있음
단, 데이터를 사용자에게 제공하거나 사용자가 이를 편집할 수 있는 뷰 객체에 명시적으로 연결되선 안됨
스위프트 언어를 사용하는 경우에는 특별한 경우가 아니라면 NSObject를 상속받지 않습니다.
값 타입의 모델이 필요한 경우 클래스 대신에 구조체를 활용
서브 클래스 구현시 클래스 디자인에서 다음 사항을 고려
◦ 인스턴스 변수
애플리케이션 내에 캡슐화된 데이터를 유지하기 위한 인스턴스 변수를 선언합니다. 인스턴스 변수는 객체, 스칼라 값, 또는 NSRange와 같은 구조체(structure)일 수 있습니다. 비객체형(nonobject types)대신 객체형을 사용하는 데에는 장단점이 있으므로, 객체 상호 관계(object mutuality)를 고려해야 합니다.
◦ 접근자 메서드(Accessor methods)와 프로퍼티
접근자 메서드는 일반적으로 인스턴스 변숫값을 획득 및 설정하며, 흔히 획득자 및 설정자 메서드(getter and setter methods)라고도 알려져 있습니다. 스위프트의 언어를 사용하는 경우, 인스턴스 변수를 private 또는 fileprivate 등으로 접근을 제한한 경우, 인스턴스 외부에서(fileprivate의 경우는 다른 소스파일에서) 접근하려면 접근자 메서드가 필요합니다.
◦ 키-값(Key-value) 코딩
키-값 코딩은 클라이언트가 프로퍼티 이름을 키로 사용하여 객체의 프로퍼티에 접근할 수 있게 하는 메커니즘입니다. Core Data에서 사용하고 있으며 Cocoa의 다른 곳에서도 사용하고 있습니다. 접근자 메서드의 이름 지정 (또한, 암시적으로는 선언된 프로퍼티의 이름 지정)이 이 메커니즘의 요소가 됩니다.
◦ 초기화 및 할당 해제 (Initialization and deallocation)
대부분 모델 클래스는 인스턴스 변수를 적절한 초깃값으로 설정하는 이니셜라이저 메서드를 구현합니다. 여기서 초기화는 이니셜라이저 메서드의 표준 형식을 따라야 하며, deinit 메서드에서 객체 값을 가지는 모든 인스턴스 변수를 해제해야 합니다.
◦ 객체 인코딩
모델 클래스의 객체를 보관하려는 경우, 해당 객체의 인스턴스 변수를 인코딩 및 디코딩할 수 있어야 합니다.
◦ 객체 복제
클라이언트가 모델 객체를 복제할 것으로 예상하는 경우, 클래스에서 객체 복제를 구현해야 합니다.
코디네이팅 컨트롤러는 애플리케이션 전체 혹은 일부 기능을 감독하고 관리 합니다. 애플리케이션별로 다른 로직이 각 애플리케이션에 주입(injected)되는 장소라고 할 수 있으며, 그 기능은 다음과 같습니다.
◦ 델리게이션(delegation) 메시지에 응답하고 알림(notifications)을 관리.
◦ 사용자가 버튼과 같은 컨트롤을 탭 하거나 클릭함에 따라 전송되는 동작 메시지(action message)에 응답.
◦ 객체 간의 연결을 확립하거나 기타 설정 작업을 수행. (예: 애플리케이션을 시작하는 경우)
◦ 소유한(owned) 객체의 생명 주기 관리.