- 객체지향 프로그래밍 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 |