Python Object-Oriented Programming


6. 객체지향 프로그래밍(Object-Oriented Programming)

클래스와 객체 개념 (Classes and Objects)

객체지향 프로그래밍은 클래스와 객체를 사용하여 프로그램을 구조화하는 방식입니다. 클래스는 객체의 설계도이며, 객체는 클래스의 인스턴스입니다.

class Dog:
    # 클래스 속성
    species = "Canis familiaris"

    # 생성자 메서드
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 인스턴스 메서드
    def description(self):
        return f"{self.name}는 {self.age}살입니다."

    def speak(self, sound):
        return f"{self.name}가 {sound} 소리를 냅니다."

# 객체 생성
my_dog = Dog("Buddy", 3)
print(my_dog.description())  # Buddy는 3살입니다.
print(my_dog.speak("멍멍"))  # Buddy가 멍멍 소리를 냅니다.

위 예제에서 Dog 클래스는 nameage라는 인스턴스 속성을 가지고 있으며, descriptionspeak라는 메서드를 정의하고 있습니다. my_dog 객체는 Dog 클래스의 인스턴스입니다.

생성자와 소멸자 (Constructors and Destructors)

생성자는 객체가 생성될 때 호출되는 메서드이고, 소멸자는 객체가 소멸될 때 호출되는 메서드입니다. Python에서는 각각 __init____del__로 정의됩니다.

class Person:
    def __init__(self, name):
        self.name = name
        print(f"{self.name}이(가) 생성되었습니다.")

    def __del__(self):
        print(f"{self.name}이(가) 소멸되었습니다.")

# 객체 생성 및 소멸
p = Person("John")
del p  # 명시적으로 객체 삭제

위 예제에서 __init__ 메서드는 객체가 생성될 때 호출되며, __del__ 메서드는 객체가 소멸될 때 호출됩니다.

상속과 다형성 (Inheritance and Polymorphism)

상속은 기존 클래스를 재사용하여 새로운 클래스를 만드는 방법입니다. 다형성은 동일한 메서드가 다양한 방식으로 동작할 수 있게 하는 것입니다.

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        raise NotImplementedError("서브클래스에서 구현 필요")

class Dog(Animal):
    def speak(self):
        return f"{self.name}가 멍멍 소리를 냅니다."

class Cat(Animal):
    def speak(self):
        return f"{self.name}가 야옹 소리를 냅니다."

# 다형성 예제
animals = [Dog("Buddy"), Cat("Whiskers")]

for animal in animals:
    print(animal.speak())

위 예제에서 Animal 클래스는 speak 메서드를 추상 메서드로 정의하였고, DogCat 클래스는 이를 상속받아 각기 다르게 구현하였습니다. 이로 인해 animals 리스트에 있는 객체들은 동일한 speak 메서드를 호출하지만, 각기 다른 결과를 반환합니다.

추상 클래스와 인터페이스 (Abstract Classes and Interfaces)

추상 클래스는 하나 이상의 추상 메서드를 포함하는 클래스입니다. 추상 메서드는 서브클래스에서 반드시 구현해야 합니다. Python에서는 abc 모듈을 사용하여 추상 클래스를 정의합니다.

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

    @abstractmethod
    def perimeter(self):
        pass

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

    def perimeter(self):
        return 2 * (self.width + self.height)

# 객체 생성 및 사용
rect = Rectangle(3, 4)
print(f"면적: {rect.area()}")  # 면적: 12
print(f"둘레: {rect.perimeter()}")  # 둘레: 14

위 예제에서 Shape는 추상 클래스이고, areaperimeter는 추상 메서드입니다. Rectangle 클래스는 Shape를 상속받아 이 추상 메서드들을 구현하고 있습니다. 추상 클래스는 직접 인스턴스를 생성할 수 없으며, 서브클래스에서 추상 메서드를 모두 구현해야만 인스턴스를 생성할 수 있습니다.

이러한 객체지향 프로그래밍의 개념들을 활용하면 더 구조적이고 재사용 가능한 코드를 작성할 수 있습니다.


Leave a Reply

Your email address will not be published. Required fields are marked *