C++, CS

[C++] 객체지향 프로그래밍(OOP) 정리

dhlee-dev 2026. 4. 22. 20:30

C++를 공부하다 보면 클래스, 상속, virtual, override 같은 개념을 자주 만나게 된다.

이런 문법들은 각각 따로 외우는 것보다
객체 지향 프로그래밍이라는 큰 틀 안에서 이해하는 것이 더 중요하다고 생각했다.

그래서 이번 글에서는 객체 지향 프로그래밍의 개념과 핵심 특징,
장단점, 그리고 SOLID 원칙을 간단히 정리해보려고 한다.


객체 지향 프로그래밍의 개념과 핵심 특징

객체 지향 프로그래밍은 관련된 속성(데이터)과 동작(기능, 메서드)을 하나의 객체로 묶고,
객체 간의 상호작용을 중심으로 프로그램을 구성하는 방식이다.

객체 지향 프로그래밍의 핵심 특징은 보통 다음 4가지로 정리한다.

1. 캡슐화

캡슐화는 관련 있는 데이터와 메서드를 하나로 묶고,
필요한 기능만 외부에 공개하면서 내부 구현은 감추는 것이다.

내부 구현을 감추고 정해진 방식으로만 접근하게 만드는 것을 정보 은닉이라고 한다.

2. 다형성

다형성은 같은 이름의 기능이라도 객체에 따라 다르게 동작할 수 있는 성질이다.
대표적인 예시로는 오버라이딩(Overriding)이 있다.

즉, 같은 함수를 호출하더라도 실제 어떤 객체를 다루는지에 따라 다른 결과가 나올 수 있다.

3. 상속

상속은 기존 클래스의 특성을 물려받아 새로운 클래스를 만드는 것이다.
공통된 기능을 재사용하기 좋고 클래스 간의 계층 구조를 표현하는 데 유용하다.

4. 추상화

추상화는 중요한 공통 속성과 기능만 추려내어 표현하는 것이다.
복잡한 내부 구현을 모두 드러내기보다 필요한 핵심 개념만 뽑아서 다루는 방식이라고 볼 수 있다.


객체 지향 프로그래밍의 장점과 단점

장점

  • 코드 재사용성이 높아질 수 있다.
  • 수정에 유연한 구조를 만들 수 있다.
  • 클래스 단위로 모듈화가 가능해 대형 프로젝트에 적합하다.

객체별로 역할을 나눠 설계할 수 있기 때문에
기능이 많아질수록 구조적인 장점이 더 잘 드러난다고 생각한다.

단점

  • 초기 설계에 시간이 많이 들 수 있다.
  • 추상화, 상속, 다형성 등에 의해 오버헤드가 발생할 수 있다.

작은 프로그램에서는 오히려 구조가 과해질 수 있고,
잘못 설계하면 복잡도만 높아질 수도 있다.


객체 지향 프로그래밍의 설계 원칙 : SOLID

객체 지향 프로그래밍에서는 좋은 설계를 위해 지켜야하는 원칙이 있다.
아래에 이 5가지 원칙을 정리해보았다.

1. SRP(Single Responsibility Principle) : 단일 책임 원칙

클래스는 하나의 책임만 가져야 하며,
클래스가 변경되는 이유도 하나여야 한다는 원칙이다.

이는 한 클래스에 너무 많은 역할을 몰아넣지 말고 역할별로 책임을 분리해야 한다는 뜻이다.

2. OCP(Open Closed Principle) : 개방-폐쇄 원칙

확장에는 열려 있고, 수정에는 닫혀 있어야 한다는 원칙이다.
기존 코드를 크게 변경하지 않고도 새로운 기능을 추가할 수 있어야 한다는 뜻이다.

3. LSP(Liskov Substitution Principle) : 리스코프 치환 원칙

부모 클래스를 사용하는 곳에 자식 클래스를 넣어도 프로그램이 올바르게 동작해야 한다는 원칙이다.
상속 관계라면 자식은 부모의 역할을 자연스럽게 대체할 수 있어야 한다는 것을 의미한다.

4. ISP(Interface Segregation Principle) : 인터페이스 분리 원칙

필요 없는 기능까지 강제로 의존하지 않도록
인터페이스는 작고 구체적으로 나누어야 한다는 원칙이다.

큰 인터페이스 하나보다는 목적에 맞는 작은 인터페이스 여러 개가 더 좋을 수 있다.

5. DIP(Dependency Inversion Principle) : 의존 역전 원칙

상위 모듈은 하위 모듈에 직접 의존하면 안 되고,
둘 다 구체적인 구현이 아니라 추상화에 의존해야 한다는 원칙이다.

즉, 구체적인 클래스에 강하게 묶이지 않고
추상적인 인터페이스를 기준으로 설계해야 유연한 구조를 만들 수 있다.


마무리

객체 지향 프로그래밍은 단순히 클래스를 사용하는 문법이 아니라,
역할과 책임을 나누고, 변경에 유연한 구조를 만드는 설계 방식이라고 볼 수 있다.

캡슐화, 다형성, 상속, 추상화 같은 특징을 이해하는 것도 중요하지만,
실제로 코드를 작성할 때는 SOLID 원칙까지 함께 고려해야
더 유지보수하기 좋은 구조를 만들 수 있다고 생각했다.

앞으로 클래스를 설계할 때 단순히 기능만 구현하는것이 아니라,
좋은 설계가 될 수 있도록 고민하면서 구현해야겠다.