[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