OOP : 객체를 중심으로 프로그램을 구성하는 프로그래밍 방법
소프트웨어 규모 증가 → 생산성과 유지보수성의 문제 발생, 코드 재사용 필요성 증가. 절차지향: 전역변수 데이터 변경의 책임 불분명 및 추적 어려움. 상태를 바꿔도 되는 주체가 명확하지 않음 함수 단위의 재사용만 가능하고, 관련된 데이터 및 함수를 하나의 묶음으로 재사용하기는 어려움.
OOP 패러다임 : 속성과 행위를 가진 객체들의 상호작용으로 세계를 모델링하는 설계철학
| 절차지향 | 객체지향 | |
|---|---|---|
| 개념 | 함수 중심 절차적 구성 | 데이터와 기능을 하나의 객체로 캡슐화하여 모델링 |
| 핵심사고 | 알고리즘의 순차적 표현 | 책임 중심 |
| 유지보수성 | 데이터와 기능의 분리 | |
| → 전역변수 사용빈도 높음 | ||
| → 데이터 변경의 책임 불분명 및 추적 어려움 | 용이. | |
| 재사용성 | 함수 단위의 재사용만 가능 | 상속, 합성, 다형성을 이용해 클래스 단위로 재사용 |
| class variable | instance variable |
|---|---|
| 각 클래스가 소유하는 variable | |
| 모든 인스턴스가 공유함. | 각 인스턴스가 소유하는 variable |
| 각 인스턴스가 다른 값을 가짐. | |
| class A: |
class_variable = 15 | class A:
def __init__(self):
self.instance_var = 57 |
polymorphism: 하나의 이름으로 다양한 형태의 동작을 수행하는 능력
→ 확장성; 기존 코드를 건드리지 않고 새로운 기능을 추가할 수 있음
오버라이딩: 부모의 기능을 자식에 맞게 재정의 → 어떤 클래스의 객체이냐에 따라 다른 동작
Duck Typing: 상속 없이도 같은 이름의 함수를 가지고 있다면 다형성 구현 가능 파이썬의 특징. 타입보다 유연성을 강조
class Dog: def speak(self): print("bark")
class Cat: def speak(self): print("meow")
for o in [Dog(), Cat()]: o.speak()
연산자 오버로딩: 연산자의 의미를 객체에 맞게 재정의
__add__, __sub__, __mul__, __eq__ 등 특수 메서드로 구현
같은 연산자이지만 객체 타입에 따라 다른 동작을 하므로 다형성
추상 클래스 이용
클래스 내부의 중요한 데이터를 은닉하고, 외부에서는 공개된 메서드를 통해서만 접근하도록 함