Object-Oriented Programming객체지향 프로그래밍
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 데이터와 그 데이터를 처리하는 메서드를 객체(Object) 단위로 묶어 프로그램을 설계하는 프로그래밍 패러다임이다. 1960년대 Simula에서 시작해, C++·Java·Python·Solidity 등 현대 언어 대부분이 채택하고 있다.
현실 세계 모델링: OOP의 핵심 철학은 현실 세계에 존재하는 사물과 개념을 속성(Attribute)과 행동(Method)으로 표현해 프로그램 구조를 직관적으로 설계하는 것이다. 자동차를 예로 들면 브랜드·모델·색상은 속성, 가속·제동·주차는 메서드에 해당한다.
클래스와 객체
| 개념 | 설명 | 비유 |
|---|---|---|
| 클래스 | 객체를 만들기 위한 설계도·템플릿 | 붕어빵 틀 |
| 객체(인스턴스) | 클래스로부터 생성된 실체 | 붕어빵 |
| 속성(Attribute) | 객체의 데이터·상태 | 팥소 양, 크기 |
| 메서드(Method) | 객체의 동작·행동을 정의하는 함수 | 굽다, 먹다 |
핵심 개념 4가지
1. 캡슐화 (Encapsulation)
데이터(속성)와 메서드를 하나의 객체로 묶고, 내부 구현을 외부에 숨기는 것. 게터(Getter)·세터(Setter) 메서드를 통해 외부 접근을 제어한다.
장점: 내부 구현 변경 시 외부 코드에 영향 없음. 잘못된 값 할당 방지.
2. 상속 (Inheritance)
부모 클래스(슈퍼클래스)의 속성·메서드를 자식 클래스(서브클래스)가 물려받는 것.
장점: 코드 재사용성 증가, 계층 구조 표현.
JavaScript는 다중 상속을 직접 지원하지 않으며, Mixin 패턴이나 인터페이스로 유사 기능을 구현한다.
3. 다형성 (Polymorphism)
같은 인터페이스로 다른 동작을 수행하는 것. 오버라이딩(Overriding)과 오버로딩(Overloading)으로 구현한다.
- •오버라이딩: 자식 클래스에서 부모 메서드를 재정의
- •오버로딩: 같은 메서드명으로 다른 시그니처 정의 (Java·C++ 지원, JS·Python은 기본 미지원)
장점: 동일한 코드로 다양한 객체 처리 가능.
4. 추상화 (Abstraction)
복잡한 내부 구현은 숨기고 필요한 인터페이스만 노출하는 것.
두 가지 유형:
- •데이터 추상화: 클래스 설계를 통해 공통 속성과 기능을 정의
- •행동 추상화: 추상 클래스·인터페이스로 자식 클래스의 구현을 강제
JavaScript 코드 예시
장점
| 장점 | 설명 |
|---|---|
| 코드 재사용성 | 상속·구성(Composition)으로 기존 코드를 재활용 |
| 유지보수성 | 캡슐화로 변경의 영향 범위를 클래스 내부로 제한 |
| 확장성 | 다형성으로 기존 코드 수정 없이 새 기능 추가 |
| 직관적 구조 | 현실 세계를 그대로 모델링해 비개발자도 이해 용이 |
| 협업 효율 | 역할별 클래스 분리로 팀 분업·병렬 개발 가능 |
단점
| 단점 | 설명 |
|---|---|
| 초기 설계 비용 | 클래스 계층 설계에 시간이 많이 소요됨 |
| 오버엔지니어링 | 소규모 프로젝트에서는 불필요하게 복잡해질 수 있음 |
| 학습 곡선 | 4대 원칙·디자인 패턴·SOLID 등 개념이 많아 입문 난도 높음 |
| 성능 오버헤드 | 객체 생성·메서드 디스패치 비용이 절차형보다 높을 수 있음 |
| 과도한 상속 | 상속 계층이 깊어지면 코드 추적·수정이 어려워짐 |
OOP vs 절차지향 비교
| 구분 | OOP | 절차지향 |
|---|---|---|
| 구성 단위 | 객체 (데이터 + 행동) | 함수·절차 |
| 데이터 접근 | 캡슐화로 제어 | 공유 전역 상태 |
| 유지보수 | 용이 (변경 범위 한정) | 상대적으로 어려움 |
| 확장성 | 높음 (상속·다형성) | 낮음 |
| 학습 곡선 | 가파름 | 완만함 |
| 적합한 규모 | 중·대규모 프로젝트 | 소규모·스크립트 |
| 대표 언어 | Java, C++, Python | C, Pascal |
언어별 비교
| 언어 | OOP 방식 | 특징 |
|---|---|---|
| Java | 완전 OOP | 모든 것이 클래스, interface 강조 |
| Python | 멀티패러다임 | 동적 타입, 간결한 문법 |
| C++ | 멀티패러다임 | 다중 상속 지원, 성능 최적화 |
| JavaScript | 프로토타입 기반 | ES6+ class 문법 추가 |
| Solidity | 제한적 OOP | contract=클래스, interface/abstract 지원 |
| Rust | 구조체+트레잇 | 상속 없음, 트레잇으로 다형성 구현 |
SOLID 원칙
객체지향 설계의 5가지 핵심 원칙.
| 원칙 | 설명 |
|---|---|
| S — 단일 책임 | 클래스는 하나의 책임만 가진다 |
| O — 개방-폐쇄 | 확장에는 열려 있고, 수정에는 닫혀 있다 |
| L — 리스코프 치환 | 자식 클래스는 부모 클래스를 대체할 수 있다 |
| I — 인터페이스 분리 | 사용하지 않는 인터페이스에 의존하지 않는다 |
| D — 의존성 역전 | 추상화에 의존하고, 구체화에 의존하지 않는다 |
디자인 패턴
OOP에서 반복적으로 나타나는 문제의 해결책.
| 분류 | 대표 패턴 | 설명 |
|---|---|---|
| 생성 | Singleton, Factory | 객체 생성 방식 정의 |
| 구조 | Adapter, Decorator | 클래스/객체 조합 구조 |
| 행동 | Observer, Strategy | 객체 간 협력·책임 분배 |
OOP vs 다른 패러다임
| 패러다임 | 핵심 개념 | 대표 언어 |
|---|---|---|
| OOP | 객체, 클래스, 상속 | Java, Python, C++ |
| 함수형 | 순수 함수, 불변성, 고차 함수 | Haskell, Erlang, Scala |
| 절차형 | 순서대로 실행되는 명령어 | C, Pascal |
| 선언형 | 결과를 기술, 과정은 추상화 | SQL, HTML |
Solidity와 OOP
스마트 컨트랙트 언어 Solidity는 OOP를 지원한다.
관련 개념
- •프로그래밍 언어론 — 튜링 완전과 언어 이론
- •Solidity — OOP 기반 스마트 컨트랙트 언어
- •스마트 컨트랙트 — contract 단위 캡슐화
- •Python — 멀티패러다임 OOP 언어
- •JavaScript — 프로토타입 기반 OOP
참고문헌
- 1.wntdev. (2024). OOP 객체지향 프로그래밍. Tistory.
- 2.clydehan. (2024). 객체 지향 프로그래밍(OOP). Velog.
- 3.Booch, G. (1994). Object-Oriented Analysis and Design with Applications.
- 4.Gamma et al. (1994). Design Patterns: Elements of Reusable Object-Oriented Software (GoF).
- 5.Martin, R.C. (2003). Agile Software Development: Principles, Patterns, and Practices (SOLID 원칙).