객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 객체들의 집합으로 파악하는 프로그래밍 패러다임이다. 이 방식은 프로그램을 더 유연하고, 코드 재사용을 높이며, 대규모 소프트웨어 개발에 적합하게 만든다.
클래스는 파이썬에서 객체를 생성하기 위한 "틀" 또는 "블루프린트"다. 클래스는 특정 종류의 객체를 생성하기 위해 변수와 메소드를 정의한다. 클래스를 정의한다는 것은 새로운 자료형을 정의하는 것과 유사하다.
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
return "Woof!"
인스턴스는 클래스에 정의된 구조로 생성된 실제 객체다. 클래스를 기반으로 메모리에 할당되며, 각 인스턴스는 독립적인 상태를 가진다.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
# 인스턴스 생성
dog = Dog("Buddy")
cat = Cat("Misty")
# 메소드 호출
print(dog.speak()) # Woof!
print(cat.speak()) # Meow!
클래스와 인스턴스는 객체 지향 프로그래밍의 핵심적인 개념이며, 이들을 통해 코드의 재사용성, 모듈성, 유지 보수성이 향상된다.
__init__
메소드
__init__
는 파이썬 클래스에서 사용되는 특별한 메소드이다. 이 메소드는 클래스의 새 인스턴스가 생성될 때 자동으로 호출된다. 주로 해당 인스턴스의 초기 상태를 설정하거나, 필요한 초기화 작업을 수행하는 데 사용된다.
class 클래스명:
def __init__(self, 매개변수1, 매개변수2, ...):
# 초기화 코드
self
: 클래스의 인스턴스를 가리키는 데 사용되며, 메소드 내에서 인스턴스 변수에 접근할 때 사용된다.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("민준", 25)
print(p1.name) # 민준 출력
print(p1.age) # 25 출력
위 코드에서 Person
클래스의 __init__
메소드는 name
과 age
라는 두 매개변수를 받아, 해당 인스턴스의 name
과 age
속성을 초기화한다.
__init__
의 역할__init__
메소드는 클래스 기반 프로그래밍에서 매우 중요한 부분이며, 객체 지향 프로그래밍의 핵심 개념 중 하나다. 객체가 생성될 때 필요한 여러 초기화 작업을 수행하는 데 필수적이다.
상속은 한 클래스(자식 클래스)가 다른 클래스(부모 클래스)의 모든 속성(변수)과 메소드(함수)를 물려받는 프로그래밍 방법이다. 상속을 사용하면 코드의 재사용성을 높이고, 중복을 줄일 수 있다.
class Animal:
def __init__(self, name):
self.name = name
class Dog(Animal):
def bark(self):
return "Woof!"
dog = Dog("Buddy")
print(dog.name) # Buddy
print(dog.bark()) # Woof!
캡슐화는 객체의 일부 구현 세부 사항을 외부로부터 숨기는 것을 말한다. 이를 통해 객체의 데이터를 보호하고, 외부에서 잘못된 사용을 방지할 수 있다.
class Computer:
def __init__(self):
self.__max_price = 900
def sell(self):
return f"Selling Price: {self.__max_price}"
def set_max_price(self, price):
if price <= 1000:
self.__max_price = price
c = Computer()
print(c.sell()) # Selling Price: 900
c.set_max_price(950)
print(c.sell()) # Selling Price: 950
다형성은 동일한 인터페이스에 대해 서로 다른 클래스의 객체들이 서로 다른 동작을 수행할 수 있도록 하는 기능이다.
class Animal:
def speak(self):
raise NotImplementedError("Subclass must implement abstract method")
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
animals = [Dog(), Cat()]
for animal in animals:
print(animal.speak()) # Woof! Meow!
추상화는 복잡한 현실 세계의 요소들을 단순화하여 모델링하는 과정이다. 프로그래밍에서 추상화는 복잡한 내부 구현 세부 사항을 숨기고, 사용자에게는 필요한 정보와 인터페이스만을 제공하는 것을 의미한다. 이를 통해 사용자는 복잡한 내부 로직을 몰라도 객체의 기능을 쉽게 사용할 수 있다.
class WashingMachine:
def wash(self, clothes):
self.__add_water()
self.__add_detergent()
self.__start_washing()
return "Washing Complete"
def __add_water(self):
# 물 추가 로직
pass
def __add_detergent(self):
# 세제 추가 로직
pass
def __start_washing(self):
# 세탁 시작 로직
pass
# 사용
machine = WashingMachine()
result = machine.wash(["shirt", "pants"])
print(result) # Washing Complete
객체지향 프로그래밍에 대해 더욱 자세하게 이해 할 수 있도록 다음 게시글에서 실제 활용 예시들을 다뤄보도록 하겠다.