인프런 커뮤니티 질문&답변

황인준님의 프로필 이미지
황인준

작성한 질문수

코딩으로 학습하는 GoF의 디자인 패턴

중재자 패턴 3부 - 장점과 단점

객체간에 this를 넘기는 부분에 관련해 질문이 있습니다..

작성

·

278

1

지금까지 코딩해 올 때, 객체에게 this를 직접 넘기는 케이스를 지양하고자 하였는데요, 왜냐하면 객체간의 불필요한 의존성을 만들고, 잘못햇다간 circular dependency를 만들고, 구조를 파악하기 어렵게 만든다고 느꼈기 때문입니다.

 

중재자 패턴, 상태 패턴 등을 포함한 일부 패턴들에는 생성자 혹은 메서드 등에 this를 직접 넘기는 경우를 예시로 보여주셨는데, 단순하게 primitive 값 혹은 값 객체를 넘기면 해결될 의존성이 객체가 다른 객체로, 그리고 또 다른 객체로 이동하여 더더욱 파악이 어려워 질 수도 있겠다고 느꼈습니다.

생판 관계 없는 객체가 다른 객체의 속성을 변경하거나, 접근하는 등 디미터 법칙을 어기기 쉬워질 수 있겠다는 생각도 들구요.
(CleaningService는 restaurant만 알면 되고, 타월을 restaurant에게만 넘겨주면 되는데,

this를 넘기게 될 시 CleaningService가 guest가 누구인지까지 알아야 된다는 점에서 그렇게 느꼈습니다.)

 

개인적으로 이러한 이유로 안티패턴이 될 수도 있다고 생각하는데, 그렇다고 말할 수 있는 것인지 궁금합니다.

답변 1

1

백기선님의 프로필 이미지
백기선
지식공유자

네 저도 공감합니다. this를 사용하는 코딩 습관을 권장하려는게 아니라 단순히 패턴을 이해하기 위한 예제일 뿐이라고 생각해 주세요.

안녕하세요 선장님! 강의 잘 듣고 있습니다 :D 위 질문에 대한 의견에서 궁금증이 들어 선장님 의견을 한 번 듣고싶습니다.

여기서 질문자 분은 primitive 값을 넘기면 의존성이 해결된다고 말씀하셨는데, 제 생각에는 primitive한 값을 넘긴다는 행위 자체가 해당 객체의 상태를 넘기겠다는 의미이므로, 코드 상에 직접적인 의존성은 사라지겠으나 간접적인 의존성은 존재한다고 생각합니다.

예를 들어, 다음 예제에서 GuestId가 Integer가 아닌 Long으로 변경된다고 했을 때, 연관관계가 있는 다른 컴포넌트들도 다음과 같이 변경돼야 합니다.

public class CleaningService {

    private FrontDesk frontDesk = new FrontDesk();
    
    // guestId가 Integer에서 Long으로 변경되었기 때문에 같이 변경한다
    public void getTowers(Long guestId, int numberOfTowers) {
        String roomNumber = this.frontDesk.getRoomNumberFor(guestId);
        System.out.println("provide" + numberOfTowers + " to " + roomNumber);
    }
}

따라서 여기서 든 궁금증은

Q. primitive한 상태를 넘기는 것이 의존성을 해결할 수 있다고 볼 수 있는가?

입니다. 아마 mediator 패턴 자체가 이에 대한 이해를 바탕으로 이런 식의 직/간접적인 의존을 절제하는 방향으로 설계해야 할 것이라는 생각이 드는데, 기선님은 어떻게 생각하시는지 궁금합니다!

제 생각에는 객체를 넘기는 것이나 원시값을 넘기는 것이나 모두 의존성을 가지고 있는 것으로 보이기도 하고, 원시값을 넘기는 행위는 캡슐화를 깨는 행위로도 보입니다.

오히려 의존성은 유지되면서 결합도만 높아지는 행위가 아닌지 까지 생각이 전파되는 것 같습니다.


새해 첫날부터 존경하는 선장님과 함께 보낸다고 생각하니 뿌듯하기도 하고 올해를 잘 보낼 것이라는 생각도 드네요 ㅎㅎ 새해 복 많이 받으세요!!

백기선님의 프로필 이미지
백기선
지식공유자

안녕하세요. 말씀하시는 "간접적인" 의존성까지 따지기 시작하면.. 결합도의 기준이 너무 높아지는것 같아요. 의존성은 실용적인 측면에서 생각했을 때, 어떤 클래스나 패키지 더 나아가 JAR 파일을 필요하게 만드는 선에서 생각해야 하지 않을까 싶습니다. 이론적인 학문을 추구하신다면 간접적인 의존성까지 따지는 것도 의미가 있겠지만 글쎄요. 그렇게 해서 얻을 수 있게 어떤 것일까요?

새해 복 많이 받으세요~ 흥미로운 질문 주셔서 감사합니다.

황인준님의 프로필 이미지
황인준

작성한 질문수

질문하기