개요
이번 강좌에서는 파이썬의 객체 지향 프로그래밍(OOP) 개념을 자세히 살펴보겠습니다. 객체 지향 프로그래밍은 코드를 클래스와 객체 단위로 구성하여 재사용성과 유지보수성을 높이는 중요한 프로그래밍 패러다임입니다. 여기서는 클래스와 객체의 기본 개념, 생성자와 소멸자를 통한 객체 초기화 및 정리, 그리고 인스턴스 변수와 클래스 변수의 차이점을 이해할 수 있습니다. 또한, 상속과 다형성을 통해 코드의 확장성을 높이는 방법과 super() 키워드를 활용하는 방법에 대해 예제와 함께 설명합니다.
클래스와 객체
클래스는 객체를 생성하기 위한 설계도이며, 객체는 클래스에 정의된 속성과 동작(메서드)을 가지는 실체입니다.
예를 들어, "사람" 클래스를 정의하고, 이를 바탕으로 여러 사람 객체를 생성할 수 있습니다.
예제 코드:
# 사람 클래스를 정의합니다.
class Person:
# 생성자와 소멸자를 포함한 클래스 정의
def __init__(self, name, age):
# 인스턴스 변수: 각각의 객체마다 고유한 값
self.name = name
self.age = age
def introduce(self):
# 객체의 정보를 출력하는 메서드
print(f"안녕하세요, 제 이름은 {self.name}이고, 나이는 {self.age}세입니다.")
def __del__(self):
# 소멸자: 객체가 소멸될 때 호출됩니다.
print(f"{self.name} 객체가 소멸되었습니다.")
# Person 클래스를 이용해 객체 생성
person1 = Person("홍길동", 25)
person1.introduce()
실행 결과 (예시):
안녕하세요, 제 이름은 홍길동이고, 나이는 25세입니다.
홍길동 객체가 소멸되었습니다. # (프로그램 종료 시 또는 명시적으로 del 호출 시 출력)
생성자 (__init__())와 소멸자
생성자 메서드인 __init__()는 객체가 생성될 때 자동으로 호출되어 초기화를 담당합니다.
소멸자 메서드인 __del__()는 객체가 메모리에서 해제될 때 호출되어 정리 작업을 수행합니다.
생성자에서 인스턴스 변수들을 초기화하면, 각 객체마다 고유의 데이터를 저장할 수 있습니다.
예제 코드:
class Car:
def __init__(self, brand, model):
self.brand = brand # 인스턴스 변수
self.model = model
def display_info(self):
print(f"이 차는 {self.brand}의 {self.model} 모델입니다.")
def __del__(self):
print(f"{self.brand} {self.model} 객체가 소멸되었습니다.")
# Car 객체 생성 및 사용
car1 = Car("현대", "쏘나타")
car1.display_info()
실행 결과 (예시):
이 차는 현대의 쏘나타 모델입니다.
현대 쏘나타 객체가 소멸되었습니다.
인스턴스 변수와 클래스 변수
인스턴스 변수는 객체마다 고유한 데이터를 저장하는 변수이며, 클래스 변수는 클래스 전체에서 공유되는 변수를 의미합니다.
클래스 변수는 보통 모든 객체에 공통된 값을 저장할 때 사용됩니다.
예제 코드:
class Student:
# 클래스 변수: 모든 Student 객체가 공유
school_name = "ABC 고등학교"
def __init__(self, name):
# 인스턴스 변수: 객체마다 다른 값
self.name = name
def display_info(self):
print(f"학생 이름: {self.name}, 학교: {Student.school_name}")
# 객체 생성 및 출력
student1 = Student("김철수")
student2 = Student("이영희")
student1.display_info() # 출력: 학생 이름: 김철수, 학교: ABC 고등학교
student2.display_info() # 출력: 학생 이름: 이영희, 학교: ABC 고등학교
# 클래스 변수 수정 (전체 객체에 반영됨)
Student.school_name = "XYZ 고등학교"
student1.display_info() # 출력: 학생 이름: 김철수, 학교: XYZ 고등학교
student2.display_info() # 출력: 학생 이름: 이영희, 학교: XYZ 고등학교
실행 결과 (예시):
학생 이름: 김철수, 학교: ABC 고등학교
학생 이름: 이영희, 학교: ABC 고등학교
학생 이름: 김철수, 학교: XYZ 고등학교
학생 이름: 이영희, 학교: XYZ 고등학교
상속과 다형성
상속은 기존 클래스(부모 클래스)의 특성을 물려받아 새로운 클래스(자식 클래스)를 만드는 것을 의미합니다.
다형성은 동일한 메서드 호출이 클래스에 따라 서로 다른 방식으로 동작하는 특성을 말합니다.
상속을 통해 중복 코드를 줄이고, 다양한 클래스 간의 공통 기능을 재사용할 수 있습니다.
예제 코드:
# 부모 클래스 Animal 정의
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print("동물이 소리를 냅니다.")
# 자식 클래스 Dog, Cat이 Animal 클래스를 상속받음
class Dog(Animal):
def speak(self):
print(f"{self.name}가 멍멍하고 짖습니다.")
class Cat(Animal):
def speak(self):
print(f"{self.name}가 야옹하고 웁니다.")
# 객체 생성 및 다형성 테스트
dog = Dog("바둑이")
cat = Cat("나비")
dog.speak() # 출력: 바둑이가 멍멍하고 짖습니다.
cat.speak() # 출력: 나비가 야옹하고 웁니다.
실행 결과 (예시):
바둑이가 멍멍하고 짖습니다.
나비가 야옹하고 웁니다.
super() 키워드 활용
super() 키워드는 부모 클래스의 메서드를 호출할 때 사용합니다.
이를 통해 자식 클래스에서 부모 클래스의 초기화 메서드나 메서드를 확장하거나 재정의할 때 중복 코드를 줄일 수 있습니다.
예제 코드:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def display_info(self):
print(f"이름: {self.name}, 나이: {self.age}")
# Person 클래스를 상속받는 Student 클래스
class Student(Person):
def __init__(self, name, age, student_id):
# 부모 클래스의 __init__() 호출
super().__init__(name, age)
self.student_id = student_id
def display_info(self):
# 부모 클래스의 display_info()를 호출 후, 추가 정보를 출력
super().display_info()
print(f"학번: {self.student_id}")
# 객체 생성 및 사용
student = Student("박지성", 20, "S12345")
student.display_info()
실행 결과 (예시):
이름: 박지성, 나이: 20
학번: S12345
정리
- 클래스와 객체: 클래스는 객체의 설계도이며, 객체는 클래스를 기반으로 생성된 실체입니다.
- 생성자와 소멸자: __init__()는 객체 생성 시 초기화, __del__()은 객체 소멸 시 정리 작업을 수행합니다.
- 인스턴스 변수와 클래스 변수: 인스턴스 변수는 각 객체마다 고유하며, 클래스 변수는 모든 객체가 공유합니다.
- 상속과 다형성: 상속은 부모 클래스의 특성을 물려받고, 다형성은 동일한 메서드 호출이 클래스에 따라 다르게 동작합니다.
- super() 키워드: 부모 클래스의 메서드를 호출하여 코드 중복을 줄이고 기능을 확장할 수 있습니다.
'개발 > Python' 카테고리의 다른 글
[Python 파이썬] 13. 고급 문법: 리스트, 람다 (0) | 2025.02.16 |
---|---|
[Python 파이썬] 11. 예외 처리 (0) | 2025.02.14 |
[Python 파이썬] 10. 파일 입출력 (0) | 2025.02.13 |
[Python 파이썬] 9. 모듈과 패키지 (0) | 2025.02.12 |
[Python 파이썬] 8. 함수의 이해와 활용 (0) | 2025.02.11 |