객체 지향 프로그래밍(Object‐Oriented Programming, OOP) - YooByWk/YooByWk.github.io GitHub Wiki
객체 지향 프로그래밍
객체 지향 프로그래밍(OOP) 은 데이터를 처리하는 절차가 아닌, 데이터와 데이터를 처리하는 함수(메서드)를 하나로 묶은 객체 를 중심으로 프로그램을 설계하는 패러다임. 실제 세계의 사물과 개념을 모델링하여 프로그램의 설계 및 구현을 용이하게 하는 데 중점을 둔다.
개요
OOP는 1960년대 시뮬라(Simula)언어에서 시작되었으며, 현재 Java, Python, C#, TypeScript 등 대규모 시스템 개발에 필수적인 주류 패러다임이다. OOP의 핵심 목표는 코드의 재사용성(Reusability), 유지보수성(Maintainability), 그리고 확장성(Extensibility) 을 높이는 데 있다.
핵심 개념
추상화 (Abstraction)
추상화란 복잡한 현실의 개체에서 필요한 속성과 동작만을 추출하고 불필요한 세부 구현 사항은 숨기는 과정이다. 이는 객체의 인터페이스 또는 추상 클래스를 정의하여 사용자가 객체 내부의 구현을 몰라도 기능에만 집중할 수 있게 한다.
캡슐화 (Encapsulation)
캡슐화는 데이터와 메서드를 하나의 단위로 묶고, 접근 제어자를 통해 외부에서의 직접 접근을 제한하여 데이터를 보호하는 메커니즘으로, 객체의 상태가 무분별하게 변경되는 것을 방지한다.
상속 (Inheritance)
기존 클래스(부모)의 속성과 기능을 새로운 클래스(자식)가 물려받아 재사용하고 확장할 수 있도록 하는 메커니즘이다. 이는 코드의 중복을 줄이고 계층적 관계를 구축하여 클래스 구조와 효율성을 높인다.
다형성 (Polymorphism)
하나의 객체나 메서드가 상황에 따라 다양한 형태(Different Form)로 동작할 수 있는 능력을 말한다.
- 메서드 오버라이딩 : 상속 관계에서 자식 클래스가 부모 클래스의 메서드를 재정의하여 자신의 목적에 맞게 구현한다.
- 인터페이스 기반 다형성 : 여러 객체가 동일한 인터페이스를 구현하도록 하여, 객체의 실제 타입에 관계 없이 동일한 방식으로 코드를 실행할 수 있도록 한다.
SOLID 원칙
OOP 설계를 안정적이고 유연하며 유지보수하기 쉽게 만들기 위한 다섯 가지 기본 원칙.
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)
구체적인 것에 의존하지 않고 추상적인 것에 의존해야 한다.
여담
JavaScript 에서의 OOP
자바스크립트는 ES6+에서 클래스 문법을 도입했으나, 내부적으로는 프로토타입 기반 상속을 사용한다. TypeScript는 명시적인 클래스 기반 OOP를 제공하며, Java와 같은 OOP언어에 익숙한 개발자에게 적응에 있어 용이하게 한다.
JavaScript에서는 클로저와 심볼을 이용해 흉내낼 수 있으며, TypeScript에서는 private와 protected 키워드를 명시적으로 제공한다.
Rust 에서의 OOP
Rust는 전통적인 상속을 지원하지 않음. 복잡한 계층 구조로 인한 단점을 피하기 위함.
OOP 요소 구현
- 캡슐화 : 모듈 시스템과 구조체의 필드를
pub을 사용하지 않아 기본적으로 비공개 (private)로 만들어 구현 - 다형성 : Trait 를 사용하여 다형성을 구현. Trait는 객체가 가질 수 있는 기능을 정의하는 인터페이스와 유사하다. -> DIP 만족
함수형 프로그래밍과의 관계
| 구분 | OOP | FP |
|---|---|---|
| 중심 요소 | 객체와 상태 | 함수와 값 |
| 주요 목표 | 구조화 & 재사용성 | 상태 변화 통제 & 예측 가능성 |