(iOS) 초보자를 위한 델리게이트 패턴 이해

델리게이트 패턴


기술하는 데 필요한 두 종류의 객체를 구별하기 위해 빨간 물체그리고 파란색 물체로 표현

1. 문맥을 보자…

델리게이트 패턴은 디자인 패턴 중 하나로, 델리게이트가 있는 객체가다 다른 개체에게 업무를 위임하는 형태를 가짐

델리게이트, 즉 델리게이트가 있는 객체특정 이벤트 발생 시 해당 이벤트를 처리하는 함수 코드를 직접 작성하는 것보다 이벤트를 처리하는 코드를 구현하는 대리자 개체입니다.
참조 및 처리

(이벤트를 처리하는 함수 코드는 위임 객체쓰여진)

특정보기한 가지에만 집중하고 싶을 때 다른보기대신 처리해야 할 것 같은데…

규약?

프로토콜은 특정 기능을 수행하기 위한 필수 요소를 정의합니다.

규약 구현되지 않은 메서드, 정의되지 않은 속성이 선언만

프로토콜을 채택한 객체는 프로토콜에 정의된 메서드나 속성을 무조건 구현해야 합니다.

protocol OOTD: AnyObject {
		var top: String
		var bottom: String
		var shoes: String
		
		func explainOOTD()
}
  • 프로토콜을 클래스에서만 사용할 수 있도록 AnyObject를 상속합니다.

class April12: OOTD{
		var top = "shirt"
		var bottom = "cargo pants"
		var shoes = "super star black"

		func explainOOTD(){
				print("오늘은 \\(top)와 \\(bottom)을 매치해 힙찔룩을 완성했어용")
		}
}
class April9: OOTD{
		var top = "hoodie"
		var bottom = "jogger pants"
		var shoes = "air force 1"

		func explainOOTD(){
				print("오늘은 \\(top)와 \\(bottom)을 매치해 마실룩을 완성했어용")
		}
}
  • 위임 패턴을 구현하기 위해 프로토콜을 사용하는 이유는 무엇입니까? 클래스는 단일 상속만 지원하므로 프로토콜을 사용합니다.
    .?
  • 프로토콜은 위임할 속성 또는 메서드에 대한 규칙을 정의하는 데 사용할 수 있습니다.

2. 대리자 패턴을 사용하는 시기와 이유는 무엇입니까?

델리게이트 패턴 언제?

  • 동일한 작업을 수행해야 하지만 각 객체가 다른 작업을 처리하는 경우
  • 뷰 컨트롤러 간에 데이터를 전달할 수 있습니다.
  • 이벤트를 발생시키는 뷰 컨트롤러와 결과를 처리하는 뷰 컨트롤러가 다른 경우

델리게이트 패턴 왜? 장점은 무엇입니까?

  • 더 쉬운 코드 재사용 및 유지 관리(델리게이트가 있는 객체델리게이트를 통해 함수를 호출하는 코드 한 줄을 작성하더라도, 대리인이 참조하는 객체실행되는 함수의 구현 코드에 따라 다를 수 있음)

3. 예를 들어보자…

첫 번째와 두 번째 뷰 컨트롤러에서 게임을 시작하는 버튼 클릭 시 세 번째 뷰 컨트롤러 실행

첫 번째 뷰 컨트롤러의 게임은 버튼을 열 번만 누르는 게임입니다.

두 번째 뷰 컨트롤러에 있는 게임은 버튼을 누를 때마다 랜덤 이미지가 나오는 게임(?)




HitGameViewController RandomGameViewController GameView 컨트롤러

다음과 같은 3개의 뷰 컨트롤러가 있는 경우:

1. 게임 프로토콜의 정의


2. GameView 컨트롤러에서 델리게이트 속성을 선언한 후 함수를 호출합니다.



삼. HitGameViewController그리고 RandomGameViewController 각각은 GameProtocol과 Protocol에 정의된 메소드를 채택합니다.
화신



4. 각각 뷰컨트롤러대리자 선언 = 셀프 인


  • Delegate 패턴을 사용하지 않고 이 게임을 구현했다면?

GameView 컨트롤러아래 코드의 함수 호출 부분에서 (delegate?.hitClicked, delegate?.resultGame)

함수를 호출하는 대신 첫 번째 게임과 두 번째 게임에 대해 각각 고유한 함수를 구현해야 했을 것입니다.

(또는 두 개의 뷰콘을 만들거나…)


위에서 언급한 Delegate Pattern 사용의 장점을 다시 생각해보자!

더 쉬운 코드 재사용 및 유지 관리(델리게이트가 있는 객체델리게이트를 통해 함수를 호출하는 코드 한 줄을 작성하더라도, 대리인이 참조하는 객체실행되는 함수의 구현 코드에 따라 다를 수 있음)

GameView 컨트롤러delegate?.hitClicked(), delegate?.resultGame()을 호출하면 상황에 따라 다른 함수가 실행됩니다.

→ 상황에 따른 기타 기능 GameView 컨트롤러에서 구현할 필요 없음

Delegate Pattern@을 언제 사용해야 하는지도 재고해 봅시다!

이벤트를 발생시키는 뷰 컨트롤러와 결과를 처리하는 뷰 컨트롤러가 다른 경우

→ Hit 버튼 클릭 이벤트가 발생한 뷰 컨트롤러 GameView 컨트롤러그러나 결과를 처리하는 뷰 컨트롤러는 HitGameViewController그리고 RandomGameViewController

→ 이벤트 결과를 처리하는 뷰 컨트롤러 HitGameViewController 그리고 RandomGameViewController작성된 코드

동일한 작업을 수행해야 하지만 다른 개체에 대해 다른 작업을 수행해야 하는 경우

→ ‘Hit 버튼 클릭과 동일한 동작’ HitGameViewController 그리고 RandomGameViewController다른 내용을 다룰 때

지식인 환영!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!