높은 응집도 → 하나의 기능을 고칠 때 파일 한 개만 수정한다. (낮은 결합도)
낮은 응집도 → 하나의 기능을 고칠 때 여러 파일을 수정한다. (높은 결합도)
1번 예
위의 예를 보면 쥬스만들기 라는 class 과일준비(), 쥬스만들기(), 쥬스를준다()의 많은 역할을 중구난방으로 가지고 있는 것을 알 수 있다.
1번 예와 비교해서 각각의 과일준비(), 쥬스만들기(), 쥬스를준다() 역할을 하는 프로토콜을 만들어주고 각자의 역할만하는 메소드만을 구현하게 했다. 그리고 쥬스만들기에서는 이 프로토콜들을 활용해서 상효작용만을 하고 있습니다.
그로 인해 각각의 프로토콜들을 활용해서 로그인에 관한 책임만을 가지고 있다는 것을 알 수 있다.
추상적이다. 정답은 없다.
그림 1
그림 2
위 그림을 보면 교통수단을 각각 enum(그림 1)과 protocol(그림 2)로 구현을 하였다. 그리고 구체적인 교통수단의 종류를 case와 struct로 표현하였다. 이 둘은 수정과정에서 차이를 가진다.
그림 3
그림 4
만약 외발 자전거라는 교통수단을 추가하려 한다면 enum타입의 경우는 전반적인 수정을 요구한다(그림 3). 그러나 protocol의 경우 외발자전거 struct만 추가해주면 되어서 확장만 실시하면 된다(그림 4).
위배된 경우 : UIView에 상속되어 있는 것들(UIStepper, UILabel...등)중에 높이가 변하지 않는 경우가 있다.
-> 원칙이 우선인가? 가치가 우선인가? -> 가치를 위해 원칙이 있다.
그림 1
그림 2
그림 3
정사각형은 직사각형이기도 하다. 그래서 직사각형 클래스를 상속 받고 있다. 하지만 정사각형은 양변의 길이가 똑같다는 자신만의 성질을 가지기 위해 직사각형의 메서드를 override 해주었고, 이로 인해 직사각형의 성질을 그대로 상속하는 것을 거부하고 자신만의 성질을 가지게 된다.(퇴화 함수)
예를들어, 동물이 움직이는 메소드를 포함한 동물 protocol을 만들었다.
상어이 경우 동물 프로토콜을 채택했음에도 메소드 두개는 구현하지 않게 된다. 해결 방법은 각 3개의 인터페이스(프로토콜)를 만들어 각각 필요한 프로토콜만 채택하는 것이다.
특성 별로 프로토콜을 정리할 경우 각각 필요한 프로토콜만 이용가능하다.