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

코딩천국님의 프로필 이미지

작성한 질문수

오브젝트 - 기초편

3-1. 객체지향 설계 원칙

객체 지향 설계 첫번째 원칙

해결된 질문

24.08.27 23:44 작성

·

68

0

안녕하세요. 좋은 강의 찍어주셔서 진심으로 감사합니다. 한 마디 한 마디 이해하려고 하며 배우고 있습니다.

3-1 강의 11분 쯤에 '행동을 결정하고 객체를 나중에 선택하라는 원칙'이 객체를 선택하기 전에 요청을 결정하기 때문에 코드를 수정하지 않고도 협력하는 객체를 교체할 수 있게 해준다고 말씀하신 부분을 좀 더 설명해주실 수 있을까요 ??

calculateDiscount 행동을 먼저 정하고 이 행동을 하기에 적합한 객체를 선택한다고 말씀해주신 앞부분 내용은 잘 이해했는데, '객체를 선택하기 전에 요청을 결정하기 때문에 코드를 수정하지 않고도 협력하는 객체를 교체할 수 있게 해준다' 이 부분에 대한 이해가 잘 안 갑니다.

여담이지만 <객체지향과 사실과 오해> 도 잘 읽었습니다. <오브젝트> 책이 두꺼워서 망설이고 있었는데 강의를 내주셔서 감사합니다.

답변 2

0

조영호님의 프로필 이미지
조영호
지식공유자

2024. 08. 28. 08:13

코딩천국님 안녕하세요. 🙂

책보다 더 쉽게 이해하실 수 있도록 강의를 구성했는데 도움이 되신다니 다행이네요.

강의 들어주셔서 감사드리고 궁금한 부분 있으면 그때그때 질문 주시면 최대한 빠르게 답변드릴게요.

 

'객체를 선택하기 전에 요청을 결정하기 때문에 코드를 수정하지 않고도 협력하는 객체를 교체할 수 있게 해준다'라는 문장을 두 개로 나눠서 답변드릴게요.

 

먼저 '객체를 선택하기 전에 요청을 결정한다'라는 말은 질문에 남겨주신 'calculateDiscount 행동을 먼저 정하고 이 행동을 하기에 적합한 객체를 선택한다'라는 말과 같은 의미입니다.

책임 주도 설계에서는 메시지 전송자가 협력을 위해 'calculateDiscount'를 요청할 필요가 있다는 사실(다시 말해서 메시지를 전송할 필요)을 결정한 후에 이 요청을 수행하기에 적합한 객체를 선택합니다.

결과적으로 메시지 수신자의 입장에서는 calculateDiscount라는 행동을 먼저 결정한 후에 객체를 결정하게 되는 것이죠.

 

아마 궁금한 부분은 '코드를 수정하지 않고도 협력하는 객체를 교체할 수 있게 해준다'라는 부분일것 같은데 이것은 바로 앞에서 설명한 '요청을 결정한 후에 객체를 선택'하기 때문에 가능한 일입니다.

요청(메시지, 행동)를 결정한 후 객체를 선택했기 때문에 메시지 전송자는 calculateDiscount 요청에 따라 적합한 행동을 제공할 수 있는 객체라면 누구와도 협력이 가능하게 됩니다.

다시 말해서 calculateDiscount라는 행동을 제공할 수 있는 객체라면 협력에 참여할 수 있기 때문에 '협력하는 객체를 교체'할 수 있는 것입니다.

 

일단 객체를 교체할 수 있도록 협력을 구성한 후에는 실제로 코드 레벨에서 객체를 교체할 수 있도록 구조를 만들 필요가 있습니다.

이 방법은 강의에서 아래 부분에 상세한 내용이 정리되어 있기 때문에 강의를 보시고나면 아주 쉽게 이해가 되실거에요.

  • 5-2 메시지와 메서드의 분리

  • 5-3 유연하고 일관적인 협력

답변이 되었는지 모르겠네요. 🙂

 

0

인프런 AI 인턴님의 프로필 이미지

2024. 08. 27. 23:46

안녕하세요, 인프런 AI 인턴입니다.

코딩천국님께서 문의하신 ‘행동을 결정하고 객체를 나중에 선택하라는 원칙’에 대한 부분은 객체 지향 설계의 핵심 원칙 중 하나입니다. 이는 ‘역할, 책임, 협력’ 중심의 설계를 강조할 때 매우 중요한 개념입니다.

이 원칙에 따르면, 시스템을 구성하는 데 있어서 무엇을(What) 할 것인지인 ‘행동’을 먼저 결정하고, 이 행동을 수행할 객체를 나중에 결정합니다. 이렇게 설계를 하면, 특정 행동을 수행하는 데 필요한 구체적인 객체의 타입이나 구현에 의존하지 않고, 그 행동을 수행할 수 있는 어떤 객체라도 그 위치에 둘 수 있는 유연성을 얻게 됩니다. 이로 인해 코드를 수정하지 않고도 행동을 수행하는 구체적인 객체를 교체할 수 있는 확장성과 유연성이 생기게 됩니다.

이 개념의 실제 적용 예로, 할인 정책을 결정하는 시스템을 들 수 있습니다. ‘할인 계산’이라는 행동을 먼저 정의하고, 구체적으로 어떤 할인 정책(예: 정액 할인, 비율 할인 등)을 사용할지는 그 다음에 결정하는 것입니다. 만약 새로운 할인 정책이 도입되어도, 기존의 ‘할인 계산’이라는 행동을 수행하는 코드를 수정할 필요 없이, 새로운 할인 정책 객체를 시스템에 통합할 수 있습니다.

객체지향 설계의 첫 번째 원칙에 대해 더 깊이 있게 다룬 질문&답변은 직접적으로 찾기 어렵지만, 이 원칙에 대한 이해를 도울 수 있는 유사한 내용으로 “DIP vs OCP”에서 조영호 강사님이 설명하는 의존성 역전 원칙(Dependency Inversion Principle, DIP)과 개방 폐쇄 원칙(Open-Closed Principle, OCP)의 설명은 코딩천국님의 질문과 연관성이 있습니다. 이 원칙들은 코드 수정 없이 시스템의 일부를 교체하거나 확장할 수 있는 방법에 대해 설명하고 있어, 행동을 결정하고 객체를 나중에 선택하는 원칙에 대한 이해를 심화시킬 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.