IT Study/SW 개발 및 프로그래밍

💻 객체지향 프로그래밍(OOP)의 핵심 원칙 (추상화, 캡슐화 등)

cs_bot 2025. 4. 7. 16:52

1. 개요

  • 객체지향 프로그래밍(Object-Oriented Programming, OOP)은 현실 세계를 객체 단위로 추상화하여 소프트웨어를 구성하는 프로그래밍 패러다임임
  • 프로그램을 객체의 상호작용으로 구성함으로써 유지보수성과 재사용성, 확장성을 향상시키는 데 목적이 있음
  • 절차지향 프로그래밍의 한계를 극복하고 대규모 소프트웨어 개발의 복잡도 제어에 적합함

2. 객체지향 프로그래밍의 4대 핵심 원칙

OOP는 다음의 네 가지 핵심 개념에 기반하여 구조화됨


(1) 추상화 (Abstraction)
  • 현실 세계의 복잡한 사물이나 개념에서 핵심적인 속성과 기능만을 추출하여 모델링하는 기법임
  • 불필요한 내부 구현은 숨기고, 외부에서 필요한 기능만을 인터페이스로 제공함
  • 소프트웨어 개발자가 시스템을 단순화하여 이해하고 설계할 수 있도록 돕는 추상적 구조 구성 가능
  • 예: 자동차 객체는 ‘운전’, ‘정지’라는 기능만 제공하고, 내부 엔진 작동 원리는 외부에서 몰라도 되도록 추상화함

(2) 캡슐화 (Encapsulation)
  • 객체의 상태(데이터)와 행위(메서드)를 하나의 단위로 묶고, 외부로부터 직접 접근하지 못하도록 차단하는 원칙임
  • 정보 은닉(Information Hiding)을 통해 데이터의 무결성을 보호함
  • 외부에서는 접근자(getter)와 설정자(setter)와 같은 인터페이스를 통해 간접적으로 객체 내부와 상호작용함
  • 잘 설계된 캡슐화 구조는 변경이 발생해도 영향이 최소화되므로 유지보수 효율성 향상

(3) 상속 (Inheritance)
  • 기존 클래스(부모 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스)가 물려받아 재사용하는 구조임
  • 코드 재사용성을 극대화하며, 계층적 설계를 통해 공통 로직은 상위 클래스에, 특수 로직은 하위 클래스에 정의함
  • 다형성과 결합되어 객체 간 유연한 관계 설정 가능
  • 단일 상속, 다중 상속, 인터페이스 기반 상속 등의 다양한 형태 존재

(4) 다형성 (Polymorphism)
  • 동일한 메시지를 여러 객체가 각기 다른 방식으로 처리할 수 있는 능력
  • 오버로딩(Overloading)과 오버라이딩(Overriding)의 두 가지 주요 형태로 구현
    • 오버로딩: 같은 이름의 메서드가 매개변수의 타입 또는 개수에 따라 다르게 작동
    • 오버라이딩: 상속 구조에서 상위 클래스의 메서드를 하위 클래스에서 재정의하여 다른 동작 수행
  • 실행 시간에 객체의 실제 타입에 따라 호출될 메서드가 결정되는 동적 바인딩(Dynamic Binding) 기법과 밀접하게 관련됨
  • 시스템 확장 시 유연한 구조 설계 가능

3. 객체지향 설계 원칙과의 연계

OOP의 4대 원칙은 객체지향 설계 원칙(예: SOLID 원칙)과 긴밀하게 연계되어 고품질 소프트웨어 아키텍처의 기반이 됨

  • 단일 책임 원칙(SRP): 추상화를 통해 각 클래스가 하나의 책임만 가지도록 유도함
  • 개방-폐쇄 원칙(OCP): 다형성과 상속을 활용하여 기존 코드를 수정하지 않고 기능 확장 가능
  • 리스코프 치환 원칙(LSP): 상속 구조 내에서 자식 클래스가 부모 클래스를 대체할 수 있도록 설계 유도
  • 인터페이스 분리 원칙(ISP): 캡슐화를 통해 불필요한 의존 제거 및 인터페이스 최소화
  • 의존 역전 원칙(DIP): 추상화된 객체 간 상호작용을 강조하여 결합도 낮춤

4. 객체지향 프로그래밍 적용의 장단점

장점

  • 유지보수성 및 확장성 우수
  • 코드 재사용 가능성 향상
  • 대규모 시스템 설계 시 모듈화 및 관리 용이
  • 도메인 모델링에 적합하여 현실 세계와 유사한 시스템 구현 가능

단점

  • 초기 설계와 클래스 구조 정의에 시간 소요
  • 과도한 객체화 시 성능 저하 및 복잡성 증가 가능
  • 설계 원칙을 제대로 따르지 않을 경우 되려 결합도 상승

5. 결론

  • 객체지향 프로그래밍은 추상화, 캡슐화, 상속, 다형성이라는 네 가지 핵심 원칙을 바탕으로 구성됨
  • 각 원칙은 독립적으로 동작하는 것이 아니라 상호 연계되어 소프트웨어 품질을 향상시키는 데 기여함
  • 올바른 객체지향 설계와 구현을 통해 복잡한 소프트웨어 시스템을 효율적으로 구축하고 유지 가능