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. 결론
- 객체지향 프로그래밍은 추상화, 캡슐화, 상속, 다형성이라는 네 가지 핵심 원칙을 바탕으로 구성됨
- 각 원칙은 독립적으로 동작하는 것이 아니라 상호 연계되어 소프트웨어 품질을 향상시키는 데 기여함
- 올바른 객체지향 설계와 구현을 통해 복잡한 소프트웨어 시스템을 효율적으로 구축하고 유지 가능
'IT Study > SW 개발 및 프로그래밍' 카테고리의 다른 글
💻 동기 프로그래밍 vs 비동기 프로그래밍 차이와 적용 시기 (1) | 2025.04.08 |
---|---|
💻 재사용성과 확장성을 고려한 모듈 설계 원칙(SOLID) (1) | 2025.04.08 |
💻 정적 타이핑 언어 vs 동적 타이핑 언어 (1) | 2025.04.05 |
💻 이벤트 기반 아키텍처(Event-Driven Architecture, EDA) (0) | 2025.04.04 |
💻 함수형 프로그래밍(Functional Programming) 재조명 (0) | 2025.04.03 |