객체 지향 프로그래밍

Plcb Archive·2024년 1월 30일
0

파이썬

목록 보기
5/22

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

객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 객체들의 집합으로 파악하는 프로그래밍 패러다임이다. 이 방식은 프로그램을 더 유연하고, 코드 재사용을 높이며, 대규모 소프트웨어 개발에 적합하게 만든다.

핵심 개념

  1. 클래스(Class)와 인스턴스(Instance): 클래스는 객체를 정의하는 틀이며, 인스턴스는 클래스에 의해 생성된 객체다.
  2. 상속(Inheritance): 한 클래스가 다른 클래스의 속성과 메소드를 물려받는 것.
  3. 캡슐화(Encapsulation): 객체의 세부 구현을 외부로부터 숨기고, 외부 인터페이스만을 제공하는 것.
  4. 다형성(Polymorphism): 동일한 인터페이스에 대해 서로 다른 클래스의 객체들이 서로 다른 동작을 수행할 수 있게 하는 것.
  5. 추상화(Abstraction): 복잡한 세부 사항을 숨기고, 더 단순한 고수준의 인터페이스를 제공하는 것.


1. 클래스와 인스턴스

클래스(Class)란?

클래스는 파이썬에서 객체를 생성하기 위한 "틀" 또는 "블루프린트"다. 클래스는 특정 종류의 객체를 생성하기 위해 변수와 메소드를 정의한다. 클래스를 정의한다는 것은 새로운 자료형을 정의하는 것과 유사하다.

클래스의 특징

  • 속성(Attribute): 클래스에 정의된 변수. 객체의 상태나 데이터를 나타낸다.
  • 메소드(Method): 클래스에 정의된 함수. 객체의 동작이나 기능을 나타낸다.
  • 재사용 가능: 같은 클래스에 의해 생성된 객체들은 동일한 구조(속성과 메소드)를 공유한다.

예시 코드

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        return "Woof!"

인스턴스(Instance)

인스턴스는 클래스에 정의된 구조로 생성된 실제 객체다. 클래스를 기반으로 메모리에 할당되며, 각 인스턴스는 독립적인 상태를 가진다.

인스턴스의 특징

  • 개별적인 상태: 같은 클래스에서 생성된 각 인스턴스는 독립적인 상태를 갖는다.
  • 클래스의 구조 공유: 모든 인스턴스는 동일한 클래스 정의(속성과 메소드)를 공유한다.
  • 인터랙션 가능: 인스턴스는 메소드를 통해 상호작용할 수 있다.

예시 코드

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__ 메소드는 nameage라는 두 매개변수를 받아, 해당 인스턴스의 nameage 속성을 초기화한다.

__init__의 역할

  • 인스턴스 초기화: 객체가 생성될 때 기본 상태를 설정한다.
  • 필요한 자원 할당: 객체 사용에 필요한 자원을 할당하거나 초기 설정을 수행한다.
  • 인스턴스 변수 정의: 객체의 속성을 정의하고 초기값을 할당한다.

__init__ 메소드는 클래스 기반 프로그래밍에서 매우 중요한 부분이며, 객체 지향 프로그래밍의 핵심 개념 중 하나다. 객체가 생성될 때 필요한 여러 초기화 작업을 수행하는 데 필수적이다.

2. 상속(Inheritance)

상속은 한 클래스(자식 클래스)가 다른 클래스(부모 클래스)의 모든 속성(변수)과 메소드(함수)를 물려받는 프로그래밍 방법이다. 상속을 사용하면 코드의 재사용성을 높이고, 중복을 줄일 수 있다.

특징 및 예시

  • 코드 재사용: 기존 클래스의 코드를 재사용하여 새 클래스를 만들 수 있다.
  • 확장성: 기존 클래스의 기능을 확장하거나 변경할 수 있다.
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!

3. 캡슐화(Encapsulation)

캡슐화는 객체의 일부 구현 세부 사항을 외부로부터 숨기는 것을 말한다. 이를 통해 객체의 데이터를 보호하고, 외부에서 잘못된 사용을 방지할 수 있다.

특징 및 예시

  • 데이터 숨김: 객체의 데이터를 외부에서 직접 접근하지 못하게 한다.
  • 인터페이스 제공: 사용자는 객체의 메소드를 통해서만 데이터에 접근할 수 있다.
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

4. 다형성(Polymorphism)

다형성은 동일한 인터페이스에 대해 서로 다른 클래스의 객체들이 서로 다른 동작을 수행할 수 있도록 하는 기능이다.

특징 및 예시

  • 유연성: 동일한 메소드 호출에 대해 다른 객체는 서로 다른 행동을 보인다.
  • 유지 보수 용이: 기존 코드를 변경하지 않고 새로운 클래스를 추가할 수 있다.
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!

5. 추상화(Abstraction)

추상화는 복잡한 현실 세계의 요소들을 단순화하여 모델링하는 과정이다. 프로그래밍에서 추상화는 복잡한 내부 구현 세부 사항을 숨기고, 사용자에게는 필요한 정보와 인터페이스만을 제공하는 것을 의미한다. 이를 통해 사용자는 복잡한 내부 로직을 몰라도 객체의 기능을 쉽게 사용할 수 있다.

특징 및 예시

  • 단순화: 복잡한 로직을 숨기고 사용하기 쉬운 인터페이스를 제공한다.
  • 재사용성: 일반적인 기능을 추상화하여 여러 곳에서 재사용할 수 있다.
  • 유지 보수 용이: 내부 구현의 변경이 외부 사용에 영향을 덜 미친다.
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

객체지향 프로그래밍에 대해 더욱 자세하게 이해 할 수 있도록 다음 게시글에서 실제 활용 예시들을 다뤄보도록 하겠다.

0개의 댓글