샘성의 iOS 개발 일지

Delegate란 무엇인지 설명하고, retain 되는지 안되는지 그 이유를 함께 설명하시오. 본문

iOS/면접

Delegate란 무엇인지 설명하고, retain 되는지 안되는지 그 이유를 함께 설명하시오.

SamusesApple 2023. 5. 5. 12:50
728x90

Delegate란?

 Delegate의 사전적 의미는 대리자, 위임하다, 파견하다 등이 있다.

 객체지향 프로그래밍에서 Delegate는 하나의 객체가 모든 일을 처리하는 것이 아닌, 일부 일처리를 다른 객체(대리자)에게 위임하는 것이다.

 

- 위임하는 방식:

  다른 객체에게 어떠한 일처리를 할 것인지 캡슐화한 프로토콜로 구현하여, 대리자가 해당 일처리의 기능을 제공하도록 보장 받는다.

또한, 대리자가 구현해놓은 기능을 위임한 객체는 알지 못한다. 그저 필요할 때, 대리자가 구현한 기능을 호출할 뿐... 따라서 코드의 유지보수 측면에서도 장점이 있다.

 

 

Retain 되나?

  우선, Swift는 Automatic Reference Counting 방식으로 메모리를 관리한다. 즉, 나를 참조하는 객체(인스턴스)가 없다면(RC가 0이라면) 자동으로 해당 객체는 메모리에서 해제된다. 

하지만 반대로, 나를 참조하는 객체가 하나라도 있다면 메모리에서 해제되지 않는다. 즉, 내가 더이상 쓸모없어져도 RC가 해제되지 않는 상황이 된다면, 메모리에서 해제되지 않게 되는 문제가 생기며, 이것을 '메모리 누수(Memory Leak)이라 부른다.

  특히, 두 객체가 서로를 가리키고 있어 둘 다 메모리에서 해제되지 않는 현상을 '순환참조 (Retain Cycle)'이라고 부른다.

 

  Delegate는 위임하는 객체와, 대리자 역할을 하는 객체간에 작업이기 때문에, 참조값을 사용한다. 

그러므로 위와 같은 상황을 방지하기 위해 프로토콜에 AnyObject를 선언하여 class 전용 프로토콜 형태로 만들어주어야한다.

또한, 객체를 weak와 옵셔널로 선언하여 약하게 참조되어 대리자의 RC가 올라가지 않도록 하여 메모리 누수(순환 참조)를 방지해야 한다.

 

 

 

요약

 1. Delegate는 하나의 객체가 모든 일처리를 하지 않고, 일부 일처리를 다른 객체에게 위임하는 것.

 2. Retain 된다. '이것 좀 해줘' 객체와 '이건 내가 처리할게' 객체가 서로의 참조값을 사용하기 때문이다.

 3. Retain Cycle 막는 법: 

    - Delegate 프로토콜을 AnyObject로 선언하여 class 전용 프로토콜로 만들기.

    - '이것 좀 해줘' 객체가 '이건 내가 처리할게' 객체를 강하게 참조하지 않도록 weak와 옵셔널로 선언하기.

       ('이건 내가 처리할게' 객체는 "내가 대신 처리해줄게" 라고 외쳐야 대리자 역할을 할 수 있기에, '이것 좀 해줘' 객체가 해당 객체를 약하게 참조하도록 해야한다.)

 

 

728x90