OOP를 한 단계 깊게 이해하기: 역할, 책임, 협력
객체지향 프로그래밍(OOP)을 '객체들이 서로 관계를 맺고 상호작용하는 것'이라고 배웠습니다.
하지만 왜 그렇게 설계해야 하는지, 어떻게 클래스를 나눠야 하는지가 명확하지 않을 때가 많습니다.
이제 객체를 단순히 데이터 덩어리가 아닌, '역할'과 '책임'을 가진 하나의 행위자(Actor)로 바라보는 것이
그 해답이 될 수 있습니다. 이는 초급에서 중급으로 넘어가는 핵심적인 관점입니다.
- 역할 (Role)은 인터페이스(Interface)로 구체화됩니다.
- 역할은 "무엇을 할 수 있는가"에 대한 약속이자 명세입니다.
- Barista라는 역할은 makeCoffee()라는 행동을 할 수 있어야 한다는 계약과 같습니다.
- 책임 (Responsibility)은 구현 클래스와 메서드로 구체화됩니다.
- 책임은 그 역할을 실제로 "어떻게 수행할 것인가"에 대한 실제 구현입니다.
- StarbucksBarista 클래스는 makeCoffee() 메서드를 스타벅스의 레시피대로 구현하며 책임을 다합니다.
- 협력 은 인터페이스를 통한 메시지 교환으로 이루어집니다.
- 객체들은 서로의 구체적인 클래스가 아닌, **약속된 역할(인터페이스)**을 보고 메시지를 주고받으며 협력합니다.
이를 통해 우리는 훨씬 유연하고 확장 가능한 설계를 만들 수 있습니다.
- 객체들은 서로의 구체적인 클래스가 아닌, **약속된 역할(인터페이스)**을 보고 메시지를 주고받으며 협력합니다.
즉, SRP에서 말하는 **"하나의 책임"**이란, 사실 **"하나의 명확한 역할"**을 의미합니다.
클래스에 단 하나의 역할을 부여하면,
자연스럽게 그 역할에 맞는 책임(메서드)들만 남게 되어 코드가 명확하고 견고해지는 것입니다.
나쁜 예시: 만능 바리스타 (여러 역할을 가진 객체)
하나의 BadBarista 클래스가 '주문 담당', '커피 전문가', '결제 처리기'라는 세 가지 역할을 모두 수행하려 합니다.
문제점: 한 객체에 너무 많은 역할과 책임이 쏠려있어, 어떤 역할 하나에 변경이 생겨도 클래스 전체가 영향을 받습니다.
// 나쁜 예시
class BadBarista {
public void handleOrder() {
// 역할 1의 책임: 주문 받기
System.out.println("손님, 아메리카노 한 잔 주문받았습니다.");
// 역할 2의 책임: 커피 제조
System.out.println("원두를 갈고, 에스프레소를 추출합니다...");
System.out.println("뜨거운 물을 추가하여 아메리카노를 완성합니다.");
// 역할 3의 책임: 결제 처리
System.out.println("5000원입니다. 카드로 결제 처리합니다.");
System.out.println("결제가 완료되었습니다.");
}
}
좋은 예시: 역할 분담 (하나의 역할을 가진 객체들)
각자의 명확한 역할을 가진 별도의 객체(클래스)로 분리합니다.
이 객체들은 서로 협력하여 전체 프로세스를 완성합니다.
결론: 각 객체는 자신의 역할과 책임에만 집중합니다.
'커피 제조' 역할의 책임(코드)이 바뀌어도 '결제' 역할은 전혀 영향을 받지 않아 안전합니다.
롬북 의존성 추가
dependencies {
implementation 'org.projectlombok:lombok:1.18.26'
annotationProcessor 'org.projectlombok:lombok:1.18.26'
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
- 시퀀스 다이어그램
- 협력 흐름을 이해하기 가장 쉬움
- 객체 간의 메시지 전달이 직관적
- 클래스 다이어그램으로 구조 정리
- 시퀀스에서 파악한 객체들의 정적 관계 표현
'JAVA' 카테고리의 다른 글
| 리플렉션 (어노테이션) (0) | 2025.10.27 |
|---|---|
| OCP (개방-폐쇄 원칙) (0) | 2025.10.15 |
| 객체 지향 설계 - S.O.L.I.D 원칙 (0) | 2025.10.15 |
| [1단계] 프로젝트 초기 설정과 핵심 도메인 설계 (0) | 2025.10.15 |
| 프로젝트생성 (0) | 2025.10.15 |