You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
두 개 이상의 뷰컨트롤러끼리 서로 작업에 대해 관련이 있을때 우리는 Delegate 패턴 또는 Closure를 사용합니다.
저는 Closure 를 모를때는 Delegate 만을 이용해서 뷰 컨트롤러를 관리했는데 Closure를 알게된 후 Delegate 패턴이 너무 어떤 한개를 위해 너무나도 해줄게 많다? 약간 과하다? 라는 생각을 하게 됐고, 그 부분을 아주 심플하게 해결하는 Closure각 훨씬 좋은거 아닌가? 라는 생각을 했습니다.
그치만 아직 Swift에는 Delegate 패턴을 많이 사용하는걸 봐선 '분명히 Delegate 패턴의 장점이 있을것이다' 라고 판단하고 어떤것이 더 좋은것인가에 대해 디스커션을 열고 알아보기 위해 작성하게되었습니다.
댓글로 여러분은 어떤 것이 더 적절하다고 생각하는지 달아주시면 감사하겠습니다.
일단 Delegate 패턴에 대해 알아보면
프로토콜을 통해 delegate변수가 위임할 함수를 전달할 수 있게 하고, 위임 받은 vc에서 자세한 함수를 작성하는 디자인 패턴입니다.
내가 생각하는 Delegate 패턴을 사용하는 이유는 '코드를 재사용하고 유지보수 하기 편해진다' 였습니다..
Delegate는 그저 어떤 일을 해야한다만 정해두고, 위임 받는 VC에서 자세한 코드를 작성하기만 하면 되기 때문이죠.
간단하게 예시를 만들어봤습니다.
A뷰컨
B뷰컨
B에서 버튼을 누르는 것에 대한 액션이 있고 그 액션을 통해 A의 레이블이 B에서 전달된 텍스트로 변경되는 예시에요.
Delegate 패턴을 사용하기 위해
프로토콜 생성
B뷰컨) 생성한 프로토콜 타입의 delegate 변수 생성
B뷰컨) 액션에 Delegate 안의 함수 실행
A뷰컨) B뷰컨의 Delegate 위임
A뷰컨) 실제 동작 함수 작성
하나의 액션을 위해 엄청나게 많은 코드가 늘어났습니다.
이 코드를 Closure를 사용하는 것으로 변경하면
B뷰컨) changeTitleText 라는 클로저 변수 선언
B뷰컨) 액션에 Closure 실행
A뷰컨) 실제 동작 Closure 작성
확실히 코드가 줄었다는 것을 알 수 있습니다.
그래서, Closure가 훨씬 간단하고 좋겠다! 라는 생각을 하게 됐습니다.
그러면.. 언제 Delegate 패턴을 사용할까..? 둘을 비교해 볼까요?
첫째로, Delegate Closure는 둘다 잘 처리한다면 강한 순환 참조를 예방해서 메모리 누수를 예방할 수 있어요.
델리게이트
클로져
weak 과 weak self 를 사용해 메모리 누수를 예방 할 수 있다 -> 메모리 문제는 둘다 없다는걸 뜻해요!
둘째로, 언제 어떤게 사용하지 않는지, 사용하는지 검색해봤습니다.
Delegate
사용할때: 언제 어디서나 사용할 수 있다. 특히 많은 기능이 들어갈때 사용하면 효과적이다!
사용하지 않을때:
하나의 함수만 있는 경우 처럼 작은 목표에 대한 '과도하게'보일 수 있다 (내가 생각했던 델리게이트의 문제)
하나의 함수에 대해 프로토콜을 만들고, 참조를 만들고, 연결하고, 프로토콜 함수를 구현하고,,.. 클로저를 쓰면 간단하게 되니까!!
Closure
사용할때: 언제 어디서나 사용할 수 있다!! 심플하니까 ^3^
사용하지 않을때: 세 개 이상의 Closure를 사용하면 코드베이스 특성 상 굉장히 코드가 복잡해 보인다? 더러워 보인다고 합니다!
이 두가지 비교를 하고 나서 내린 결론이 "여러개의 함수를 만들어야한다면 오히려 깔끔하게 쓸 수 있지만 한,두개 만드는거는 오히려 클로저로 하는게 낫다" 였습니다.
이 생각을 하고 나서 케미와 이야기 하던 중 TableView의 Delegate가 생각이 났습니다.
테이블 뷰의 Delegate에는 수십가지의 함수가 미리 선언되어있고 우리가 테이블 뷰를 구현할때 위임하면서 그 뷰에서 Delegate에 필요한 함수들을 불러와 사용하고 있습니다.
아~!! 이렇게 많은 함수들을 컨트롤 해주는 것을 클로저로 하나하나
이렇식으로 선언하고 해준다면 굉장히 지저분 하겠다라고 이해하게 되었습니다.
그래서 내린 나의 결론:
한 두개의 함수를 사용할때는 Closure로 사용하는게 가독성과 코드의 양 면에서 좋지만
세개 이상의 함수, 그리고 그 함수를 사용하는 곳이 여러군데 라면 Delegate로 관리하는게 더 좋겠다!
입니당
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
두 개 이상의 뷰컨트롤러끼리 서로 작업에 대해 관련이 있을때 우리는
Delegate
패턴 또는Closure
를 사용합니다.저는 Closure 를 모를때는 Delegate 만을 이용해서 뷰 컨트롤러를 관리했는데 Closure를 알게된 후 Delegate 패턴이 너무 어떤 한개를 위해 너무나도 해줄게 많다? 약간 과하다? 라는 생각을 하게 됐고, 그 부분을 아주 심플하게 해결하는 Closure각 훨씬 좋은거 아닌가? 라는 생각을 했습니다.
그치만 아직 Swift에는 Delegate 패턴을 많이 사용하는걸 봐선 '분명히 Delegate 패턴의 장점이 있을것이다' 라고 판단하고 어떤것이 더 좋은것인가에 대해 디스커션을 열고 알아보기 위해 작성하게되었습니다.
댓글로 여러분은 어떤 것이 더 적절하다고 생각하는지 달아주시면 감사하겠습니다.
일단 Delegate 패턴에 대해 알아보면
프로토콜을 통해 delegate변수가 위임할 함수를 전달할 수 있게 하고, 위임 받은 vc에서 자세한 함수를 작성하는 디자인 패턴입니다.
내가 생각하는 Delegate 패턴을 사용하는 이유는 '코드를 재사용하고 유지보수 하기 편해진다' 였습니다..
Delegate는 그저 어떤 일을 해야한다만 정해두고, 위임 받는 VC에서 자세한 코드를 작성하기만 하면 되기 때문이죠.
간단하게 예시를 만들어봤습니다.
B에서 버튼을 누르는 것에 대한 액션이 있고 그 액션을 통해 A의 레이블이 B에서 전달된 텍스트로 변경되는 예시에요.
Delegate 패턴을 사용하기 위해
하나의 액션을 위해 엄청나게 많은 코드가 늘어났습니다.
이 코드를 Closure를 사용하는 것으로 변경하면
확실히 코드가 줄었다는 것을 알 수 있습니다.
그래서, Closure가 훨씬 간단하고 좋겠다! 라는 생각을 하게 됐습니다.
그러면.. 언제 Delegate 패턴을 사용할까..? 둘을 비교해 볼까요?
첫째로, Delegate Closure는 둘다 잘 처리한다면 강한 순환 참조를 예방해서 메모리 누수를 예방할 수 있어요.
weak 과 weak self 를 사용해 메모리 누수를 예방 할 수 있다 -> 메모리 문제는 둘다 없다는걸 뜻해요!
둘째로, 언제 어떤게 사용하지 않는지, 사용하는지 검색해봤습니다.
Delegate
Closure
이 두가지 비교를 하고 나서 내린 결론이 "여러개의 함수를 만들어야한다면 오히려 깔끔하게 쓸 수 있지만 한,두개 만드는거는 오히려 클로저로 하는게 낫다" 였습니다.
이 생각을 하고 나서 케미와 이야기 하던 중 TableView의 Delegate가 생각이 났습니다.
테이블 뷰의 Delegate에는 수십가지의 함수가 미리 선언되어있고 우리가 테이블 뷰를 구현할때 위임하면서 그 뷰에서 Delegate에 필요한 함수들을 불러와 사용하고 있습니다.
아~!! 이렇게 많은 함수들을 컨트롤 해주는 것을 클로저로 하나하나
이렇식으로 선언하고 해준다면 굉장히 지저분 하겠다라고 이해하게 되었습니다.
그래서 내린 나의 결론:
한 두개의 함수를 사용할때는 Closure로 사용하는게 가독성과 코드의 양 면에서 좋지만
세개 이상의 함수, 그리고 그 함수를 사용하는 곳이 여러군데 라면 Delegate로 관리하는게 더 좋겠다!
입니당
여러분은 어떤 것이 더 좋다고 생각하시나요?
<참고>
Beta Was this translation helpful? Give feedback.
All reactions