객체지향프로그래밍은 소프트웨어 개발에서 현실 세계의 모델링을 기반으로 하는 중요한 개념입니다. 이 블로그 글에서는 객체지향언어의 핵심 원리와 그 예시를 통해 어떻게 현실 세계의 복잡성을 효과적으로 다루는지 자세히 알아보겠습니다.
객체지향프로그래밍이 무엇인지 이해하고 싶으시면 아래 링크로 접속!
[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 "산책 중!"
객체지향프로그래밍의 핵심 개념들을 이해하면 복잡한 현실 세계의 모델을 효과적으로 추상화하고 다룰 수 있습니다. 이러한 원리를 이용하면 더 유연하고 확장 가능한 소프트웨어를 개발할 수 있습니다.
'About my life > Development Studies' 카테고리의 다른 글
[Linux] Ubuntu 20.04 듀얼 부팅 방법: 오류 없음 (22) | 2023.12.13 |
---|---|
스크립트 언어와 프로그램 언어의 차이점: CS지식 (73) | 2023.12.07 |
[OOP] 객체 지향 프로그래밍이란 ? 구체적인 설명과 예시 (31) | 2023.11.29 |
[IT] 효과적인 프로젝트 기획: 주요 단계와 고려 사항 (98) | 2023.11.28 |
[WEB] 웹 프레임워크 장단점 (Django, Flask, Express.js, Spring Boot, Ruby on Rails) (142) | 2023.11.27 |