티스토리 뷰

iOS 개발을 하다보면 자식객체에서 부모객체에게 메시지를 보내야 할때가 생긴다.

 

그럴땐 보통 delegate 패턴을 사용한다.

 

class MySampleDelegateParentsClass: MySampleDelegateChildClassDelegate {
    
    var child: MySampleDelegateChildClass
    
    init() {
        self.child = MySampleDelegateChildClass()
        self.child.delegate = self
        
    }
    
    func sendMessage(foo: String) {
        print("recived: \(foo)")
    }
}

protocol MySampleDelegateChildClassDelegate: AnyObject {
    func sendMessage(foo: String)
}

class MySampleDelegateChildClass {
    weak var delegate: MySampleDelegateChildClassDelegate?
    
    func doSomething() {
        print("do something")
        self.delegate?.sendMessage(foo: "foo")
    }
    
}

 

 

하지만 Delegate 패턴을 사용하지 않고 부모객체에 직접 접근해서 사용하면 되지 않을까? 라는 생각이 들 수 있다.

class MySampleParentsClass {
    var child: MySampleChildClass?
    
    func makeSampleChildObj() {
        self.child = MySampleChildClass(parentsObj: self)
    }
    
    func reciveMessage(foo: String) {
        print("received: \(foo)")
    }
}

class MySampleChildClass {
    
    weak var parentsObj: MySampleParentsClass // weak 로 잡아줘서 reference count를 늘리지 말자
    
    init(parentsObj: MySampleParentsClass) {
        self.parentsObj = parentsObj
    }
    
    func doSomething() {
        self.parentsObj.reciveMessage(foo: "foo")
    }
    
}

이 의문점을 해소하기 위해 직접 부모객체를 가지게 만들고 함수를 직접 호출하도록 만들었다.

 

이렇게 만들면 delegate 패턴을 사용한 첫번째의 예시와 다를게 없어지는 구조가 되는것일까?

 

 

1. delegate 패턴을 사용했을 경우

delegate 패턴을 사용했을 경우

A. MySampleDelegateParentsClass 는 MySampleDelegateChildClassDelegate 이라는 protocol 을 채택하고 해당 프로토콜에서 명시되어있는 함수와 변수를 모두 구현해줘야한다.

B. MySampleDelegateParentsClass의 객체는 MySampleDelegateChildClass의 delegate 를 자신이 구현하도록 명시해주었다. ( self.child.delegate = self )

C. MySampleDelegateChildClass 의 객체는 MySampleDelegateChildClassDelegate라는 protocol만 알고 있으면 되고, MySampleDelegateParentsClass의 클래스는 알 필요가 없다.

D. MySampleDelegateChildClass 객체가 부모에게 어떤 메시지를 전달하고 싶다면, delegate 패턴을 통해 메시지를 전달한다.

 

 

 

2. 부모객체를 가지고 있을 경우

MySampleChildCalss 객체가 MySampleParentsClass 객체를 가지고 있을경우

MySampleChild 객체는 이제 MySampleParentsClass 라는 Class를 알고 있어야한다.

A) 만약 MySampleParentsClass가 변경이 되거나, B) MySampleChildClass가 MySampleParentsClass가 아닌 다른 Class가 호출하게 된다면??

MySampleChildClass 가 수정이 필요하게 된다.

 

물론 delegate패턴 사용시에도 MySampleDelegateChildClassDelegate Protocol 이 변경이 된다면  MySampleDelegateChildClass가 수정 될 가능성이 있지만, 이 예제에서는 delegate패턴 사용시보다 변경의 여지가 더 크다고 볼 수 있을 것 같다.

 

결국 결합도의 차이라고 생각함...

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함