9. 클래스
클래스는 객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념으로, 파이썬에서 코드 재사용성과 구조화를 도와주는 중요한 도구입니다. 클래스를 사용하면 데이터와 관련된 기능을 한 곳에 모아 관리할 수 있습니다. 이번 챕터에서는 클래스의 개념과 기본 사용법에 대해 알아보겠습니다.
9.1 클래스와 객체란 무엇인가?
클래스(Class)는 일종의 설계도(틀)입니다. 이 설계도를 바탕으로 생성된 개별 항목을 객체(Object) 라고 합니다. 예를 들어, 빵을 만들때 다양한 모양의 빵을 만들기 위해서 빵틀을 사용합니다. 이 빵틀이 Class 이고 빵틀로 구운 빵을 객체 (Object) 혹은 인스턴스 (Instance) 라고 합니다.
위의 사진에서 붕어빵이 객체 라면 붕어빵 틀이 클래스 입니다.
9.2 클래스 정의하기
클래스를 정의할 때는 class
키워드를 사용합니다. 클래스 이름은 관례적으로 대문자로 시작합니다.
# 간단한 클래스 정의
class Dog:
# 클래스의 생성자 함수
def __init__(self, name, age):
self.name = name # 속성 정의
self.age = age
# 함수 정의
def bark(self):
print(f"{self.name}가 멍멍 짖습니다.")
# 객체 생성
dog1 = Dog("바둑이", 3)
dog2 = Dog("초코", 5)
# 함수 호출
dog1.bark() # 바둑이가 멍멍 짖습니다.
dog2.bark() # 초코가 멍멍 짖습니다.
9.2.1 __init__
함수
__init__
함수는 클래스의 생성자로, 객체가 생성될 때 자동으로 호출됩니다. 이를 통해 객체의 초기 속성을 설정할 수 있습니다. self
는 생성된 객체 자신을 참조하는 변수로, 클래스 내의 함수에서 반드시 첫 번째 매개변수로 선언해야 합니다.
9.3 클래스의 속성과 함수
-
속성 (Attribute): 속성은 객체의 상태나 데이터를 저장하는 변수입니다. 클래스의 생성자(
__init__
)에서 정의하며,self.속성명
형태로 선언합니다. -
함수 (Method): 함수는 객체가 수행할 수 있는 동작을 정의하는 함수입니다. 클래스 내에서 정의되며, 첫 번째 매개변수로
self
를 사용하여 해당 객체의 속성에 접근하거나 다른 함수를 호출할 수 있습니다.
class Car:
def __init__(self, brand, color):
self.brand = brand
self.color = color
def drive(self):
print(f"{self.color} 색상의 {self.brand} 자동차가 주행 중입니다.")
car1 = Car("현대", "파랑")
car1.drive() # 파랑 색상의 현대 자동차가 주행 중입니다.
9.4 클래스 사용의 장점
클래스를 사용하면 관련 데이터와 함수를 하나의 논리적인 단위로 묶을 수 있기 때문에, 코드의 재사용성과 유지보수성을 크게 향상시킬 수 있습니다. 예를 들어, 여러 개의 자동차 객체를 만들어 각각의 상태를 관리하고, 동일한 기능을 반복해서 사용할 수 있습니다.
9.5 상속 (Inheritance)
상속은 기존 클래스의 기능을 물려받아 새로운 클래스를 생성하는 방법입니다. 이를 통해 코드의 중복을 줄이고, 기존 클래스의 기능을 확장할 수 있습니다. 부모 클래스(기본 클래스)로부터 상속받은 자식 클래스(파생 클래스)는 부모 클래스의 모든 속성과 함수를 물려받으며, 필요에 따라 새로운 속성이나 함수를 추가하거나 기존 함수를 재정의할 수 있습니다.
# 부모 클래스
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print(f"{self.name}가 소리를 냅니다.")
# 자식 클래스
class Cat(Animal):
def speak(self):
print(f"{self.name}가 야옹 소리를 냅니다.")
cat = Cat("나비")
cat.speak() # 나비가 야옹 소리를 냅니다.
위 예제에서 Cat
클래스는 Animal
클래스를 상속받아 speak
함수를 재정의(오버라이딩)하였습니다. 이를 통해 고양이만의 특성을 반영할 수 있게 되었습니다.
9.6 클래스 변수와 인스턴스 변수
클래스 변수(class variable)는 클래스 전체에서 공유되는 변수이며, 인스턴스 변수(instance variable)는 각 객체마다 독립적으로 유지됩니다. 예시:
class Circle:
pi = 3.14 # 클래스 변수
def __init__(self, radius):
self.radius = radius # 인스턴스 변수
def area(self):
return Circle.pi * (self.radius ** 2)
위 예시에서 pi
는 클래스 변수이고, radius
는 인스턴스 변수입니다.
9.7 클래스 예제: 학생 관리 시스템
클래스를 사용하여 간단한 학생 관리 시스템을 만들어 봅시다.
class Student:
def __init__(self, name, age, student_id):
self.name = name
self.age = age
self.student_id = student_id
def introduce(self):
print(f"이름: {self.name}, 나이: {self.age}, 학번: {self.student_id}")
# 학생 객체 생성
student1 = Student("철수", 15, "A101")
student2 = Student("영희", 16, "A102")
# 학생 정보 출력
student1.introduce() # 이름: 철수, 나이: 15, 학번: A101
student2.introduce() # 이름: 영희, 나이: 16, 학번: A102
위 예제에서 Student
클래스는 학생의 이름, 나이, 학번을 속성으로 가지며, 학생의 정보를 출력하는 introduce
함수를 제공합니다. 이처럼 클래스를 사용하면 학생 정보를 체계적으로 관리할 수 있습니다.
9.8 클래스 예제: 도서관 책 관리 시스템
이번에는 도서관에서 책을 관리하는 간단한 시스템을 만들어 보겠습니다.
class Book:
def __init__(self, title, author, isbn):
self.title = title
self.author = author
self.isbn = isbn
self.is_available = True # 책의 대출 가능 여부
def borrow(self):
if self.is_available:
self.is_available = False
print(f"{self.title}이(가) 대출되었습니다.")
else:
print(f"{self.title}은(는) 현재 대출 중입니다.")
def return_book(self):
if not self.is_available:
self.is_available = True
print(f"{self.title}이(가) 반납되었습니다.")
else:
print(f"{self.title}은(는) 이미 도서관에 있습니다.")
# 책 객체 생성
book1 = Book("파이썬 완벽 가이드", "홍길동", "1234567890")
book2 = Book("데이터 사이언스 입문", "이영희", "0987654321")
# 책 대출 및 반납
book1.borrow() # 파이썬 완벽 가이드이(가) 대출되었습니다.
book1.borrow() # 파이썬 완벽 가이드은(는) 현재 대출 중입니다.
book1.return_book() # 파이썬 완벽 가이드이(가) 반납되었습니다.
book1.return_book() # 파이썬 완벽 가이드은(는) 이미 도서관에 있습니다.
위 예제에서 Book
클래스는 책의 제목, 저자, ISBN, 대출 가능 여부를 속성으로 가지며, 책을 대출하거나 반납하는 borrow
와 return_book
함수를 제공합니다. 이를 통해 도서관의 책을 효율적으로 관리할 수 있습니다.
9.9 요약
- 클래스는 객체를 생성하기 위한 설계도입니다.
- 객체는 클래스에서 생성된 인스턴스를 의미합니다.
__init__
함수를 사용하여 객체를 초기화하고 속성을 정의할 수 있습니다.- 클래스의 속성은 객체의 상태를 저장하며, 함수는 객체가 수행할 수 있는 동작을 정의합니다.
- 상속을 사용하면 기존 클래스의 기능을 재사용하고 확장할 수 있습니다.
이번 장에서는 파이썬의 클래스 개념과 사용법에 대해 알아보았습니다. 클래스를 사용하여 코드를 구조화하고 재사용성을 높이는 방법을 익혔길 바랍니다. 다음 장에서는 패키지에 대해 학습해 보겠습니다.