객체지향 설계는 왜 필요한가
1강. 객체지향 설계는 왜 필요한가
1. 이번 강의에서 해결할 문제
요구 하나를 바꿀 때 UI·저장·알림·규칙을 모두 수정한다면 기능 부족보다 경계가 문제입니다. 패턴을 넣기 전에 실제 변경이 어디까지 전파되는지 측정합니다.
2. 학습 목표
3. 핵심 개념
객체지향 설계는 클래스를 많이 만드는 일이 아니라 상태와 규칙을 책임 있는 경계에 두는 일입니다. 변경 이유가 다른 코드가 함께 움직이면 결합이 생깁니다. 작은 프로그램은 함수와 값 타입 몇 개가 가장 좋은 설계일 수 있습니다.
먼저 용어를 구분합니다
| 용어 | 이 강의에서의 뜻 | 확인 질문 |
|---|---|---|
| 상태 | 작업 완료 여부처럼 프로그램이 기억해야 하는 값 | 이 값은 누가 바꿀 수 있어야 하나요? |
| 책임 | 한 코드 단위가 맡아야 하는 판단이나 행동 | 이 규칙이 바뀌면 어느 파일을 고쳐야 하나요? |
| 경계 | 서로 다른 책임이 만나는 함수·클래스·인터페이스 | 바깥 구현이 바뀌어도 안쪽 규칙은 그대로인가요? |
| 결합 | 한 변경이 다른 코드의 수정을 끌고 오는 정도 | 메일 공급자만 바꿨는데 작업 규칙도 다시 시험해야 하나요? |
| 변경 비용 | 수정 파일, 다시 돌릴 테스트, 확인할 외부 시스템의 범위 | 작은 요구 하나를 검증하는 데 무엇을 다시 확인하나요? |
객체지향 설계가 필요한 시점은 단지 코드가 길어졌을 때가 아닙니다. 같은 함수가 서로 다른 이유로 반복해서 수정될 때 경계를 나눌 근거가 생깁니다. 반대로 한 번 쓰고 끝나는 짧은 변환 함수에 저장소·알림 인터페이스까지 만들면 구조를 이해하는 비용만 커집니다.
4. 가장 작은 예제로 문제 찾기
다음 코드는 구조를 진단하기 위한 축약 예시입니다. completeTask를 호출하기 전에는 작업이 진행 중이고, 호출 뒤에는 완료 상태 저장·메일 전송·화면 갱신이 모두 한 번에 일어납니다.
void Application::completeTask(int id) {
tasks_[id].status = "done";
std::ofstream{"tasks.txt"} << tasks_[id].title;
EmailSdk::send(userEmail_, "completed");
ui_.refresh();
}
상태 전이, 저장, 외부 알림, UI가 한 함수에 결합됐습니다. 먼저 Task::complete, Storage::save, Notifier::send라는 책임 후보와 변경 이유를 표로 나눕니다.
코드 한 줄씩 이해하기
tasks_[id].status = "done"은 작업의 핵심 상태를 바꿉니다.- 파일 출력은 변경 결과를 디스크에 보존합니다.
EmailSdk::send는 외부 메일 서비스라는 별도 실패 원인을 만듭니다.ui_.refresh()는 사용자 화면을 다시 그립니다.
네 줄은 순서대로 실행되지만 같은 책임은 아닙니다. 예를 들어 파일 쓰기가 실패했는데 상태만 이미 바뀌었거나, 메일 서버가 느려 UI 갱신까지 늦어질 수 있습니다. 코드가 짧다는 사실만으로 변경 범위가 작은 것은 아닙니다.
| 새 요구 | 현재 수정·확인해야 할 곳 | 분리 뒤 주로 확인할 경계 |
|---|---|---|
| 파일 대신 DB에 저장 | completeTask와 전체 완료 흐름 | Storage 구현 |
| 메일 대신 게임 내 알림 | completeTask와 SDK 호출부 | Notifier 구현 |
| 완료 규칙 변경 | UI·저장 코드가 섞인 함수 | Task::complete |
| 완료 뒤 화면 표현 변경 | 핵심 상태 변경 코드까지 재검토 | UI 갱신 코드 |
5. 코드가 동작하는 이유
현재 코드는 기능은 수행하지만 파일 형식·메일 공급자·UI 중 하나만 바뀌어도 재컴파일과 전체 테스트가 필요합니다. 변경 지도는 추상화할 실제 축을 보여 줍니다.
실행 흐름은 상태 변경 → 저장 → 알림 → UI 갱신입니다. 이 순서를 먼저 적어 두면 무엇을 도메인 규칙으로 유지하고 무엇을 외부 효과로 분리할지 판단할 수 있습니다. 다음 강의의 책임 분리는 이 흐름을 없애는 것이 아니라 각 단계가 누구의 책임인지 드러내는 작업입니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
10. 다음 강의 연결
이번 강의에서는 변경 이유가 다른 네 책임을 찾아냈습니다. 다음 강의에서는 그 후보를 무조건 클래스로 만드는 대신, 응집도와 변경 결합을 기준으로 어떤 코드를 함께 두고 어디서 나눌지 판단합니다.
객체지향 설계는 왜 필요한가 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.