컴퓨터 공학 기초

객체 지향 프로그래밍(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 기반으로 설계됨
반응형