[Design Pattern] Delegate Pattern

Delegate Pattern


Delegate Pattern

OOP(객체지향프로그래밍)에서 하나의 객체가 모든 일을 처리하는 것이 아니라 일들 중 일부를 다른 객체에 넘기는 것

  • 효율성 관점에서 아주 중요
    • 기능을 위임할 수 잇는 객체가 있다는 것은 그만큼 직접 구현해야 하는 부분이 적다는 것이기 때문
  • 기능을 처리할 객체를 Delegate로 설정하고, 특정 이벤트가 발생할 때 이를 Delegate에 의해 위임된 본래의 객체로 전달해 줌
데이터를
받을 View
<->데이터를
전달할 View
- 프로토콜 채택
- 실제 구현
- 대리자 위임
<->- 타입이 프로토콜인
프로퍼티 생성
- Delegate 사용

사용하는 경우

  • 하나의 객체가 해야하는 일이 여러가지일 경우
  • 수신 받는 객체가 많을 때, 콜백 블럭을 받기 위한 목적이 분명할 경우
  • 내부의 블록을 호출시키는 코드를 읽고 다시 돌아와서 추적할 일이 없는 경우

사용하는 이유

  • Delegation은 한 클래스와 다른 클래스의 상호작용을 간단히 할 수 있도록 도움
  • 클래스 간 요구 사항을 전달해주는 프로토콜만 있으면 연결 수월해 짐
  • 완전한 클래스 또는 구조체를 상속할 필요가 없기 때문에 더욱 가볍게 사용할 수 있음
  • Delegate Pattern은 1:1 관계에서 매우 유용
    (1:N 또는 N:N 관계에는 Observer Pattern이 유용)
  • 델리게이트는 프로토콜을 준수하는 것 만으로 구현이 가능하므로 매우 유연
  • 제어하지 않는 코드 내에서 발생하는 이벤트를 연결할 수 있는 좋은 방법

사용 시 유의점

  • Delegate Pattern은 굉장히 유용하지만, 과도하게 사용될 위험성이 존재
    • 객체에 너무 많은 위임을 생성하지 않도록 주의 
  • 강한 참조 순환이 발생하지 않도록 유의
    • 보통 Delegate 프로퍼티의 경우 weak으로 선언

장점과 단점

장점

  • 재사용할 수 있는 코드를 작성 가능 (프로토콜의 장점)
  • 매우 엄격한 Syntax로 인해 프로토콜에 필요한 메서드들이 명확하게 명시
  • 컴파일 시 경고나 에러가 떠서 프로토콜의 구현되지 않은 메소드들을 알려줌
  • 로직의 흐름을 따라가기 쉬움
  • 프로토콜 메소드로 알려주는 것 뿐만 아니라 정보를 받을 수도 있음
  • 프로토콜이 컨트롤러의 범위 안에서 정의된다.

단점

  • Delegate 사용을 위해 구현해야 하는 코드가 많음
    • 다수의 객체들에게 이벤트를 호출하는 방식이 비효율적
    • 1:N 또는 N:N 관계에는 Observer Pattern이 적합
  • delegate 설정에 nil이 들어가지 않게 주의해야한다. 크래시를 일으킬 수 있다.

Delegate Pattern 예시

붕어빵 장사를 예로 든다면

Continue reading

[Swift] Access Control

Access Control


접근 제어

  • 코드의 세부 구현 내용을 숨기는 것이 가능하도록 만드는 개념
    • 객체지향 -> 은닉화가 가능해짐
    • 언어마다 약간씩의 차이가 있음

접근 제어가 필요한 이유

  • 원하는 코드를 감춰 놓을 수 있음
  • 코드의 영역을 분리시켜서, 효율적 관리 가능
  • 컴파일 시간이 줄어듦
    (컴파일러가 어느 범위에서만 해당 변수가 쓰이는지를 인지 가능)

접근 제어의 수준

키워드접근 수준에 대한 범위특징제한 정도
open다른 모듈에서 접근 가능
(상속/재정의 가능)
클래스의 가장 넓은 수준
(클래스에서만 사용 가능)
개방적
public다른 모듈에서 접근 가능
(상속 재정의 불가)
구조체/열거형의 가장 넓은 수준
(구조체는 상속 불가)
기본 타입의 설정 수준(Int, String 등)
internal같은 모듈에서만 접근 가능
(디폴트 설정)
따로 명시하지 않는 경우의 기본 수준
fileprivate같은 파일 내에서만 접근 가능 
private같은 scope 내에서만 접근 가능 폐쇄적
  • 모듈(module) : 프레임워크, 라이브러리, 앱 등 import해서 사용할 수 있는 외부의 코드
  • 모듈을 만들어서 배포하려면, public이상으로 선언해야 함

접근 제어를 가질 수 있는 요소

  • 타입 (클래스/구조체/열거형/스위프트 기본타입 등)
  • 변수 / 속성
  • 함수 / 메서드 (생성자, 서브스크립트 포함)
  • 프로토콜도 특정 영역으로 제한될 수 있음

Continue reading

[Swift] Result Type

Result Type


Result 타입

  • 에러가 발생하는 경우, 에러를 따로 외부로 던지는 것이 아니라
  • 리턴 타입 자체를 Result Type(2가지를 다 담을 수 있는)으로 구현해서
  • 함수 실행의 성공과 실패의 정보를 함께 담아서 리턴

Continue reading

[Swift] Generic

Generic


제네릭

  • 제네릭이 없다면 단순히 타입만 다르고 구현 내용이 같은 함수(클래스, 구조체, 열거형)마다 모든 경우를 다 정의해야하기 때문에 개발자의 할 일이 늘어남
  • 제네릭을 통해 타입(형식)에 관계없이 한번의 구현으로 모든 타입을 처리하여 유연함(유지보수 쉽고, 재사용성 높은) 함수 / 구조체 / 클래스 / 열거형 등을 일반화 가능한 코드로 작성 가능

Continue reading

[Swift] ARC

Automatic Reference Counting


메모리 관리

메모리
코드(프로그램)데이터스택
명령어 / 프로그램
앱(프로그램)의 모든 코드(Text)
전역 번수
타입(static/class) 변수
동적할당
(일반적으로 오랫동안 긴 시간 동안 저장)
함수 실행을 위한 임시적 공간
 공통으로 공유하기 위한 데이터
앱이 실행되는 동안 불변
크기가 크고, 관리할 필요가 있는 데이터
개발자가 잘 관리해야함
크기가 작고 빠르게 사용하기 위한 데이터
알아서 자동 관리됨
앱 실행시, 모든 코드가 일단 코드 영역에 올라감 그리고, 순차적으로 한줄 씩 실행됨전역변수 및 타입속성이 저장
(어디서도 접근 가능한 데이터)
참조타입
(클래스의 객체, 클로저)
함수의 실행 시 필요 데이터가 생성, 사용 완료 후 사라짐
(value 타입)
  • 힙 영역에 할당되는 데이터는 관리를 해야지만, 메모리에서 해제가 됨
  • 할당이 해제되지 않으면 메모리 누수(Memory Leak) 현상이 발생

다양한 언어에서의 메모리 관리 모델

  • java -> GC (Garbage Collector) : 런타임에 메모리 감시하는 기법
  • Objective-C -> MRC (Manual RC) / ARC (Automatic RC)
  • Swift -> ARC (Automatic RC)

Continue reading

Pagination


© 2021. by hminkim