본문 바로가기
프로그래밍/Python

[Python] 7. Python의 "객체 지향 프로그래밍 (OOP)"

by iwbap 2024. 6. 18.
728x90

Python 학습: 객체 지향 프로그래밍 (OOP)

객체 지향 프로그래밍(OOP)은 프로그램을 객체 단위로 구성하여 재사용성과 유지보수성을 높이는 프로그래밍 패러다임입니다. 이번 글에서는 클래스와 객체, 생성자와 소멸자, 상속, 다형성, 캡슐화에 대해 알아보겠습니다.


1. 클래스와 객체: 클래스 정의, 객체 생성

클래스 정의 : 클래스는 객체의 설계도입니다. Python에서는 class 키워드를 사용하여 클래스를 정의합니다.

객체 생성 : 객체는 클래스로부터 생성된 인스턴스입니다. 클래스의 인스턴스를 생성하려면 클래스 이름을 함수처럼 호출합니다.

 

클래스 정의와 객체 생성 예제

[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)
print(my_dog.name)  # Buddy 출력
print(my_dog.age)   # 3 출력
my_dog.bark()       # Buddy이(가) 짖습니다. 출력
 

위의 예제에서 Dog 클래스는 이름과 나이를 속성으로 가지며, bark 메서드를 정의합니다. my_dog 객체는 Dog 클래스의 인스턴스입니다.


2. 생성자와 소멸자: __init__, __del__

생성자 (__init__) : 생성자는 객체가 생성될 때 자동으로 호출되는 메서드입니다. 객체의 초기화를 담당합니다.

소멸자 (__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  # 명시적으로 객체 소멸
 

위의 예제에서 Cat 클래스는 생성자와 소멸자를 정의합니다. my_cat 객체가 생성될 때 생성자가 호출되고, 객체가 소멸될 때 소멸자가 호출됩니다.


3. 상속: 클래스 상속

상속은 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받는 기능입니다. 이를 통해 코드의 재사용성을 높일 수 있습니다.

 

상속 예제

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

    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        print(f"{self.name}이(가) 짖습니다.")

class Cat(Animal):
    def speak(self):
        print(f"{self.name}이(가) 야옹합니다.")

# 객체 생성
dog = Dog("Buddy")
cat = Cat("Whiskers")

dog.speak()  # Buddy이(가) 짖습니다. 출력
cat.speak()  # Whiskers이(가) 야옹합니다. 출력
 

위의 예제에서 Dog와 Cat 클래스는 Animal 클래스를 상속받습니다. 각 클래스는 speak 메서드를 재정의합니다.


4. 다형성: 메서드 오버라이딩

다형성은 동일한 인터페이스를 통해 서로 다른 데이터 타입의 객체를 다룰 수 있는 기능입니다. 메서드 오버라이딩은 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것입니다.

 

메서드 오버라이딩 예제

[python]
 
class Shape:
    def area(self):
        return 0

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

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

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

# 객체 생성
rect = Rectangle(3, 4)
circ = Circle(5)

print(f"사각형의 면적: {rect.area()}")  # 사각형의 면적: 12 출력
print(f"원의 면적: {circ.area()}")     # 문의 면적: 78.5 출력
 

위의 예제에서 Rectangle과 Circle 클래스는 Shape 클래스를 상속받고, area 메서드를 재정의하여 각 도형의 면적을 계산합니다.


5. 캡슐화: 접근 지정자 (public, private, protected)

캡슐화는 객체의 내부 상태를 보호하고, 외부로부터의 직접 접근을 제한하는 원칙입니다. Python에서는 관습적으로 접근 지정자를 사용합니다:

  • public : 모든 곳에서 접근 가능 (기본)
  • protected : 클래스 내부와 자식 클래스에서만 접근 가능 (_로 시작)
  • private : 클래스 내부에서만 접근 가능 (__로 시작)

캡슐화 예제

[python]
 
class Car:
    def __init__(self, brand, model):
        self.brand = brand        # public
        self._model = model       # protected
        self.__year = 2020        # private

    def display_info(self):
        print(f"브랜드: {self.brand}, 모델: {self._model}, 연도: {self.__year}")

car = Car("Toyota", "Corolla")
car.display_info()  # 브랜드: Toyota, 모델: Corolla, 연도: 2020 출력

print(car.brand)    # Toyota 출력
print(car._model)   # Corolla 출력
# print(car.__year) # 오류 발생: private 변수는 접근할 수 없음
 

위의 예제에서 Car 클래스는 brand (public), _model (protected), __year (private) 속성을 가집니다. __year 속성은 클래스 내부에서만 접근할 수 있습니다.


이 글에서는 Python의 객체 지향 프로그래밍(OOP)에 대해 알아보았습니다. 클래스와 객체, 생성자와 소멸자, 상속, 다형성, 캡슐화를 이해하고 활용하면 보다 구조적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다. Happy Coding!

728x90