컴퓨터 공학 기초
객체 지향 프로그래밍(OOP)의 모든 것: 원칙, 설계, 실무 적용 사례 중심 정리
JeongPark
2025. 5. 22. 14:24
728x90
객체 지향 프로그래밍(OOP) 정리
OOP란?
객체 지향 프로그래밍(Object-Oriented Programming) 은 프로그램을 객체(=데이터 + 행위) 중심으로 구성하는 방식이다. 함수 중심(절차지향)과 달리, 객체들이 서로 메시지를 주고받으며 역할을 나누는 모듈화 된 설계 철학이다.
OOP의 핵심 개념
용어 | 설명 |
객체(Object) | 속성(데이터) + 메서드(행동)를 가진 단위 |
클래스(Class) | 객체를 만들기 위한 틀 (템플릿, 설계도) |
인스턴스 | 클래스로부터 생성된 실제 객체 |
메서드 | 클래스 내부에 정의된 함수 |
속성 | 객체가 가지는 데이터 |
OOP의 4대 원칙 (SOLID 기초)
원칙 | 설명 | 실무 예시 |
추상화 | 객체의 핵심만 보여주고, 복잡한 내부는 숨김 | interface UserRepository → 내부 구현은 숨김 |
캡슐화 | 속성은 외부에 직접 노출하지 않고, 메서드를 통해 제어 | private password + setPassword() |
상속 | 부모 클래스의 속성과 메서드를 자식이 물려받음 | class AdminUser extends User |
다형성 | 같은 메서드 이름이라도 구현은 다르게 가능 | sendNotification() → Email vs SMS |
TypeScript 예제 기반 설명
abstract class Animal {
constructor(public name: string) {}
abstract speak(): void; // 추상화
}
class Dog extends Animal {
speak() {
console.log(`${this.name} says: 멍멍`);
}
}
class Cat extends Animal {
speak() {
console.log(`${this.name} says: 야옹`);
}
}
const animals: Animal[] = [new Dog('초코'), new Cat('나비')];
animals.forEach(animal => animal.speak()); // 다형성
실무에서 OOP가 중요한 이유
효과 | 설명 |
유지보수성 | 역할을 나눠서 수정 범위를 최소화할 수 있음 |
재사용성 | 클래스/인터페이스 재활용이 용이함 |
확장성 | 새로운 기능을 기존 구조에 쉽게 추가할 수 있음 |
테스트 용이성 | 의존성 분리로 유닛 테스트가 가능 (DI 구조와 함께 활용됨) |
▶ 내가 경험한 예시들
- 인증 서비스에서 중복 로그인 제어: SessionFactory, SessionRepository 등의 클래스를 분리해 역할 분담을 명확히 하고, Redis 세션 저장 구조를 적용함.
- 비밀번호 재설정 흐름: SendResetCodeUsecase, VerifyResetCodeUsecase 등을 분리해 단일 책임 원칙(SRP)에 맞춘 구조 설계.
- DTO와 엔티티의 구분: RegisterUserDto, UserEntity를 명확히 나눠 내부 도메인과 외부 요청을 캡슐화함.
- DI 기반 구조: 모든 서비스 클래스가 인터페이스 기반으로 주입되도록 구성하여 테스트와 유지보수의 유연성 확보.
OOP 기반 설계 예시 (도메인: 인증 시스템)
- User (Entity): 사용자 정보 표현
- UserRepository (Interface): 데이터 접근 정의
- UserService (비즈니스 로직): 도메인 처리
- RegisterUserUsecase (유즈케이스 단위): 하나의 작업 단위로 구성
- UserController (입출력 처리): 외부 요청 처리
→ 각 객체가 자신의 역할만 수행하며 **SRP(단일 책임 원칙)**에 충실한 구조를 지닌다
OOP와 SOLID 원칙 관계
OOP는 SOLID 원칙과 함께 설계해야 유지보수성과 확장성을 확보할 수 있다.
원칙 | 의미 |
Single Responsibility | 한 클래스는 하나의 책임만 가져야 함 |
Open/Closed | 확장에는 열려 있고, 변경에는 닫혀 있어야 함 |
Liskov Substitution | 부모 타입 대신 자식 타입을 사용해도 프로그램이 정상 동작해야 함 |
Interface Segregation | 인터페이스는 사용 목적에 따라 작은 단위로 나누어야 함 |
Dependency Inversion | 구현보다 추상화에 의존해야 함 (ex: 인터페이스 기반 의존성 주입) |
요약
- OOP는 "객체(데이터 + 메서드) 중심"의 프로그래밍 패러다임이다.
- 4대 원칙: 추상화, 캡슐화, 상속, 다형성
- 실무에선 SRP, DI, 인터페이스 기반 설계, 테스트 구조화에 핵심
- NestJS, Spring 등 주요 프레임워크 대부분이 OOP 기반으로 설계됨
반응형