[Python]클래스와 객체 – 객체지향 프로그래밍(OOP)

이번 글에서는 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_carCar 클래스의 인스턴스입니다. 이 객체는 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()

위 코드에서 student1student2 객체를 생성하고, 자기소개와 공부를 시작하는 동작을 수행합니다.

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의 유연성과 강력한 기능을 통해 더 효율적이고 가독성 높은 코드를 작성할 수 있을 것입니다.

이 게시물이 얼마나 유용했습니까?

평가하려면 별표를 클릭하세요.

평균 평점 5 / 5. 투표 수: 42

지금까지 투표 한 사람이 없습니다. 가장 먼저 게시물을 평가해 보세요.

Leave a Comment

error: 우클릭 할 수 없습니다.