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
Storyboard vs Code
Storyboard
- Storyboard : 여러개의 View를 한번에 구현할 수 있는 툴, View들간 transition 등 처리 가능
- Xibs: 하나의 파일이 하나의 View에 대응
Continue reading
Access Control
접근 제어
- 코드의 세부 구현 내용을 숨기는 것이 가능하도록 만드는 개념
- 객체지향 -> 은닉화가 가능해짐
- 언어마다 약간씩의 차이가 있음
접근 제어가 필요한 이유
- 원하는 코드를 감춰 놓을 수 있음
- 코드의 영역을 분리시켜서, 효율적 관리 가능
- 컴파일 시간이 줄어듦
(컴파일러가 어느 범위에서만 해당 변수가 쓰이는지를 인지 가능)
접근 제어의 수준
키워드 | 접근 수준에 대한 범위 | 특징 | 제한 정도 |
---|
open | 다른 모듈에서 접근 가능 (상속/재정의 가능) | 클래스의 가장 넓은 수준 (클래스에서만 사용 가능) | 개방적 |
public | 다른 모듈에서 접근 가능 (상속 재정의 불가) | 구조체/열거형의 가장 넓은 수준 (구조체는 상속 불가) 기본 타입의 설정 수준(Int, String 등) | ↑ |
internal | 같은 모듈에서만 접근 가능 (디폴트 설정) | 따로 명시하지 않는 경우의 기본 수준 | ↕ |
fileprivate | 같은 파일 내에서만 접근 가능 | | ↓ |
private | 같은 scope 내에서만 접근 가능 | | 폐쇄적 |
- 모듈(module) : 프레임워크, 라이브러리, 앱 등 import해서 사용할 수 있는 외부의 코드
- 모듈을 만들어서 배포하려면,
public
이상으로 선언해야 함
접근 제어를 가질 수 있는 요소
- 타입 (클래스/구조체/열거형/스위프트 기본타입 등)
- 변수 / 속성
- 함수 / 메서드 (생성자, 서브스크립트 포함)
- 프로토콜도 특정 영역으로 제한될 수 있음
Continue reading
Result Type
Result 타입
- 에러가 발생하는 경우, 에러를 따로 외부로 던지는 것이 아니라
- 리턴 타입 자체를 Result Type(2가지를 다 담을 수 있는)으로 구현해서
- 함수 실행의 성공과 실패의 정보를 함께 담아서 리턴
Continue reading
Generic
제네릭
- 제네릭이 없다면 단순히 타입만 다르고 구현 내용이 같은 함수(클래스, 구조체, 열거형)마다 모든 경우를 다 정의해야하기 때문에 개발자의 할 일이 늘어남
- 제네릭을 통해 타입(형식)에 관계없이 한번의 구현으로 모든 타입을 처리하여 유연함(유지보수 쉽고, 재사용성 높은) 함수 / 구조체 / 클래스 / 열거형 등을 일반화 가능한 코드로 작성 가능
Continue reading
Concurrency Programing in iOS
동시성 프로그래밍
Continue reading
날짜: 2022년 7월 12일
카테고리: 다이나믹 프로그래밍
태그: silver.3
, 2579
, 파이썬
Continue reading
Higher-order Function
고차 함수
Continue reading
Networking in iOS
iOS에서 네트워킹
Continue reading
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