itisjustK
코딩과 사람 사는 이야기
itisjustK
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • 일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠.. (0)
    • Web (43)
      • html & css (9)
      • django & python (15)
      • java script (9)
    • iOS (51)
      • Swift (42)
      • SwiftUI (5)
    • CS (25)
      • 자료구조 (6)
      • 운영체제 (3)
      • 데이터베이스 (9)
      • 네트워크 (7)
    • PS (34)
      • 알고리즘 & 자료구조 (0)
    • Life (36)
    • Retrospective (15)
    • Book (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 생활코딩 #이고잉 #HTML #코딩 #개발자
  • 독립서점
  • SwiftUI
  • 킨디
  • binding
  • 세그멘테이션
  • SWIFT
  • POSTECH
  • CoreData
  • 연결리스트
  • AppleDevloperAcademy
  • crud
  • CS
  • 개발자
  • 어플
  • nosql
  • ios
  • mongodb
  • 점주
  • 생활코딩

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
itisjustK

코딩과 사람 사는 이야기

[iOS 앱 프로그래밍] 음원 재생기 애플리케이션 - 6. MVC
iOS/Swift

[iOS 앱 프로그래밍] 음원 재생기 애플리케이션 - 6. MVC

2021. 8. 8. 13:35

프로그래밍 디자인 패턴이란 무엇인가? 

디자인 패턴의 저명한 인사들이 내린 정의이다.

 

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

 

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

프로그래밍 디자인 패턴은 소프트웨어를 설계할 때 특정 상황에서 자주 사용하는 패턴을 정형화한 것이며, 좋은 소프트웨어 설계를 위한 개발자들의 경험적 산물이다.

 

 

프로그래밍 디자인 패턴의 특징

  1. 경험을 통하여 얻음
  2. 특정한 형식을 갖고 체계적으로 작성되는 것이 일반적
  3. 패턴에는 각기 다른 추상화 수준이 존재하며 계속 진화

 

프로그래밍 디자인 패턴의 장점

  1. 의사소통에 도움. 디자인 패턴을 알고 있는 설계자들은 특정 문제에 대해 공통으로 알고 있는 패턴을 이용해 해결책에 대해 논의를 할 수 있기 때문에 더욱 원활하게 의사소통할 수 있음.
  2. 검증된 지식인 패턴을 사용하면 높은 완성도의 디자인을 빠른 시간에 만들어 낼 수 있기 때문에 소프트웨어 개발 비용을 줄일 수 있어서 경제적. 또한, 코드의 수준을 한 단계 높여 주고 적은 수의 클래스로 원하는 목적을 달성할 수 있는 환경이 제공.
  3. 좋은 설계나 아키텍처가 패턴이라는 이름으로 명명되어 있어 개발자는 그 패턴의 이름만으로도 그 소프트웨어의 구조를 알 수 있음. 이를 바탕으로 이전의 소프트웨어 개발에서 사용한 설계나 구조를 쉽게 이해할 수 있고, 새로운 소프트웨어로 빠르게 적용할 수 있어서 소프트웨어 재사용을 쉽게 해줌.

 

디자인 패턴의 분류

새로운 소프트웨어를 개발할 때마다 대부분 개발자는 어떤 클래스를 만들고 어느 시점에 객체를 생성하고 소멸시킬지, 데이터를 어떻게 받아서 처리할지, 구조 설계를 어떻게 할지 고민한다. 디자인 패턴 분류는 위와 같이 소프트웨어 코드를 작성할 때 자주 반복되는 특정 상황에서 설계를 용이하게 하며 코드의 재사용이 용이하도록 패턴을 정리해 놓은 것이다. 그중 가장 잘 알려진 분류법으로 GoF의 패턴분류 방법이 있다. GoF는 디자인 패턴을 목적과 범위로 분류했다.

 

• 목적
패턴이 무엇을 하는지 정의하는 것으로 "생성", "구조", "행위" 중의 한 가지 목적을 갖는다.

◦ 생성 (Creational Pattern)
객체의 생성 과정에 관여하는 패턴

◦ 구조 (Structural Pattern)
클래스나 객체의 구성을 통해 더 큰 구조로 만들 수 있게 해주는 것과 관련된 패턴

◦ 행위 (Behavioral Pattern)
패턴을 주로 클래스에 적용하는지 아니면 객체에 적용하는지에 따라 구분되는 패턴

 

• 범위
패턴을 클래스에 적용하는지 아니면 객체에 적용하는지에 따라 구분되는 패턴

◦ 클래스 패턴 (Class Pattern)
클래스들과 하위 클래스 간의 관계를 다루는 패턴. 컴파일 시에 관계가 결정.

◦ 객체 패턴 (Object Patterns)
객체 간의 관계를 다루며 보통 구성을 통해 정의. 객체 패턴은 일반적으로 실행시간에 관계가 생성되기 때문에 더 동적이면서 유연

 

디자인 패턴의 종류

수많은 패턴 중 몇 가지 패턴의 종류를 간단하게 설명

• 싱글턴 패턴 (Singleton Pattern)
목적 : 생성
범위 : 객체
객체의 생성에 관련된 패턴으로서 특정 클래스의 인스턴스가 오직 하나임을 보장하고 이 인스턴스에 접근할 방법을 제공

• 퍼사드 패턴 (Facade Pattern)
목적 : 구조
범위 : 객체
건물의 정문에 있는 안내소처럼 개발자가 사용해야 하는 서브 시스템의 가장 앞쪽에 위치하면서 하위 시스템에 있는 객체들을 사용할 수 있도록 하는 역할. 시스템의 복잡성을 줄이기 위해 서브 시스템을 구조화하고 서브 시스템으로의 접근을 하나의 퍼사드 객체로 제공하는 패턴

• 옵저버 패턴 (Observer Pattern)
목적 : 행위
범위 : 객체
객체의 상태변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 패턴

• 스트래티지 패턴 (Strategy Pattern)
목적 : 행위
범위 : 객체
알고리즘을 담당하는 각각의 클래스를 만들어 책임을 분산하기 위한 목적으로 만든 행위 패턴

• 팩토리 패턴 (Factory Pattern)
목적 : 생성
범위 : 클래스
객체를 생성하기 위한 인터페이스를 정의하지만 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 하위 클래스에서 이루어지도록 인스턴스 생성의 책임을 떠넘기는 패턴

• 어댑터 패턴 (Adapter Pattern)
목적 : 구조
범위 : 클래스, 객체
클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 동작하도록 해줌

 

 

 

 

MVC (Model-View-Controller)

MVC(Model-View-Controller) 디자인 패턴은 애플리케이션의 객체를 모델, 뷰, 컨트롤러의 세 가지 역할 중 하나의 역할로 할당한다. 이 패턴은 애플리케이션 내에서 객체가 수행하는 역할 뿐만 아니라 객체가 서로 통신하는 방식을 정의한다. 세 가지 유형의 객체는 각각 추상적인 경계에 의해 다른 객체와 구분되며, 그 경계를 넘어 다른 유형의 객체와 통신한다. 애플리케이션 내의 특정 MVC 유형을 한데 모아 레이어(예: 모델 레이어)라고도 한다.

 

 

모델 객체 (Model Objects)

애플리케이션과 관련된 데이터를 캡슐화하고, 해당 데이터를 조작하고 처리하는 로직과 계산을 정의한다. 하나의 모델 객체는 다른 모델 객체와 일대일 또는 일대다 대응 관계를 맺을 수 있다. 예를 들면 게임 속 캐릭터를 나타내거나 주소록의 연락처를 나타낼 수도 있다. 모델 객체는 데이터를 사용자에게 제공하거나 사용자가 이를 편집할 수 있는 뷰 객체에 명시적으로 연결되어서는 안된다. 즉, 사용자 인터페이스나 표시 문제와 관련이 있어서는 안된다.

 

 잘 설계된 모델 클래스
모델 클래스, 즉 모델 객체를 생성하는 클래스는 Core Data technology를 사용하고 있는 경우 NSManagerdObject 서브 클래스를 많이 사용한다. Objective-C 언어를 사용하는 경우 모델 클래스는 일반적으로 NSObject의 서브클래스이다. 스위프트 언어를 사용하는 경우에는 특별한 경우가 아니라면 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 메서드에서 객체 값을 가지는 모든 인스턴스 변수를 해제해야 한다.

◦ 객체 인코딩
모델 클래스의 객체를 보관하려는 경우, 해당 객체의 인스턴스 변수를 인코딩 및 디코딩할 수 있어야 한다.

◦ 객체 복제
클라이언트가 모델 객체를 복제할 것으로 예상하는 경우, 클래스에서 객체 복제를 구현해야 한다.

 


뷰 객체 (View Objects)

뷰 객체는 애플리케이션 내에서 사용자가 볼 수 있는 객체를 말한다. 자신이 보이는 방법을 알고 있고 사용자 동작에 응답할 수 있다. 뷰 객체의 주된 목적은 애플리케이션의 모델 객체의 데이터를 보여주고 해당 데이터를 편집할 수 있도록 하는 것이다. 그럼에도 불구하고, 뷰 객체는 MVC 애플리케이션의 모델 객체와는 일반적으로 분리된다. 주소록을 예를 들면 전화번호 및 정보가 보이는 화면들을 말한다.

 


컨트롤러 객체 (Controller Objects)

컨트롤러 객체는 하나 이상의 애플리케이션 뷰 객체와 하나 이상의 모델 객체 사이의 코디네이터 또는 중개자 역할을 한다. 모델-뷰-컨트롤러 디자인 패턴에서 컨트롤러 객체(또는 컨트롤러)는 사용자가 버튼을 탭/클릭하거나 텍스트 필드에서 텍스트를 입력하는 것처럼, 뷰 객체에서 이루어진 사용자 동작 및 의도를 해석하며, 신규 혹은 변경된 데이터를 모델 객체에 전달한다. 따라서 컨트롤러 객체는 뷰 객체로 하여금 모델 객체의 변경사항을 인지하거나, 그 반대의 경우가 가능하도록 하는 매개체가 된다. 컨트롤러 객체는 애플리케이션의 설정 및 조정 작업을 수행할 수도 있으며, 다른 객체들의 생애주기(life cycle)를 관리하기도 한다. iOS 환경의 Cocoa Touch 프레임워크는 코디네이팅 컨트롤러, 뷰 컨트롤러의 두 가지 기본 컨트롤러 유형을 제공한다.

 

코디네이팅 컨트롤러 (Coordinating Controllers)
코디네이팅 컨트롤러는 애플리케이션 전체 혹은 일부 기능을 감독하고 관리한다. 애플리케이션별로 다른 로직이 각 애플리케이션에 주입(injected)되는 장소라고 할 수 있으며, 그 기능은 다음과 같다.

◦ 델리게이션(delegation) 메시지에 응답하고 알림(notifications)을 관리.

◦ 사용자가 버튼과 같은 컨트롤을 탭 하거나 클릭함에 따라 전송되는 동작 메시지(action message)에 응답.

◦ 객체 간의 연결을 확립하거나 기타 설정 작업을 수행. (예: 애플리케이션을 시작하는 경우)

◦ 소유한(owned) 객체의 생명 주기 관리.

* iOS 애플리케이션에서는 뷰 컨트롤러가 코디네이팅 컨트롤러의 역할을 겸하는 경우가 많다.


뷰 컨트롤러 (View Controller)
UIKit에서 뷰 컨트롤러는 콘텐츠를 화면에 표시하는 뷰를 관리하며, 해당 뷰에 대한 참조(reference)를 유지하고, 뷰 컨트롤러는 이 뷰의 프레젠테이션(presentation) 및 후속 뷰로의 전환(transition)을 관리한다. 이와 관련된 모든 프레젠테이션 동작 뷰 컨트롤러 객체에 의해 관리되고 구현된다. 또한, 모달뷰를 표시하고 메모리 부족 경고에 응답하며 기기의 방향(orientation)이 바뀔 때 뷰를 회전시킨다.


iOS의 뷰 컨트롤러는 UIViewController 서브클래스의 인스턴스다. UIKit은 UITableViewController와 같은, UIViewController의 여러 특수 목적 서브클래스를 제공한다. 컨트롤러가 모델과 뷰 간에 데이터를 중개하도록 반드시 프레임워크의 뷰-컨트롤러 클래스(예 : UIViewController, UITableViewController 등)를 확장해야 한다. 뷰 컨트롤러는 여러 가지 프레임워크 객체에 대한 델리게이트 혹은 데이터 소스 객체인 경우가 많다.

저작자표시

'iOS > Swift' 카테고리의 다른 글

[iOS 앱 프로그래밍] 회원가입 화면 구현 - 2. 화면의 전환 (1) 내비게이션 인터페이스  (0) 2021.08.09
[iOS 앱 프로그래밍] 회원가입 화면 구현 - 1. H.I.G  (0) 2021.08.09
[iOS 앱 프로그래밍] 음원 재생기 애플리케이션 - 5. iOS의 View 체계  (0) 2021.08.08
[iOS 앱 프로그래밍] 음원 재생기 애플리케이션 - 4. 오토 레이아웃 (1)  (0) 2021.08.05
[iOS 앱 프로그래밍] 음원 재생기 애플리케이션 - 3. Foundation과 UIKit 그리고 Cocoa Touch  (0) 2021.08.04
    'iOS/Swift' 카테고리의 다른 글
    • [iOS 앱 프로그래밍] 회원가입 화면 구현 - 2. 화면의 전환 (1) 내비게이션 인터페이스
    • [iOS 앱 프로그래밍] 회원가입 화면 구현 - 1. H.I.G
    • [iOS 앱 프로그래밍] 음원 재생기 애플리케이션 - 5. iOS의 View 체계
    • [iOS 앱 프로그래밍] 음원 재생기 애플리케이션 - 4. 오토 레이아웃 (1)
    itisjustK
    itisjustK

    티스토리툴바