이번 글에서는 Python 클래스와 객체를 사용하는 방법에 대해 자세히 알아보겠습니다. 객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 객체들의 집합으로 보고, 이 객체들이 상호작용하여 프로그램이 동작하는 방식을 채택합니다. Python은 객체지향 프로그래밍을 지원하는 강력한 기능을 제공하며, 클래스를 사용하여 객체를 정의할 수 있습니다.
1. 클래스와 객체의 개념
1.1. 클래스(Class)
객체를 생성하기 위한 청사진(템플릿)입니다. 클래스는 객체의 속성과 동작을 정의합니다.
1.2 객체(Object)
클래스에서 생성된 인스턴스(instance)로, 클래스에서 정의한 속성과 동작을 가집니다.
예를 들어, ‘자동차’라는 클래스를 정의하고, 이 클래스를 통해 특정 자동차 객체를 생성할 수 있습니다. 각 자동차 객체는 고유한 속성(예: 색상, 모델명)을 가지며, 클래스에서 정의한 동작(예: 주행, 정지)을 수행할 수 있습니다.
2. 클래스 정의하기
Python에서 클래스를 정의하려면 class
키워드를 사용합니다.
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def start(self):
print(f"{self.year} {self.make} {self.model}가 시동을 겁니다.")
def stop(self):
print(f"{self.year} {self.make} {self.model}가 멈춥니다.")
위 코드에서 Car
클래스는 자동차의 제조사, 모델명, 연도를 속성으로 가지며, 시동을 걸고 멈추는 동작을 메서드로 정의하고 있습니다. __init__
메서드는 객체가 생성될 때 호출되는 생성자(constructor)로, 객체의 초기 속성을 설정합니다.
3. 객체 생성하기
클래스에서 객체를 생성하려면 클래스 이름을 함수처럼 호출하면 됩니다.
my_car = Car("Toyota", "Corolla", 2020)
위 코드에서 my_car
는 Car
클래스의 인스턴스입니다. 이 객체는 make
, model
, year
속성을 가지며, start()
와 stop()
메서드를 사용할 수 있습니다.
4. 속성과 메서드 사용하기
생성한 객체의 속성과 메서드를 사용하는 방법은 다음과 같습니다.
print(f"제조사: {my_car.make}")
print(f"모델명: {my_car.model}")
print(f"연도: {my_car.year}")
my_car.start()
my_car.stop()
위 코드에서 객체 my_car
의 속성을 출력하고, 메서드를 호출하여 시동을 걸고 멈추는 동작을 수행합니다.
5. 예제: 학생 클래스
학생 정보를 관리하는 Student
클래스를 만들어 보겠습니다.
class Student:
def __init__(self, name, age, grade):
self.name = name
self.age = age
self.grade = grade
def study(self):
print(f"{self.name} 학생이 공부를 시작합니다.")
def introduce(self):
print(f"안녕하세요, 저는 {self.age}살이고, {self.grade}학년인 {self.name}입니다.")
Student
클래스는 이름, 나이, 학년을 속성으로 가지며, 공부를 시작하는 메서드와 자기소개를 하는 메서드를 정의하고 있습니다.
student1 = Student("홍길동", 16, 10)
student2 = Student("김철수", 17, 11)
student1.introduce()
student1.study()
student2.introduce()
student2.study()
위 코드에서 student1
과 student2
객체를 생성하고, 자기소개와 공부를 시작하는 동작을 수행합니다.
6. 상속
클래스는 상속(inheritance)을 통해 기존 클래스의 속성과 메서드를 물려받을 수 있습니다. 이를 통해 코드의 재사용성을 높이고, 계층 구조를 만들 수 있습니다.
class ElectricCar(Car):
def __init__(self, make, model, year, battery_size):
super().__init__(make, model, year)
self.battery_size = battery_size
def charge(self):
print(f"{self.year} {self.make} {self.model}가 충전 중입니다. 배터리 용량: {self.battery_size}kWh")
ElectricCar
클래스는 Car
클래스를 상속받아, 추가로 배터리 용량 속성과 충전 메서드를 정의합니다. super()
함수는 부모 클래스의 메서드를 호출하는 데 사용됩니다.
my_electric_car = ElectricCar("Tesla", "Model S", 2021, 100)
my_electric_car.start()
my_electric_car.charge()
my_electric_car.stop()
위 코드에서 my_electric_car
객체는 ElectricCar
클래스의 인스턴스로, 부모 클래스인 Car
의 속성과 메서드를 물려받아 사용할 수 있습니다.
7. 메서드 오버라이딩
상속받은 클래스에서 부모 클래스의 메서드를 재정의(오버라이딩)할 수 있습니다.
class ElectricCar(Car):
def start(self):
print(f"{self.year} {self.make} {self.model}가 전기 모드로 시동을 겁니다.")
위 코드에서 ElectricCar
클래스는 start()
메서드를 오버라이딩하여 전기 모드로 시동을 거는 동작을 정의합니다.
my_electric_car = ElectricCar("Tesla", "Model S", 2021, 100)
my_electric_car.start()
위 코드에서 my_electric_car
객체는 오버라이딩된 start()
메서드를 호출하여 전기 모드로 시동을 겁니다.
8. 캡슐화
캡슐화(encapsulation)는 객체의 속성을 외부에서 직접 접근하지 못하도록 하고, 메서드를 통해서만 접근할 수 있도록 하는 개념입니다. 이를 통해 객체의 상태를 보호하고, 무결성을 유지할 수 있습니다.
class Account:
def __init__(self, owner, balance):
self.owner = owner
self.__balance = balance
def deposit(self, amount):
if amount > 0:
self.__balance += amount
print(f"{amount}원이 입금되었습니다. 잔액: {self.__balance}원")
else:
print("입금액은 0보다 커야 합니다.")
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
print(f"{amount}원이 출금되었습니다. 잔액: {self.__balance}원")
else:
print("출금액이 유효하지 않습니다.")
def get_balance(self):
return self.__balance
위 코드에서 Account
클래스는 계좌 소유자와 잔액을 속성으로 가지며, 입금과 출금을 메서드로 정의하고 있습니다. __balance
속성은 외부에서 직접 접근할 수 없으며, deposit()
, withdraw()
, get_balance()
메서드를 통해서만 접근할 수 있습니다.
account = Account("홍길동", 1000)
account.deposit(500)
account.withdraw(300)
print(f"현재 잔액: {account.get_balance()}원")
위 코드에서 account
객체는 입금과 출금 메서드를 사용하여 잔액을 관리하고, get_balance()
메서드를 통해 잔액을 조회합니다.
결론
객체지향 프로그래밍은 Python에서 매우 강력하고 유용한 개념입니다. 클래스와 객체를 사용하여 코드의 재사용성을 높이고, 프로그램의 구조를 더 체계적으로 만들 수 있습니다. 상속과 메서드 오버라이딩을 통해 코드의 확장성을 높이고, 캡슐화를 통해 객체의 상태를 보호할 수 있습니다. 이번 글에서 소개한 기본적인 객체지향 프로그래밍 개념을 익히고, 다양한 프로젝트에 적용해보세요. Python의 유연성과 강력한 기능을 통해 더 효율적이고 가독성 높은 코드를 작성할 수 있을 것입니다.