Python 기초 6장: 객체지향 프로그래밍(OOP)
안녕하세요! 오늘은 Python의 핵심 개념 중 하나인 객체지향 프로그래밍(Object-Oriented Programming, OOP)에 대해 알아보겠습니다. 어려울 수 있는 개념이지만, 실생활의 예시를 통해 쉽게 이해해보도록 해요!
1. 객체지향 프로그래밍이란?
객체지향 프로그래밍은 실제 세상의 물건(객체)처럼 프로그래밍을 하는 방법입니다.
실생활 예시로 이해하기
휴대폰을 예로 들어볼까요?
- 속성(데이터)
- 브랜드: 삼성, 애플
- 색상: 검정, 흰색
- 화면 크기: 6.1인치
- 배터리 잔량: 82%
- 기능(메서드)
- 전화 걸기
- 문자 보내기
- 사진 찍기
- 충전하기
이처럼 우리 주변의 모든 물건들은 '속성'과 '기능'을 가지고 있습니다. 객체지향 프로그래밍은 이러한 현실 세계의 물건들을 프로그래밍으로 표현하는 방법입니다.
2. 클래스(Class)와 객체(Object)
2.1 클래스란?
클래스는 객체를 만들기 위한 '설계도'입니다. 쉽게 말해 과자를 만들 때 사용하는 과자 틀이라고 생각하면 됩니다!
class SmartPhone:
# 초기화 메서드 (스마트폰이 만들어질 때 실행됨)
def __init__(self, brand, color):
self.brand = brand # 브랜드
self.color = color # 색상
self.battery = 100 # 배터리 (처음에는 100%)
self.power = False # 전원 상태 (처음에는 꺼져있음)
# 전원 켜기
def turn_on(self):
self.power = True
print(f"{self.brand} 스마트폰의 전원을 켭니다.")
# 전원 끄기
def turn_off(self):
self.power = False
print(f"{self.brand} 스마트폰의 전원을 끕니다.")
# 배터리 충전하기
def charge(self, amount):
self.battery += amount
if self.battery > 100:
self.battery = 100
print(f"현재 배터리: {self.battery}%")
2.2 객체 만들기
클래스로부터 실제 물건(객체)을 만들어봅시다!
# 두 개의 다른 스마트폰 객체 생성
my_phone = SmartPhone("삼성", "검정")
your_phone = SmartPhone("애플", "흰색")
# 각각의 스마트폰으로 다른 작업하기
my_phone.turn_on() # 출력: 삼성 스마트폰의 전원을 켭니다.
your_phone.charge(20) # 출력: 현재 배터리: 100%
3. OOP의 4가지 주요 특징
3.1 캡슐화(Encapsulation)
캡슐화는 알약처럼 내용물(데이터)을 캡슐로 감싸서 보호하는 것입니다.
class BankAccount:
def __init__(self, owner):
self.__balance = 0 # __를 붙이면 private 변수가 됩니다
self.owner = owner
# 입금
def deposit(self, amount):
if amount > 0:
self.__balance += amount
print(f"{amount}원이 입금되었습니다.")
else:
print("잘못된 금액입니다.")
# 잔액 확인
def get_balance(self):
print(f"{self.owner}님의 현재 잔액: {self.__balance}원")
return self.__balance
# 사용 예시
account = BankAccount("김철수")
account.deposit(5000) # 출력: 5000원이 입금되었습니다.
account.get_balance() # 출력: 김철수님의 현재 잔액: 5000원
# account.__balance # 오류 발생! private 변수는 직접 접근 불가
3.2 상속(Inheritance)
부모로부터 특징을 물려받는 것처럼, 기존 클래스의 기능을 물려받아 새로운 클래스를 만들 수 있습니다.
# 부모 클래스
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass
# 자식 클래스들
class Dog(Animal):
def speak(self):
return f"{self.name}가 멍멍!"
class Cat(Animal):
def speak(self):
return f"{self.name}가 야옹!"
# 사용 예시
puppy = Dog("멍멍이")
kitty = Cat("나비")
print(puppy.speak()) # 출력: 멍멍이가 멍멍!
print(kitty.speak()) # 출력: 나비가 야옹!
3.3 다형성(Polymorphism)
같은 모양의 코드가 다른 동작을 하는 것을 말합니다. 위의 Animal 클래스에서 Dog와 Cat이 같은 speak() 메서드를 다르게 구현한 것이 다형성의 예시입니다.
3.4 추상화(Abstraction)
복잡한 내용은 숨기고 주요한 내용만 보여주는 것입니다.
from abc import ABC, abstractmethod
class Vehicle(ABC):
@abstractmethod
def move(self):
pass
class Car(Vehicle):
def move(self):
return "도로를 달립니다."
class Airplane(Vehicle):
def move(self):
return "하늘을 납니다."
4. 실전 예제: 도서관 시스템 만들기
class Book:
def __init__(self, title, author):
self.title = title # 책 제목
self.author = author # 작가
self.is_borrowed = False # 대출 여부
def __str__(self):
status = "대출 중" if self.is_borrowed else "대출 가능"
return f"[{self.title}] {self.author} - {status}"
class Library:
def __init__(self, name):
self.name = name # 도서관 이름
self.books = [] # 보유 도서 목록
# 새 책 추가
def add_book(self, title, author):
book = Book(title, author)
self.books.append(book)
print(f"새로운 책 '{title}'이(가) 등록되었습니다.")
# 전체 도서 목록 보기
def display_books(self):
print(f"\n{self.name} 도서 목록:")
for book in self.books:
print(book)
# 책 대출하기
def borrow_book(self, title):
for book in self.books:
if book.title == title:
if not book.is_borrowed:
book.is_borrowed = True
print(f"'{title}'을(를) 대출했습니다.")
return
else:
print(f"'{title}'은(는) 이미 대출 중입니다.")
return
print(f"'{title}'을(를) 찾을 수 없습니다.")
# 책 반납하기
def return_book(self, title):
for book in self.books:
if book.title == title:
if book.is_borrowed:
book.is_borrowed = False
print(f"'{title}'을(를) 반납했습니다.")
return
else:
print(f"'{title}'은(는) 이미 반납되어 있습니다.")
return
print(f"'{title}'을(를) 찾을 수 없습니다.")
# 사용 예시
library = Library("파이썬 도서관")
library.add_book("Python 기초", "김파이")
library.add_book("객체지향의 이해", "이객체")
library.add_book("알고리즘 첫걸음", "박알고")
library.display_books()
library.borrow_book("Python 기초")
library.display_books()
library.return_book("Python 기초")
library.display_books()
5. 정리
객체지향 프로그래밍의 장점:
- 코드 재사용이 쉬워요
- 직관적이고 이해하기 쉬워요
- 유지보수가 편해요
- 대규모 프로그램 개발에 적합해요
6. 연습문제 및 풀이
문제 1
Person
클래스를 만들고 이름, 나이를 속성으로 가지도록 구현해보세요.
# 풀이 1
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f"안녕하세요! 저는 {self.age}살 {self.name}입니다.")
# 사용 예시
person1 = Person("홍길동", 25)
person1.introduce() # 출력: 안녕하세요! 저는 25살 홍길동입니다.
문제 2
Student
클래스를 Person
클래스로부터 상속받아 학번을 추가로 가지도록 구현해보세요.
# 풀이 2
class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age) # 부모 클래스의 초기화
self.student_id = student_id
def study(self):
print(f"{self.student_id} 학번 {self.name}이(가) 공부를 시작합니다.")
def introduce(self):
super().introduce()
print(f"제 학번은 {self.student_id}입니다.")
# 사용 예시
student1 = Student("김학생", 20, "2024001")
student1.introduce() # 출력: 안녕하세요! 저는 20살 김학생입니다.
# 제 학번은 2024001입니다.
student1.study() # 출력: 2024001 학번 김학생이(가) 공부를 시작합니다.
문제 3
자판기 클래스를 만들어보세요. 음료수 추가, 구매, 재고 확인 기능을 구현하세요.
# 풀이 3
class VendingMachine:
def __init__(self):
self.drinks = {} # 음료수 저장 딕셔너리 {이름: [가격, 수량]}
def add_drink(self, name, price, quantity):
if name in self.drinks:
self.drinks[name][1] += quantity
else:
self.drinks[name] = [price, quantity]
print(f"{name} {quantity}개가 추가되었습니다.")
def buy_drink(self, name, money):
if name not in self.drinks:
print("해당 음료가 없습니다.")
return money
price, quantity = self.drinks[name]
if quantity == 0:
print("품절되었습니다.")
return money
if money < price:
print("잔액이 부족합니다.")
return money
self.drinks[name][1] -= 1
change = money - price
print(f"{name}을(를) 구매했습니다. 거스름돈: {change}원")
return change
def show_drinks(self):
print("\n=== 자판기 현재 상태 ===")
for name, info in self.drinks.items():
print(f"{name}: {info[0]}원 (재고: {info[1]}개)")
# 사용 예시
vm = VendingMachine()
vm.add_drink("콜라", 1500, 3)
vm.add_drink("사이다", 1300, 2)
vm.show_drinks()
change = vm.buy_drink("콜라", 2000) # 출력: 콜라을(를) 구매했습니다. 거스름돈: 500원
print(f"남은 돈: {change}원")
vm.show_drinks()
해시태그: #Python #객체지향프로그래밍 #OOP #클래스 #객체 #프로그래밍기초 #파이썬문법 #코딩
'Python' 카테고리의 다른 글
Python 기초 5장 - 컬렉션(Collections) 완벽 가이드 (1) | 2024.11.28 |
---|---|
Python 기초 4장 - 함수(Functions) 완벽 가이드 (0) | 2024.11.27 |
Python PEMDAS-LR - 파이썬 연산자 우선순위와 계산 방향 이해하기 (0) | 2024.11.27 |
Python 기초 3장 - 연습문제 답안 (0) | 2024.11.27 |
Python 기초 3장 - 제어문 완벽 가이드 (0) | 2024.11.26 |