OOP : 객체를 중심으로 프로그램을 구성하는 프로그래밍 방법

소프트웨어 규모 증가 → 생산성과 유지보수성의 문제 발생, 코드 재사용 필요성 증가. 절차지향: 전역변수 데이터 변경의 책임 불분명 및 추적 어려움. 상태를 바꿔도 되는 주체가 명확하지 않음 함수 단위의 재사용만 가능하고, 관련된 데이터 및 함수를 하나의 묶음으로 재사용하기는 어려움.

OOP 패러다임 : 속성과 행위를 가진 객체들의 상호작용으로 세계를 모델링하는 설계철학

절차지향 객체지향
개념 함수 중심 절차적 구성 데이터와 기능을 하나의 객체로 캡슐화하여 모델링
핵심사고 알고리즘의 순차적 표현 책임 중심
유지보수성 데이터와 기능의 분리
→ 전역변수 사용빈도 높음
→ 데이터 변경의 책임 불분명 및 추적 어려움 용이.
재사용성 함수 단위의 재사용만 가능 상속, 합성, 다형성을 이용해 클래스 단위로 재사용
class variable instance variable
각 클래스가 소유하는 variable
모든 인스턴스가 공유함. 각 인스턴스가 소유하는 variable
각 인스턴스가 다른 값을 가짐.
class A:
class_variable = 15 | class A:
def __init__(self):
    self.instance_var = 57 |

다형성

polymorphism: 하나의 이름으로 다양한 형태의 동작을 수행하는 능력

→ 확장성; 기존 코드를 건드리지 않고 새로운 기능을 추가할 수 있음

  1. Plug & Play : 인터페이스만 동일하면 새로운 클래스를 추가 가능. usb를 통해 마우스와 키보드 등등을 모두 사용할 수 있는 것처럼
  2. 유연한 유지보수
  3. 클라이언트 입장에서 세부 구현을 알 필요가 없음

구현 방법

  1. 오버라이딩: 부모의 기능을 자식에 맞게 재정의 → 어떤 클래스의 객체이냐에 따라 다른 동작

  2. Duck Typing: 상속 없이도 같은 이름의 함수를 가지고 있다면 다형성 구현 가능 파이썬의 특징. 타입보다 유연성을 강조

    class Dog: def speak(self): print("bark")
    class Cat: def speak(self): print("meow")
    
    for o in [Dog(), Cat()]: o.speak()
    
  3. 연산자 오버로딩: 연산자의 의미를 객체에 맞게 재정의 __add__, __sub__, __mul__, __eq__ 등 특수 메서드로 구현

    같은 연산자이지만 객체 타입에 따라 다른 동작을 하므로 다형성

  4. 추상 클래스 이용

캡슐화

클래스 내부의 중요한 데이터를 은닉하고, 외부에서는 공개된 메서드를 통해서만 접근하도록 함