강의

멘토링

로드맵

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

미르뷰님의 프로필 이미지
미르뷰

작성한 질문수

오브젝트 - 기초편

객체 지향 설계 원칙에 대한 질문입니다

해결된 질문

작성

·

12

1

안녕하세요!

객체 지향에 대해 깊이 있게 학습할 수 있는 좋은 강의를 만들어주셔서 감사합니다. 이번에 완강했는데, 복습을 시작하기 전에 강의를 들으면서 생겼던 궁금증을 먼저 풀고 복습을 진행하면 좋을 것 같아 질문을 드립니다!

 

'협력에 필요한 행동을 먼저 결정하고 행동에 적합한 객체를 나중에 선택하라'는 원칙이 궁금합니다. 협력을 설계하려면 협력할 대상이 필요할 텐데, 협력 대상인 객체는 나중에 선택한다면, 협력을 설계할 때는 구체적으로 무엇을 대상으로 삼아서 진행하게 되는걸까요? 요구사항 분석에서 도출된 도메인 개념이나 역할 같은 것들을 임시 대상으로 두고 협력을 설계하는 걸까요?

제가 설계 회의 경험이 별로 없어서 그런지 설계가 진행되는 일련의 과정이 머릿속에 잘 그려지지 않아 이해를 잘 못하고 있는 것 같습니다. 객체 지향 설계(코드 배치 방법) 이전에 진행되는 사전 설계 작업에서 도출된 도메인 모델이 중심이 된다고 보면 될까요?

 

답변 2

0

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

미르뷰님 안녕하세요.

좋은 질문 남겨 주셔서 감사합니다.

 

‘협력에 필요한 행동을 먼저 결정한다’라는 의미는 시스템의 기능에 먼저 집중하고, 그 기능을 부분적으로 수행할 객체를 나중에 결정한다는 뜻으로 이해하시면 됩니다.

강의에서 사용한 영화 예매 시스템을 예로 들면 시스템이 제공해야 하는 기능은 사용자가 원하는 특정한 시간의 상영을 예매하는 것입니다.

이 기능을 구현하기 위해서는 알고리즘과 데이터가 필요할 거에요.

여기에서 '행동을 먼저 결정한다'는 말은 알고리즘을 먼저 생각하고 분해한다는 뜻으로 생각하시면 됩니다.

 

행동에 적합한 객체를 나중에 선택’한다는 말은 나눠진 알고리즘에 적합한 이름을 붙이는 것을 의미합니다.

알고리즘에 이름을 붙여야 하기 때문에 알고리즘이 이미 존재하는 상태에서(행동을 먼저 결정) 이름을 나중에 붙일 수 밖에 없죠(객체를 나중에 선택).

 

강의에서도 설명드린 것처럼 객체지향은 알고리즘을 특정한 원칙에 따라 객체로 분배하는 방식을 말합니다.

이렇게 머릿 속에 떠오르는 알고리즘을 나눠서 적절한 객체에게 할당하는 방식을 책임 주도 설계라고 부르고 기초편 강의에서는 GRASP이라는 패턴 형식으로 알고리즘을 객체에 할당하는 방법을 설명하고 있습니다.

따라서 협력을 설계할 때 협력할 대상을 선택하는 도구는 알고리즘입니다.

그 알고리즘의 일부가 어떤 이름으로 불리건 상관없습니다.

일단 알고리즘을 나눠놓는게 중요합니다.

 

그 후에는 이렇게 나눠진 행동들에 이름을 붙여야겠죠.

객체의 이름으로는 우리가 잘 아는 이름을 붙이는게 좋을겁니다.

따라서 이름으로 좋은 대상은 도메인을 구성하는 명사들일거에요.

이렇게 이름을 붙이기 좋은 형태로 후보들을 모아놓은 것을 '도메인 모델'이라고 부릅니다.

도메인을 이야기하지 않고는 요구사항을 논의할 수 없기 때문에 도메인을 구성하는 명사들이 우리에게 익숙할테니까요.

따라서 우리에게 익숙한 도메인 개념을 나눠놓은 행동 조각들의 이름으로 사용하면 나중에 코드의 위치를 기억하기가 쉬울겁니다.

 

정리하면 '협력에 필요한 행동을 먼저 결정하고 행동에 적합한 객체를 나중에 선택하라’라는 말은 ‘알고리즘을 객체지향 원칙에 따라 나눈 후에 나눠진 각각의 알고리즘에 적합한 이름을 나중에 붙여라’라는 의미로 이해하시면 됩니다.

강의에 나오는 아래 장표가 이 과정을 설명한 것이라고 보시면 됩니다.

스크린샷 2025-10-10 오후 4.39.46.png.webp

 

이 내용을 이해하시고 다시 한번 강의를 복습하시면 객체지향 설계 방법이 이해가 되실거에요. 😊

미리 책임과 협력을 결정하지 않고 알고리즘을 코드로 작성한 후에 객체로 분배할 수도 있는데 이 방법은 “설계원칙편”에서 다루고 있습니다.

 

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

감사합니다.

0

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

미르뷰님, 객체 지향 설계 원칙에 대해 깊이 있는 질문을 주셔서 감사합니다. 미르뷰님이 언급하신 “협력에 필요한 행동을 먼저 결정하고 행동에 적합한 객체를 나중에 선택하라”는 원칙은 객체 지향 설계의 핵심입니다. 이 원칙은 코드의 유연성과 확장성을 높이기 위해 강조됩니다.

원칙의 이해

  1. 행동(Behavior) 우선: 이 원칙의 주요 아이디어는 문제를 해결하기 위해 먼저 요구되는 행동이나 기능을 명확히 정의한 다음, 그 행동을 수행할 수 있는 객체나 이러한 행동을 제공할 수 있는 역할을 설계하는 방식입니다. 이로 인해 설계의 초기 단계에서는 구체적인 객체보다 역할과 책임에 초점을 맞춥니다.

  2. 임시 대상: 협력 대상이 명확하지 않은 초기 설계 단계에서는, 도메인 모델에서 도출한 역할이나 개념을 임시적으로 사용하여 설계를 진행할 수 있습니다. 이는 시스템이 갖춰야 할 기능과 비즈니스 로직을 명확히 한 후, 그에 맞는 객체나 클래스 구조를 결정하겠다는 것입니다.

  3. 도메인 중심: 초기 설계 과정에서는 요구사항 분석 시 도출된 도메인 모델을 중심으로 시스템의 구조를 구상합니다. 이 과정에서 역할과 책임을 정의하고, 해당 역할들이 서로 어떻게 협력할지를 결정하게 됩니다. 이후에 이러한 정의를 기반으로 실제 코드를 작성하며 구체적인 객체를 선택하거나 설계합니다.

설계 과정의 예시

  • 요구사항 분석에서 각 기능이 필요로 하는 행동을 도출하고, 이를 바탕으로 역할(Interface or Abstract Class)을 정의합니다.
  • 역할 중심의 협력 설계에서는 각 역할이 수행해야 할 구체적인 책임을 정의한 다음, 이 역할들이 어떻게 상호 작용할지를 설계합니다.
  • 나중에 실제 시스템 구현 시, 각 역할을 수행할 적합한 구체적인 클래스(객체)를 결정합니다.

아래 링크에서 유사한 주제에 대해 논의된 내용을 확인하실 수 있습니다:
- 객체지향 설계 첫번째 원칙

이 과정은 충분한 이해와 협업을 통해 진행되므로 초기 설계 단계에서 너무 구체적인 객체에 얽매이지 않고, 역할과 책임에 집중하는 것이 중요합니다. 이 방식을 통해 설계 변경 시 유연하게 대응할 수 있는 구조를 구축할 수 있습니다.

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

미르뷰님의 프로필 이미지
미르뷰

작성한 질문수

질문하기