Python 기초

12 . 객체지향 프로그래밍 4대 패러다임

imysydesu 2026. 5. 29. 15:59

 

 

 

 

 

  • 객체지향 프로그래밍 4대 패러다임 : 캡슐화, 상속, 다형성, 추상화
  • 캡슐화 : 데이터(속성)와 기능(메서드)을 하나로 묶고 외부에서 직접 접근을 제한하여 객체를 보호하는 개념
  • 상속 : 기존 클래스의 속성과 메서드를 물려받아 재사용하고 확장하는 구조를 의미
  • 다형성 : 같은 이름의 메서드라도 객체의 종류에 따라 다르게 동작할 수 있게 함, 코드의 유연성을 높여줌
  • 추상화 : 복잡한 내부 구현은 숨기고 핵심적인 기능만 외부에 제공, 사용자는 세부 동작을 몰라도 객체를 쉽게 사용할 수 있게 해 줌
  • 4개의 개념을 통해 코드의 재사용성, 확장성, 유지보수성을 크게 향상할 수 있음

 

 

 

 

 


 

 

 

 

 

1 . 캡슐화(encapsulation)

 

 

 

  • 객체지향 프로그래밍에서 데이터(속성)와 이를 처리하는 메서드를 하나로 묶고 외부에서 내부 구현에 직접 접근하지 못하도록 제한하여 객체를 보호하는 개념
  • public, _protected, __private와 같은 네이밍 규칙을 통해 접근 수준을 구분함
  • public : 모든 곳에서 접근 가능
  • protected : 같은 패키지 + 상속받은 클래스 접근 가능
  • private : 같은 클래스 내부에서만 접근 가능
  • 필요할 경우 getter/setter 메서드나 @property를 사용해 안전하게 값을 읽고 수정할 수 있음
  • 객체의 상태를 임의로 변경하는 것을 방지하고 코드의 안정성과 유지보수성을 높임

 

 

 

- getter/setter 사용 예시

 

 

 

 

 

- print(apple.__price) -> 캡슐화를 해놨기 때문에 직접 접근 불가, 에러 발생

- apple.price = 10000

  print(apple.__price) 라고 코드를 입력하면 에러 발생 X 

- 하지만 변수 값을 변경한 것이 아니라 apple.__price라는 새로운 변수를 만든 것

 

 

 

 

 

 

- @property 사용 예시

 

 

 

 

 

 

 

 

 

  • getter/setter은 메서드 호출 방식이라 apple.set_price(3500)으로 사용했다면
  • @property는 속성 접근 방식이라 변수에 값을 넣는 것처럼 apple.price = 3500 로 사용 가능

 

 

 

 

 

 

 


 

 

 

 

 

 

2 . 상속(inheritance)

 

 

 

  • 객체지향 프로그래밍에서 기존 클래스(부모 클래스)의 속성과 메서드를 새로운 클래스(자식클래스)가 물려받아 재사용하고 확장하는 개념
  • 공통 기능을 중복 작성하지 않고 코드 재사용성을 높일 수 있으며 자식 클래스는 부모의 기능을 그대로 사용하거나, 필요한 부분만 추가하거나, 오버라이딩(재정의)해서 동작을 변경할 수 있음
  • 파이썬에서는 class 자식 클래스(부모 클래스) 형태로 상속 구현
  • super()를 사용해 부모 클래스의 초기화나 메서드를 호출할 수 있음
  • 코드의 유지보수성과 확장성을 크게 향상하는 핵심 개념

 

 

- 기본값

 

class Parent:

     pass

 

class Child(Parent):

     pass

 

 

 

 

 

2 - 1 . 상속 구조

 

  • 부모 클래스 생성

 

 

 

  • 자식 클래스 생성

 

 

 

 

 

 

 

 

 

2 - 2 . 생성자 호출

 

 

 

- __init__  : 객체 만들 때 초기 설정 하는 함수

- 자식에  __init__ 가 없으면 부모 생성자 자동 사용

- 자식에  __init__ 가 있으면 자식에서 직접 초기화한다는 의미라 부모 생성자 호출 안 함

- 자식에  __init__ 가 있으면  super() 를 사용하는 것이 일반적 -> super().__init__()

 

 

 

 

 

 

 

 

 

 

 

2 - 3 . 오버라이딩(overriding)

 

 

 

 

  • 상속 관계에서 부모 클래스에 이미 정의된 메서드를 자식 클래스에서 동일한 이름으로 다시 정의하여 동작을 변경하는 것을 의미
  • 자식 클래스는 부모의 기본 기능을 그대로 사용할 수도 있고 필요에 따라 일부, 전체를 자신에 맞게 수정할 수 있음
  • 파이썬에서는 별도의 키워드 없이 같은 메서드 이름을 정의하면 자동으로 오버라이딩이 이루어지며 필요할 경우 super()를 사용해 부모 메서드를 함께 호출할 수 있음

 

 

 

 

 

 

- self.place = place를 사용하지 않는 이유 : 일회용 지역 변수라 저장할 필요가 없기 때문

 

- self.변수 O : 객체의 상태를 기억해야 할 때(나중에 다시 쓸 데이터)

- self.변수 X : 객체의 동작을 수행할 때만 일시적으로 사용할 때 (잠시 쓰고 버리는 데이터)

 

 

 

 

 

 

2 - 4 . 다중 상속

 

 

 

  • 클래스가 둘 이상의 부모 클래스로부터 상속을 받는 기능
  • 파이썬은 다른 많은 객체 지향 언어와 달리 다중 상속 지원
  • 코드의 재사용성을 향상할 수 있지만 동시에 복잡성이 높아짐

 

 

 

- 기본값

 

class Parent1:

     pass

class Parent2:

     pass

class Child(Parent1, Parent2):

     pass

 

 

 

 

- 부모 클래스인 Fruit, Storage에 똑같은 이름의 함수 sleep가 있음 -> sleep 실행 시 어떤 부모 클래스를 사용해야 하는지      MRO에 따라 실행 됨

 

 

 

 

 

 

objaect  클래스

 

 

  • 모든 클래스의 최상위 부모 클래스로 사용자가 클래스를 정의할 때 명시적으로 상속하지 않아도 자동으로 상속되는 기본 클래스
  • 객체가 가져야 할 최소한의 공통 기능을 제공하며 __str__, __repr__, __eq__ 같은 기본 매직 메서드의 기본 구현을 포함하고 있음
  • 모든 파이썬 객체는 내부적으로 object 기반으로 동작하며 새로운 클래스를 정의할 때도 기본 기능들을 물려받아 사용할 수 있음
  • 파이썬 객체 시스템의 가장 기초가 되는 공통 부모

 

 

 

MRO

 

 

  • 다중 상속을 사용할 때 메서드나 속성을 찾는 순서를 정의하는 규칙
  • 여러 부모 클래스를 상속받는 경우에 어떤 부모 클래스에서 메서드를 먼저 찾을지 결정해 클래스 간의 메서드 충돌을 해결할 수 있음
  • print(   .mro()) 출력 시 순서 알려줌

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

3 . 다형성

 

 

 

  • 같은 이름의 메서드나 함수를 호출하더라도 객체의 종류에 따라 서로 다른 방식으로 동작하는 특성을 의미
  • 정적 타입 언어처럼 명시적인 인터페이스 구현을 요구하지 않고 동일한 메서드를 가지고 있으면 타입과 관계없이 사용할 수 있는 덕 타이핑을 기반으로 다형성을 자연스럽게 지원
  • 코드의 유연성과 확장성을 높여주고 새로운 기능을 추가할 때 기존 코드를 수정하지 않아도 됨

- 덕 타이핑(duck typing) : 객체에 실제 클래스가 무엇인지 중요하지 않고 필요한 메서드나 기능을 가지고 있으면 같은 방식으로 사용하는 것

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

4 . 추상화(abstraction)

 

 

 

  • 복잡한 내부 구현은 숨기고 외부에서는 필요한 핵심 기능만 간단하게 사용할 수 있도록 만드는 개념
  • 사용자는 객체가 내부적으로 어떻게 동작하는지 몰라도 제공된 메서드만으로 기능을 사용할 수 있음
  • 코드의 복잡도를 줄이고 이해와 사용을 쉽게 함
  • 일반 클래스 설계뿐 아니라 abc 모듈의 ABC와 @abstractmethod를 사용해 추상 클래스로 정의
  • 반드시 구현해야 하는 메서드를 강제함으로써 일관된 구조를 유지할 수 있음
  • 추상화는 '어떻게 동작하는지'보다 '무엇을 할 수 있는지'에 집중하게 만드는 설계 방식임

 

 

  • from abc import ABC, abstractmethod

-> 필요할 때 메모리에서 올려서 사용, 추상 클래스로 정의하는 코드

-> abc :  모듈 이름(abc.py)

-> abc 파일 중에 ABC 클래스와 abstractmethod 펑션만 메모리에 올리겠다는 의미

 

 

 

 

 

 

 

 

 

 


 

'Python 기초' 카테고리의 다른 글

14 . 매직 메서드  (0) 2026.05.29
13 . 예외 처리  (0) 2026.05.29
11 . 객체지향 프로그래밍(OOP)  (0) 2026.05.28
10 . 사용자 정의 함수  (0) 2026.05.28
9 . 제어문 - 반복문  (0) 2026.05.27