Python05

Python(파이썬) 객체지향 프로그래밍 기초

객체지향 프로그래밍(OOP)이란?

객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 객체 단위로 구성하여 설계하는 프로그래밍 패러다임입니다. 객체는 데이터(속성)와 그 데이터에 대한 행위(메서드)로 이루어져 있습니다. 이번 포스트에서는 파이썬에서의 객체지향 프로그래밍 기초에 대해 알아보겠습니다.

클래스와 객체

클래스는 객체를 정의하는 설계도와 같습니다. 파이썬에서는 class 키워드를 사용하여 클래스를 정의합니다.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def greet(self):
        print(f"Hello, I'm {self.name}.")
        
person1 = Person("John", 30)
person2 = Person("Jane", 25)

person1.greet()  # Hello, I'm John.
print(person2.age)  # 25

위 예시에서 Person 클래스는 nameage 속성, 그리고 greet() 메서드를 가지고 있습니다. __init__() 메서드는 객체가 생성될 때 자동으로 호출되는 특별한 메서드로, 속성 초기화 등의 작업을 수행합니다.

person1person2Person 클래스의 인스턴스(객체)입니다. 객체를 통해 클래스의 속성과 메서드에 접근할 수 있습니다.

상속과 다형성

상속(Inheritance)은 기존 클래스(부모 클래스)를 확장하여 새로운 클래스(자식 클래스)를 정의하는 것을 말합니다. 이를 통해 코드 재사용성을 높일 수 있습니다.

class Employee(Person):
    def __init__(self, name, age, salary):
        super().__init__(name, age)
        self.salary = salary
        
    def work(self):
        print(f"{self.name}는 현재 일을 하고 있습니다.")
        
employee = Employee("Bob", 35, 50000)
employee.greet()  # Hello, I'm Bob.
employee.work()  # Bob는 현재 일을 하고 있습니다.

Employee 클래스는 Person 클래스를 상속받았습니다. super().__init__() 메서드를 통해 부모 클래스의 __init__() 메서드를 호출하여 nameage 속성을 초기화합니다.

한편, 다형성(Polymorphism)은 여러 객체가 같은 메시지에 대해 각자의 방식으로 반응할 수 있는 특성을 말합니다. 이를 통해 유연하고 확장성 있는 코드를 작성할 수 있습니다.

class Animal:
    def __init__(self, name):
        self.name = name
        
    def speak(self):
        pass  # 추상 메서드
    
class Dog(Animal):
    def speak(self):
        print("Woof!")

class Cat(Animal):
    def speak(self):
        print("Meow!")
        
animals = [Dog("Buddy"), Cat("Whiskers")]

for animal in animals:
    animal.speak()  # Woof! Meow!

DogCat 클래스는 Animal 클래스를 상속받았습니다. 각 클래스는 speak() 메서드를 자신만의 방식으로 구현하고 있습니다. 이렇게 다양한 객체들이 동일한 메시지(speak())에 대해 각자의 방식으로 반응하는 것이 다형성입니다.

캡슐화와 접근 제어

캡슐화(Encapsulation)는 객체의 속성과 메서드를 하나로 묶고, 외부에서 직접 접근할 수 없도록 하는 것을 말합니다. 이를 통해 데이터의 무결성을 보장할 수 있습니다.

파이썬에서는 변수나 메서드 이름 앞에 __(언더스코어 2개)를 붙이면 이름 변형(Name Mangling)이라는 기법을 통해 해당 속성이나 메서드를 클래스 외부에서 직접 접근할 수 없게 됩니다.

class BankAccount:
    def __init__(self, balance):
        self.__balance = balance  # 비공개 속성
        
    def deposit(self, amount):
        self.__balance += amount
        
    def withdraw(self, amount):
        if self.__balance >= amount:
            self.__balance -= amount
        else:
            print("잔액이 부족합니다.")
            
    def get_balance(self):
        return self.__balance

account = BankAccount(1000)
account.deposit(500)
account.withdraw(200)
print(account.get_balance())  # 1300

BankAccount 클래스의 __balance 속성은 비공개 속성입니다. 이 속성에 직접 접근할 수는 없고, deposit(), withdraw(), get_balance() 메서드를 통해서만 간접적으로 접근할 수 있습니다. 이렇게 데이터에 대한 접근을 제한함으로써 데이터의 무결성을 보장할 수 있습니다.

마무리

이번 포스트에서는 파이썬의 객체지향 프로그래밍 기초에 대해 알아보았습니다. 클래스와 객체, 상속과 다형성, 캡슐화와 접근 제어 등의 개념을 살펴보았습니다. 객체지향 프로그래밍은 코드의 재사용성과 유지보수성을 높여주며, 대규모 프로젝트에서 매우 유용합니다.

객체지향 프로그래밍의 주요 개념을 정리하면 다음과 같습니다:

  • 클래스: 객체의 설계도
  • 객체: 클래스의 인스턴스
  • 상속: 기존 클래스를 확장하여 새로운 클래스 정의
  • 다형성: 여러 객체가 같은 메시지에 대해 각자의 방식으로 반응
  • 캡슐화: 데이터와 메서드를 하나로 묶고 외부 접근을 제한

댓글남기기