본문 바로가기

About my life/Development Studies

[OOP] 객체지향프로그래밍 장점: 구체적인 예시

728x90
반응형

 

객체지향프로그래밍은 소프트웨어 개발에서 현실 세계의 모델링을 기반으로 하는 중요한 개념입니다. 이 블로그 글에서는 객체지향언어의 핵심 원리와 그 예시를 통해 어떻게 현실 세계의 복잡성을 효과적으로 다루는지 자세히 알아보겠습니다.

객체지향프로그래밍이 무엇인지 이해하고 싶으시면 아래 링크로 접속!

[OOP] 객체 지향 프로그래밍이란 ? 구체적인 설명과 예시

1. 객체지향프로그램의 개념 소개:

객체지향언어는 현실 세계의 객체(Object)를 모델링하여 프로그래밍하는 개념입니다. 여기서 객체는 데이터와 그 데이터를 처리하는 메서드로 이루어져 있습니다.

 

예시: 자동차 객체

class Car:
    def __init__(self, brand, model, color):
        self.brand = brand
        self.model = model
        self.color = color
        self.speed = 0

    def accelerate(self, increment):
        self.speed += increment

    def brake(self, decrement):
        self.speed -= decrement

 

위의 예시에서 Car 클래스는 자동차 객체를 나타냅니다. __init__ 메서드는 객체의 초기화를 담당하고, accelerate 와 brake 메서드는 속도를 조절하는 기능을 제공합니다. 위 예시처럼 객체를 모듈단위로 세분화하기 때문에 가독성, 재사용성, 유지보수성 등의 측면에서 이점을 볼 수 있습니다.


2. 캡슐화:

캡슐화는 객체의 상태와 행위를 하나의 단위로 묶는 개념입니다. 이를 통해 객체의 내부 구현을 외부에 감추고 외부에서는 객체에 정의된 인터페이스를 통해 상호작용할 수 있습니다.

 

예시: 은행 계좌 객체

class BankAccount:
    def __init__(self):
        self._balance = 0  # _balance를 protected로 선언

    def deposit(self, amount):
        if amount > 0:
            self._balance += amount
            print(f"{amount}원을 입금했습니다. 현재 잔액: {self._balance}원")
        else:
            print("올바르지 않은 입금 금액입니다.")

    def withdraw(self, amount):
        if 0 < amount <= self._balance:
            self._balance -= amount
            print(f"{amount}원을 출금했습니다. 현재 잔액: {self._balance}원")
        else:
            print("올바르지 않은 출금 금액이거나 잔액이 부족합니다.")

    def get_balance(self):
        return self._balance

 

파이썬에서는 '_' 를 변수 이름 앞에 붙여 protected 로 선언할 수 있습니다. 클래스 외부에서는 직접적으로 _balance 를 조회하거나 수정할 수 없으며 오직 메서드 withdraw, get_balance를 통해서만 가능합니다. 이러한 것을 보고 캡슐화라고 합니다.


3. 상속:

상속은 기존 클래스의 특성을 그대로 물려받아 새로운 클래스를 생성하는 개념입니다. 이를 통해 코드의 재사용성을 높이고, 유지보수를 용이하게 만듭니다.

 

예시: 부모 자식 객체

class Parent:
    def __init__(self, name):
        self.name = name

    def say_hello(self):
        print(f"안녕, 나는 {self.name}이야!")

class Child(Parent):
    def __init__(self, name, toy):
        # 부모 클래스의 __init__ 메서드 호출
        super().__init__(name)
        self.toy = toy

    def play(self):
        print(f"{self.name}이(가) {self.toy}로 놀아요!")

# 자식 클래스의 객체 생성
child = Child("철수", "로봇")

# 부모 클래스의 메서드 호출
child.say_hello()  # 출력: 안녕, 나는 철수이야!

# 자식 클래스의 메서드 호출
child.play()  # 출력: 철수이(가) 로봇으로 놀아요!

 

위의 예시에서 Child 클래스는 '__init__' 메서드에서 'super()__init__(name)'을 호출하여 Parent 클래스의 '__init__' 메서드를 실행합니다. 이를 통해 'name' 속성을 초기화하고, 자식 클래스에서 추가로 정의한 'toy' 속성도 초기화합니다. super() 를 사용하면 부모 클래스의 메서드를 호ㅜㄹ하는 데에 유연성을 제공하고, 코드의 재사용성을 높일 수 있습니다.


4. 다형성:

 

다형성은 같은 이름의 메서드나 연산자가 다른 클래스에서 다르게 동작하는 특성입니다. 이는 같은 인터페이스를 가진 객체들이 다양한 방식으로 동작할 수 있게 합니다.

 

예시: 동물 객체

class Animal:
    def speak(self):
        return "동물 소리"

# Dog 클래스는 Animal 클래스를 상속받음
class Dog(Animal):
    def speak(self):
        return "멍멍!"

# Cat 클래스는 Animal 클래스를 상속받음
class Cat(Animal):
    def speak(self):
        return "야옹!"

# 함수를 통해 동물 소리 출력
def make_animal_sound(animal):
    return animal.speak()

# 다양한 동물들을 생성하고 출력
dog = Dog()
cat = Cat()

print(make_animal_sound(dog))  # 출력: 멍멍!
print(make_animal_sound(cat))  # 출력: 야옹!

 

이 프로그램은 'Aninmal' 클래스를 상속받은 'Dog' 와 'Cat' 클래스를 사용하여 다양한 동물의 소리를 출력합니다. 여기서 새로운 동물을 추가하거나 기능을 추가할 수 있습니다.

class Duck(Animal):
    def speak(self):
        return "꽥꽥!"

 

class Dog(Animal):
    def speak(self):
        return "멍멍!"

    def go_for_a_walk(self):
        return "산책 중!"

객체지향프로그래밍의 핵심 개념들을 이해하면 복잡한 현실 세계의 모델을 효과적으로 추상화하고 다룰 수 있습니다. 이러한 원리를 이용하면 더 유연하고 확장 가능한 소프트웨어를 개발할 수 있습니다.

 

728x90
반응형