7장: 객체 지향 프로그래밍

파이썬은 객체 지향 프로그래밍(OOP)을 지원하는 언어입니다. 객체 지향 프로그래밍은 데이터를 객체로 모델링하고, 객체 간의 상호작용을 통해 프로그램을 설계하는 방식입니다. 이 장에서는 객체 지향 프로그래밍의 기본 개념과 파이썬에서 클래스를 정의하고 사용하는 방법에 대해 알아보겠습니다.


#### 7.1 클래스와 객체


클래스는 객체를 생성하기 위한 템플릿(청사진)입니다. 객체는 클래스의 인스턴스(instance)로, 클래스에서 정의한 속성과 메서드를 가집니다.


```python

# 클래스 정의

class Dog:

    # 생성자 메서드

    def __init__(self, name, age):

        self.name = name

        self.age = age

    

    # 메서드 정의

    def bark(self):

        print(f"{self.name}가 짖습니다.")


# 객체 생성

my_dog = Dog("Buddy", 3)


# 객체의 메서드 호출

my_dog.bark()  # 출력: Buddy가 짖습니다.

```


#### 7.2 생성자와 소멸자


생성자(Constructor)는 객체가 생성될 때 자동으로 호출되는 메서드로, `__init__` 메서드를 사용하여 정의합니다. 소멸자(Destructor)는 객체가 소멸될 때 호출되는 메서드로, `__del__` 메서드를 사용하여 정의합니다.


```python

# 생성자와 소멸자 예제

class Cat:

    def __init__(self, name):

        self.name = name

        print(f"{self.name}가 태어났습니다.")

    

    def __del__(self):

        print(f"{self.name}가 죽었습니다.")


# 객체 생성

my_cat = Cat("Whiskers")


# 객체 소멸

del my_cat

```


#### 7.3 상속


상속(Inheritance)은 기존 클래스를 기반으로 새로운 클래스를 정의하는 방법입니다. 상속을 통해 코드의 재사용성을 높이고, 클래스 간의 관계를 모델링할 수 있습니다.


```python

# 상속 예제

class Animal:

    def __init__(self, name):

        self.name = name

    

    def make_sound(self):

        print("소리를 냅니다.")


class Dog(Animal):

    def make_sound(self):

        print(f"{self.name}가 멍멍 짖습니다.")


class Cat(Animal):

    def make_sound(self):

        print(f"{self.name}가 야옹 웁니다.")


# 객체 생성 및 메서드 호출

dog = Dog("Buddy")

cat = Cat("Whiskers")


dog.make_sound()  # 출력: Buddy가 멍멍 짖습니다.

cat.make_sound()  # 출력: Whiskers가 야옹 웁니다.

```


#### 7.4 메서드 오버라이딩


메서드 오버라이딩(Method Overriding)은 상위 클래스에서 정의된 메서드를 하위 클래스에서 재정의하는 것입니다. 이를 통해 하위 클래스에서 상위 클래스의 동작을 변경할 수 있습니다.


```python

# 메서드 오버라이딩 예제

class Bird(Animal):

    def make_sound(self):

        print(f"{self.name}가 짹짹 웁니다.")


bird = Bird("Tweety")

bird.make_sound()  # 출력: Tweety가 짹짹 웁니다.

```


#### 7.5 다중 상속


파이썬은 다중 상속(Multiple Inheritance)을 지원하며, 여러 개의 클래스를 상속받을 수 있습니다. 다중 상속을 사용할 때는 클래스의 상속 순서를 주의해야 합니다.


```python

# 다중 상속 예제

class Swimmable:

    def swim(self):

        print("수영을 합니다.")


class Flyable:

    def fly(self):

        print("날아다닙니다.")


class Duck(Animal, Swimmable, Flyable):

    def make_sound(self):

        print(f"{self.name}가 꽥꽥 웁니다.")


duck = Duck("Donald")

duck.make_sound()  # 출력: Donald가 꽥꽥 웁니다.

duck.swim()        # 출력: 수영을 합니다.

duck.fly()         # 출력: 날아다닙니다.

```


#### 7.6 캡슐화


캡슐화(Encapsulation)는 객체의 속성과 메서드를 외부로부터 숨기고, 객체 내부의 데이터에 접근할 수 있는 방법을 제공하는 것입니다. 파이썬에서는 변수 이름 앞에 밑줄(_)을 붙여서 비공개 속성을 나타낼 수 있습니다.


```python

# 캡슐화 예제

class Person:

    def __init__(self, name, age):

        self.__name = name  # 비공개 속성

        self.__age = age    # 비공개 속성

    

    def get_name(self):

        return self.__name

    

    def get_age(self):

        return self.__age


person = Person("Alice", 30)

print(person.get_name())  # 출력: Alice

print(person.get_age())   # 출력: 30

```


#### 7.7 다형성


다형성(Polymorphism)은 동일한 인터페이스를 사용하여 서로 다른 데이터 타입을 처리할 수 있는 기능을 의미합니다. 파이썬에서는 메서드 오버라이딩과 같은 기능을 통해 다형성을 구현할 수 있습니다.


```python

# 다형성 예제

class Shape:

    def draw(self):

        raise NotImplementedError("서브클래스에서 구현해야 합니다.")


class Circle(Shape):

    def draw(self):

        print("원을 그립니다.")


class Rectangle(Shape):

    def draw(self):

        print("사각형을 그립니다.")


shapes = [Circle(), Rectangle()]

for shape in shapes:

    shape.draw()

    # 출력: 원을 그립니다.

    # 출력: 사각형을 그립니다.

```


이상으로, 파이썬에서 객체 지향 프로그래밍을 사용하는 방법에 대해 알아보았습니다. 다음 장에서는 모듈과 패키지에 대해 더 자세히 알아보겠습니다. 질문이나 요청사항이 있으시면 댓글로 남겨주세요!


---


이 글의 내용은 GoalKicker.com의 Python Notes for Professionals 책을 참조하였습니다.

댓글