파이썬 강의 10편: 클래스와 객체
· 5분 읽기
파이썬 강의 10편: 클래스와 객체
클래스와 객체란?
클래스(Class)는 객체를 만들기 위한 설계도이고, 객체(Object)는 클래스로부터 생성된 인스턴스입니다. 객체지향 프로그래밍의 핵심 개념입니다.
클래스 정의
기본 형식
class 클래스명:
def __init__(self):
# 초기화 메서드
pass
def 메서드명(self):
# 메서드 정의
pass
간단한 예시
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f"안녕하세요, 저는 {self.name}이고 {self.age}세입니다.")
# 객체 생성
person1 = Person("홍길동", 25)
person1.introduce() # 안녕하세요, 저는 홍길동이고 25세입니다.
생성자 (init)
객체가 생성될 때 자동으로 호출되는 메서드입니다:
class Student:
def __init__(self, name, age, grade):
self.name = name
self.age = age
self.grade = grade
print(f"{name} 학생이 생성되었습니다.")
student = Student("홍길동", 20, "A")
인스턴스 변수와 메서드
class Dog:
def __init__(self, name, breed):
self.name = name # 인스턴스 변수
self.breed = breed # 인스턴스 변수
def bark(self): # 인스턴스 메서드
print(f"{self.name}가 멍멍 짖습니다!")
def get_info(self): # 인스턴스 메서드
return f"{self.name}는 {self.breed}입니다."
dog1 = Dog("뽀삐", "골든리트리버")
dog1.bark() # 뽀삐가 멍멍 짖습니다!
print(dog1.get_info()) # 뽀삐는 골든리트리버입니다.
클래스 변수
모든 인스턴스가 공유하는 변수입니다:
class Student:
school = "서울대학교" # 클래스 변수
def __init__(self, name):
self.name = name # 인스턴스 변수
student1 = Student("홍길동")
student2 = Student("김철수")
print(student1.school) # 서울대학교
print(student2.school) # 서울대학교
# 클래스 변수 변경
Student.school = "연세대학교"
print(student1.school) # 연세대학교
실전 예제: 은행 계좌 클래스
class BankAccount:
def __init__(self, owner, balance=0):
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 amount > 0:
if amount <= self.balance:
self.balance -= amount
print(f"{amount}원 출금되었습니다. 잔액: {self.balance}원")
else:
print("잔액이 부족합니다.")
else:
print("출금 금액은 0보다 커야 합니다.")
def get_balance(self):
"""잔액 조회"""
return self.balance
# 사용
account = BankAccount("홍길동", 10000)
account.deposit(5000)
account.withdraw(3000)
print(f"현재 잔액: {account.get_balance()}원")
실전 예제: 학생 관리 클래스
class Student:
def __init__(self, name, student_id):
self.name = name
self.student_id = student_id
self.scores = []
def add_score(self, score):
"""점수 추가"""
if 0 <= score <= 100:
self.scores.append(score)
else:
print("점수는 0-100 사이여야 합니다.")
def get_average(self):
"""평균 점수 계산"""
if len(self.scores) == 0:
return 0
return sum(self.scores) / len(self.scores)
def get_grade(self):
"""등급 반환"""
average = self.get_average()
if average >= 90:
return "A"
elif average >= 80:
return "B"
elif average >= 70:
return "C"
elif average >= 60:
return "D"
else:
return "F"
def __str__(self):
"""문자열 표현"""
return f"{self.name} (학번: {self.student_id}, 평균: {self.get_average():.2f}, 등급: {self.get_grade()})"
# 사용
student = Student("홍길동", "2024001")
student.add_score(85)
student.add_score(90)
student.add_score(78)
print(student)
상속 (Inheritance)
기존 클래스를 확장하여 새로운 클래스를 만들 수 있습니다:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass
class Dog(Animal):
def speak(self):
return f"{self.name}가 멍멍 짖습니다!"
class Cat(Animal):
def speak(self):
return f"{self.name}가 야옹 웁니다!"
dog = Dog("뽀삐")
cat = Cat("나비")
print(dog.speak()) # 뽀삐가 멍멍 짖습니다!
print(cat.speak()) # 나비가 야옹 웁니다!
특수 메서드 (Magic Methods)
str: 문자열 표현
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person(name={self.name}, age={self.age})"
person = Person("홍길동", 25)
print(person) # Person(name=홍길동, age=25)
len: 길이 반환
class ShoppingCart:
def __init__(self):
self.items = []
def add_item(self, item):
self.items.append(item)
def __len__(self):
return len(self.items)
cart = ShoppingCart()
cart.add_item("사과")
cart.add_item("바나나")
print(len(cart)) # 2
캡슐화 (Encapsulation)
파이썬은 접근 제어자가 없지만, 관례적으로 사용합니다:
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self._balance = balance # 보호된 변수 (관례)
self.__account_number = 12345 # 비공개 변수 (이름 변경됨)
def get_balance(self):
return self._balance
def set_balance(self, amount):
if amount >= 0:
self._balance = amount
account = BankAccount("홍길동", 1000)
print(account.get_balance()) # 1000
실전 예제: 도서 관리 시스템
class Book:
def __init__(self, title, author, isbn):
self.title = title
self.author = author
self.isbn = isbn
self.is_borrowed = False
def borrow(self):
if not self.is_borrowed:
self.is_borrowed = True
return True
return False
def return_book(self):
if self.is_borrowed:
self.is_borrowed = False
return True
return False
def __str__(self):
status = "대출 중" if self.is_borrowed else "대출 가능"
return f"{self.title} - {self.author} ({status})"
class Library:
def __init__(self):
self.books = []
def add_book(self, book):
self.books.append(book)
def find_book(self, title):
for book in self.books:
if book.title == title:
return book
return None
def list_available_books(self):
return [book for book in self.books if not book.is_borrowed]
# 사용
library = Library()
library.add_book(Book("파이썬 프로그래밍", "홍길동", "123-456"))
library.add_book(Book("자료구조", "김철수", "789-012"))
book = library.find_book("파이썬 프로그래밍")
if book:
book.borrow()
print(book)
available = library.list_available_books()
print(f"대출 가능한 책: {len(available)}권")
다음 단계
이제 파이썬의 기본 개념들을 모두 배웠습니다! 다음에는:
- 모듈과 패키지
- 예외 처리
- 데코레이터
- 제너레이터
- 프로젝트 실습
등을 통해 실력을 더 향상시킬 수 있습니다.
마무리
파이썬 공부를 이렇게 정리해봤어요! 이제 기본기를 바탕으로 다양한 프로젝트를 만들어보려고 해요. 파이썬의 풍부한 라이브러리를 활용하면 웹 개발, 데이터 분석, 인공지능 등 다양한 분야에서 활용할 수 있을 것 같아요.