Python의 최상위 클래스인 object
는 모든 클래스가 암묵적으로 상속받는 기본 클래스로, 객체지향 프로그래밍(OOP, Object-Oriented Programming)의 원칙을 따르도록 하는 핵심적인 역할을 합니다. Python 3에서는 모든 클래스가 자동으로 object
클래스를 상속받아, 객체 지향 패러다임을 따르는 구조로 설계됩니다.
Python의 최상위 클래스 object
의 목적
- 모든 클래스의 기본 기능 제공: Python의 모든 클래스는
object
를 상속받으며, 이를 통해 기본적인 메서드와 속성을 물려받습니다. 이는 모든 객체가 공통된 인터페이스를 가지도록 보장합니다. 예를 들어,__init__
,__repr__
,__str__
,__eq__
,__hash__
같은 메서드를 기본적으로 제공합니다. - 통일성 제공: 모든 클래스가
object
를 상속받기 때문에 Python에서 모든 객체는 동일한 방식으로 취급될 수 있습니다. 이는 상속 체계에서 일관성을 유지할 수 있도록 해 줍니다. - 다형성(Polymorphism):
object
클래스는 다형성을 지원합니다. 즉, 서로 다른 클래스가 동일한 인터페이스를 사용할 수 있습니다. 이는 클래스 간의 유연한 상호작용을 가능하게 합니다.
객체지향 프로그래밍(OOP)의 4대 핵심 원칙
- 캡슐화(Encapsulation): 데이터를 보호하고, 외부에서 접근하지 못하도록 감추며, 클래스의 메서드를 통해서만 접근이 가능하게 하는 원칙입니다. 이를 통해 데이터 무결성을 유지합니다.
- 상속(Inheritance): 새로운 클래스가 기존 클래스의 특성과 동작을 상속받아 재사용할 수 있는 원칙입니다. 상속을 통해 기존 기능을 확장하거나 재정의할 수 있습니다.
- 다형성(Polymorphism): 여러 클래스가 동일한 인터페이스를 가질 수 있도록 하여, 다른 클래스에서도 동일한 방식으로 메서드를 호출할 수 있게 하는 원칙입니다.
- 추상화(Abstraction): 불필요한 세부 사항을 숨기고, 중요한 부분만 노출하는 원칙입니다. 클래스나 객체를 사용할 때 복잡한 내부 구조를 몰라도 사용자가 필요한 인터페이스만 제공하게 합니다.
예제 코드: Python에서 객체지향 패러다임과 object
클래스의 역할
1. 상속과 다형성 예제
다음 예제는 Python의 최상위 object
클래스를 상속받는 여러 클래스가 다형성(polymorphism)을 어떻게 사용하는지 보여줍니다.
class Animal(object):
def __init__(self, name):
self.name = name
def speak(self):
"""동물의 소리를 출력하는 메서드, 서브 클래스에서 구현"""
raise NotImplementedError("Subclass must implement abstract method")
class Dog(Animal):
def speak(self):
return f"{self.name} says Woof!"
class Cat(Animal):
def speak(self):
return f"{self.name} says Meow!"
class Cow(Animal):
def speak(self):
return f"{self.name} says Moo!"
# 다형성을 활용한 코드
animals = [Dog("Buddy"), Cat("Whiskers"), Cow("Molly")]
# 다형성을 이용해 각 객체의 speak 메서드를 호출
for animal in animals:
print(animal.speak())
출력:
Buddy says Woof!
Whiskers says Meow!
Molly says Moo!
설명:
- 상속(Inheritance):
Dog
,Cat
,Cow
클래스는Animal
클래스를 상속받아 기본 구조를 재사용하고, 각자의speak()
메서드를 재정의합니다. - 다형성(Polymorphism): 각기 다른 서브클래스의 객체들이 동일한
speak()
메서드를 제공하며, 이를 호출할 때 서로 다른 동작을 합니다.
2. 캡슐화와 추상화 예제
다음 예제는 캡슐화(Encapsulation)를 이용해 데이터를 보호하는 방법을 보여줍니다.
class BankAccount(object):
def __init__(self, owner, balance=0):
self.owner = owner
self.__balance = balance # __로 시작하는 속성은 비공개(private)
def deposit(self, amount):
"""돈을 입금하는 메서드"""
if amount > 0:
self.__balance += amount
else:
raise ValueError("Amount must be positive")
def withdraw(self, amount):
"""돈을 출금하는 메서드"""
if 0 < amount <= self.__balance:
self.__balance -= amount
else:
raise ValueError("Insufficient balance or invalid amount")
def get_balance(self):
"""잔액을 반환하는 메서드"""
return self.__balance
# 계좌 생성 및 사용
account = BankAccount("John Doe", 1000)
# 돈을 입금
account.deposit(500)
print(account.get_balance()) # 출력: 1500
# 돈을 출금
account.withdraw(200)
print(account.get_balance()) # 출력: 1300
# 비공개 변수 접근 시도
# print(account.__balance) # AttributeError 발생: 'BankAccount' object has no attribute '__balance'
설명:
- 캡슐화(Encapsulation):
__balance
는 클래스 내부에서만 접근 가능한 비공개(private) 속성입니다. 외부에서는deposit()
,withdraw()
,get_balance()
메서드를 통해서만 접근할 수 있습니다. - 추상화(Abstraction): 복잡한 잔액 관리 로직은 내부에 감추고, 사용자는
deposit
과withdraw
메서드만을 사용하여 쉽게 계좌를 관리할 수 있습니다.
결론:
- Python의
object
클래스는 모든 클래스가 상속하는 기본 클래스이며, 객체 지향 프로그래밍의 핵심 원칙을 따르기 위한 기초적인 역할을 수행합니다. - 객체지향 프로그래밍(OOP)은 캡슐화, 상속, 다형성, 추상화의 원칙을 따르며, 이를 통해 소프트웨어의 재사용성과 유지보수성을 높입니다.
- Python에서
object
클래스는 이러한 원칙을 구현하는 기본 틀을 제공하고, 모든 클래스는 이 최상위 클래스를 통해 객체 지향 패러다임을 실현합니다.
'실용적인 자료구조' 카테고리의 다른 글
[실용적인 자료구조] 메타클래스 설명 및 예제코드 (2) | 2024.10.24 |
---|---|
[실용적인 자료구조] 리스트 상속 데이터 직렬화 클래스 (SerializableList) (2) | 2024.10.22 |
[실용적인 자료구조] 게임 Way Point 저장을 위한 자료구조 (11) | 2024.10.19 |
[실용적인 자료구조] 리스트 상속 원형 큐(Circular Queue) 자료구조 (2) | 2024.10.18 |
[실용적인 자료구조] 타임 트랙(Time Track) 자료구조 (0) | 2024.10.18 |