728x90
반응형

델리게이션은 사전상 의미로 대표자, 위임하다, 대리자 라고 해석할 수 있다.

클래스나 구조체가 따로 혹은 일부 수행해야 하는 일을 다른 타입의 인스턴스에게 위임하는 디자인 패턴이다.
특정 액션에 반응하거나 외부 소스의 기본 타입을 알 필요 없이 외부 소스로부터 데이터를 가져오는데 사용될 수 있다.

간단하게 말해서,
A 인스턴스가 하나의 일에만 충실하고 싶을 때, 그 밖의 일들을 B 인스턴스가 대신해서 처리해준다는 것이다.

스위스트에서는 이런 델리게이션의 개념이 적용된 것이 프로토콜이다.
프로토콜은 이전에 공부했듯이 특정 역할을 수행하기 위한 프로퍼티, 메서드, 이니셜라이저 등의 청사진을 정의한다고 알고 있다.

델리게이트는 대신 처리해줄 객체처리하라고 시키는 객체로 구분해서 생각하면 된다.

그래서 델리게이션을 사용해 예제 코드를 작성해보았다.

내가 작성하고자한 코드는 다음과 같다.

롤에서 일반 게임을 시작한다.
일반 게임이 시작되고 kill, death, assistance 를 기록한다.
게임이 끝나 승리 또는 패배하게 된다.

여기서 kill, death, assistance 를 기록하는 부분을 델리게이트(KdaRecordDelegate)로 생성해서 사용해보았다.
NormalGame 클래스에서 KdaRecordDelegate 프로토콜을 채택했다.
NormalGame 클래스에서 메서드 요구사항을 정의하고
KDA 를 기록하는 부분에 대해서는 KdaRecordDelegate 에서 대신 처리해준다.

import Swift

// 유저에 대한 클래스 생성
class User {
    let name: String
    
    init(name: String) {
        self.name = name
    }
}

// KDA 를 기록해주는 델리게이트 생성
protocol KdaRecordDelegate {
    func kill()
    func death()
    func assi()
}

// 롤 일반 게임 클래스 생성
class NormalGame: KdaRecordDelegate {
    var user: String = ""
    
    var k: Int = 0
    var d: Int = 0
    var a: Int = 0
    
    init(user: String) {
        self.user = user
    }
    
    // 게임 시작
    func start() {
        print("일반 게임을 시작했습니다.")
    }
    // 게임 승리
    func win() {
        print("게임에서 승리했습니다.")
    }
    // 게임 패배
    func lose() {
        print("게임에서 패배했습니다.")
    }
    
    func getState() {
        print("현재 \(user) 님의 KDA 는 \(k) / \(d) / \(a) 입니다.")
    }

    
    // KdaRecordDelegate
    func kill() {
        print("적을 처치했습니다.")
        k += 1
    }
    
    func death() {
        print("적에게 죽었습니다.")
        d += 1
    }
    
    func assi() {
        print("적의 처치에 도움을 주었습니다.")
        a += 1
    }
    
}


var user: User = User(name: "jaynam")
var game: NormalGame = NormalGame(user: user.name)

game.start()

game.kill()
game.assi()
game.kill()
game.death()

// 현재 상태창을 확인할 때
game.getState()

game.kill()
game.death()

game.win()

출력 결과

일반 게임을 시작했습니다.
적을 처치했습니다.
적의 처치에 도움을 주었습니다.
적을 처치했습니다.
적에게 죽었습니다.
현재 jaynam 님의 KDA 는 2 / 1 / 1 입니다.
적을 처치했습니다.
적에게 죽었습니다.
게임에서 승리했습니다.

 

예제 코드를 작성하고나서 이렇게 사용하는 게 맞는걸까? 라는 의문이 들었다. ㅎㅎ 너무 허졉해보인다...ㅎ
잘 생각해보니 어플을 개발할 때 delegate와 datasource 를 작성해서 해당 기능을 구현했었던 기억이 있다.
그 때에는 그냥 뷰에 보여주기 위해서 처리하는 코드를 작성하는 부분이구나 라고 생각하고 넘어갔기 때문에
제대로 된 이해를 하고 사용하지 못했다.
물론 지금도 제대로 이해하고 있는지 잘못 이해하고있는지 더 공부해봐야 알 것 같다. ㅎㅎ
델리게이트에 대해서 꼭 알아둬야한다고 한다. 그래서 제대로 이해할 필요가 있다.
지금은 playground 에서 스위프트를 통해 예제를 만들어 보았는데 iOS 에서 다양한 뷰를 만들어보면서 익숙해져야겠다.

 

- 참고 사이트 - 

m.blog.naver.com/PostView.nhn?blogId=seotaji&logNo=220293615979&proxyReferer=https:%2F%2Fwww.google.com%2F

 

애플 스위프트(Apple Swift) - 델리게이션(Delegation)

Swift - Delegation애플 스위프트 델리게이션 Delegation(델리게이션) 뭘 하든 용어의 기본적인...

blog.naver.com

the-brain-of-sic2.tistory.com/9

 

Swift4 : 프로토콜 2 : #델리게이트 패턴 : #델리게이션 (2 / 2)

안녕하세요 !  씩이 입니다! 저는 Swift 와 iOS 를 공부하고 연구하는 학생입니다. 같은 분야를 공부하는 분들에게 조금이라도 도움이 주고 싶어서 공부하는 것들을 공유합니다. 제 3자가 있다

the-brain-of-sic2.tistory.com

magi82.github.io/ios-delegate/

 

iOS Delegate 패턴에 대해서 알아보기 – 마기의 개발 블로그 – 즐겁게 개발을 하고 싶은 욕심 많은

안녕하세요. 마기입니다. 이번 포스팅에서는 델리게이트에 대해 살펴보도록 하겠습니다. iOS 에서 델리게이트 패턴은 정말 많이 쓰이고 있습니다. 많이 쓰이는 필수 패턴이니만큼 구글링을 해보

magi82.github.io

zeddios.tistory.com/8

 

iOS ) 왕초보를 위한 delegate정리

swift 공부를 하면서 꼭 알아야하는 개념 중 하나가 delegate개념인데요, 저같은 경우에는 자료들도 다 영어고 한글로 된 설명을 봐도 너무 이해하기가 어렵더라구요  :( 요 며칠간 공부를 하다가

zeddios.tistory.com

 

728x90
반응형

'iOS > Swift' 카테고리의 다른 글

[Swift] 27. 오류 처리  (0) 2020.12.04
[Swift] 26. 익스텐션 (extension)  (0) 2020.12.03
[Swift] 24. 프로토콜 (protocol)  (0) 2020.12.03
[Swift] 23. assert / guard  (0) 2020.11.29
스위프트는 어떻게 동작할까?  (0) 2020.11.25
복사했습니다!