객체 지향 프로그래밍 (1) - OOP란?

Jiseong Choi·2025년 4월 6일

디자인 패턴

목록 보기
1/3

클래스 기반 TypeScript를 새로 공부하면서 객체 지향 프로그래밍이 뭔지, 어떻게 사용하는지, 꼭 지켜야하는 원칙 등 다시 학습을 하기 위해 정리해보려고 한다!
이번 포스트에서는 객체 지향 프로그래밍이 무엇인지, 장단점이 뭔지, 언제 사용하는지에 대해 정리해보려고 한다!

🎯 객체 지향 프로그래밍(OOP, Object-Oriented Programming)이란?

프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체(Object)'라는 기본 단위로 나누고 이들의 상호 작용으로 서술하는 방식이다.
객체 지향 프로그래밍의 반대 개념으로는, 절차적 프로그래밍(PP, Procedure Programming) 이라는 것이 있다. 절차적 프로그래밍은 따로 정리해보겠다!

객체란?

'메소드, 변수'를 가지며 특정 역할을 수행하도록 인간이 정의한 추상적인 개념이다.
쉽게 말해 현실 세계의 사물이나 개념을 코드로 표현한 것이라고 보면 된다.
ex) 사람, 자동차, 게시글 등


🏗 객체 지향은 설계 기법이다.

객체 지향은 단순히 코드를 "작성"하는 방식이 아니라, 어떻게 구조화하고, 어떤 기준으로 책임을 나눌 것인지에 대한 설계 철학이다.

📌 왜 설계 기법인가?

  • 객체 지향은 프로그램을 구성하고 설계하는 방법에 대한 이야기이다.
  • 어떤 클래스를 만들고, 어떤 책임을 갖게 하고, 어떤 객체들이 상호작용해야 할지를 먼저 설계한 뒤 구현에 들어간다.
  • 즉, OOP는 코드를 어떻게 나눌 것인가, 모듈 간의 의존성을 어떻게 줄일 것인가, 변경에 유연하게 대응할 수 있는 구조는 어떤가 등을 고민하며 만드는 설계 중심의 접근법이다.

그래서 객체 지향은 단순한 문법의 사용이 아닌, 좋은 소프트웨어 구조를 만들기 위한 설계 원칙으로 이해해야 한다.


👍🏻 객체 지향 프로그래밍의 장점

1. 자연적인 모델링

OOP는 사물이나 개념을 코드로 모델링하기 좋은 구조를 제공한다.
예를 들어 "사람", "자동차", "게시글" 같은 개념을 객체로 표현하면, 실제 업무 로직을 그대로 코드로 옮겨오기 쉬워지고, 이해하기 직관적인 구조를 만들 수 있다.

2. 유지보수와 확장성

  • 각 객체는 자신만의 책임과 역할을 가지므로, 변경 사항이 있어도 다른 객체에 영향을 최소화할 수 있다.
  • 각 기능 확장시에도 새로운 클래스를 추가하거나 기존 객체를 상속, 위임, 합성 등의 방법으로 유연하게 확장할 수 있다.

3. 코드 재사용성

  • 한 번 정의한 객체나 클래스를 다양한 곳에서 재사용할 수 있다.
  • 상속이나 다형성을 활용하면 공통 로직을 추상화하고, 필요한 부분만 확장하는 구조로 재사용성을 극대화할 수 있다.

👎🏻 객체 지향 프로그래밍의 단점

1. 복잡한 구조

  • OOP는 객체 간의 관계와 상호작용을 잘 설계해야 하기 때문에, 작은 프로젝트에 적용하면 오히려 과하게 복잡해질 수 있다!
  • 클래스, 인터페이스, 상속 구조 등이 많아지면 코드의 구조를 이해하는데 시간이 오래 걸릴 수 있다.

2. 과도한 추상화의 위험

  • 추상화는 유연성을 높여주지만, 지나친 추상화는 오히려 이해를 어렵게 만들고 유지보수를 힘들게 할 수 있다
  • 객체를 지나치게 쪼개거나 역할을 억지로 분리하다 보면 불필요한 클래스가 많아져서 생산성이 떨어질 수 있다.

3. 실행 흐름 추적이 어려움

  • 객체 간에 메시지를 주고받으며 동작하기 때문에, 함수형 프로그래밍처럼 흐름이 직관적으로 보이지 않을 수 있다.
  • 특히 초보자에게는 객체 간의 상호작용 구조가 디버깅이나 테스트를 어렵게 느껴지게 할 수 있다.

4. 단위 테스트가 어려울 수 있다.

  • 객체가 외부 상태에 의존하거나 다른 객체와 밀접하게 연결되어 있으면, 테스트를 위해 많은 설정(mocking, stub 등)이 필요할 수 있다.
  • 의존성이 많은 객체는 테스트 코드 작성이 복잡해지고, 유닛 테스트의 순수성이 떨어질 위험도 있다.

5. 성능 오버헤드

  • 캡슐화, 다형성, 상속 등의 기능은 런타임 시 메모리 사용량이나 호출 비용이 늘어날 수 있다.
  • 특히 실시간 처리가 중요한 시스템에서는, OOP보다는 절차지향이나 함수형 방식이 유리한 경우도 있다.

🧱 그럼 OOP는 언제 적합할까?

  • 복잡한 비즈니스 로직이 많은 대규모 프로젝트
  • 도메인 중심 설계(Domain-Driven Design, DDD)를 도입한 시스템
  • 협업이 많고 모듈화가 중요한 프로젝트
  • 시간이 지남에 따라 유지보수/기능 추가가 자주 일어나는 장기 운영 서비스

💬 객체 지향 프로그래밍 예시!

자동차 객체 예시

  • 속성 (Property): 객체가 가지는 고유한 데이터나 상태
  • 메서드 (Method): 객체가 수행할 수 있는 기능이나 동작
class Car {
  /* 속성 */
  private readonly brand: string; // readonly: 한 번 초기화 이후 변경할 수 없도록 사용하는 키워드
  private color: string;
  
  // 생성자: 객체가 생성될 때 속성 초기화
  constructor(brand: string, color: string) {
    this.brand = brand;
    this.color = color;
  }

  /* 메서드 */
  startEngine() {
    console.log(`${this.brand} 시동을 겁니다.`);
  }

  drive() {
    console.log(`${this.brand}를 운전 중입니다.`);
  }

  changeColor(color: string) {
    this.color = color;
    console.log(`자동차의 색상이 ${this.color}로 변경되었습니다.`)
  }
}

const myCar = new Car('Hyundai', 'black');
myCar.startEngine(); // Hyundai 시동을 겁니다.
myCar.changeColor('blue');	// 자동차의 색상이 blue로 변경되었습니다.

👪 객체지향언어의 종류

Java, C++, C#, Phthon, JavaScript, TypeScript, Swift, Kotlin, Ruby, PHP, Objective-C 등

  • Java : 100% 객체지향 언어에 가깝다. 대부분 대기업, 중견기업에서 많이 사용한다.
  • C++ : C 언어에 객체지향 개념이 추가된 언어이다. 성능 중심의 응용 프로그램에 사용된다.
  • C# : 마이크로소프트에서 만든 언어로, .NET 기반의 객체지향 프로그래밍에 최적화되어있다.
  • Python : 동적 타입 언어로 객체지향뿐 아니라 함수형, 절차형도 지원한다. AI, 머신러닝, 딥러닝, 데이터 분석 분야에서 많이 사용한다.
  • JavaScript : 원래는 함수형 기반 언어였지만, ES6 이후 클래스 기반 객체지향 프로그래밍으로 개발이 가능해졌다.
  • TypeScript : JavaScript에 정적 타입과 클래스 기반 객체지향 기능을 추가한 언어로 대규모 프로젝트에 적합하다.
profile
나 혼자 공부하고, 끄적이는 공간. (Node.JS / Back-End Developer)

0개의 댓글