1. 객체지향 프로그래밍(OOP) 개요 (이전 시리즈 요약)
이전 글에서는 상속과 다형성의 개념을 배웠습니다. 핵심 내용은 다음과 같습니다:
- 상속(Inheritance): 기존 클래스의 기능을 물려받아 새로운 클래스를 생성 (코드 재사용성 향상)
- 다형성(Polymorphism): 같은 메서드를 여러 클래스에서 다르게 구현할 수 있음
- 추상 클래스(Abstract Class): 공통 인터페이스를 제공하여 코드의 구조를 명확하게 정의
이번 글에서는 **캡슐화(Encapsulation)**와 **추상화(Abstraction)**를 다루며, 데이터 보호 및 인터페이스 설계를 효율적으로 하는 방법을 알아보겠습니다.
2. 캡슐화(Encapsulation)란?
캡슐화는 객체의 내부 데이터를 외부에서 직접 접근하지 못하도록 제한하는 개념입니다. 이를 통해 데이터 보호와 유지보수의 용이성을 확보할 수 있습니다.
✅ 캡슐화의 특징
- **변수를 ****private**으로 선언하여 직접 접근 차단
- Getter 및 Setter 메서드를 통해 데이터를 제어
- 클래스 내부의 동작을 감추고, 필요한 기능만 제공
🔹 예제: private 변수와 Getter/Setter
class BankAccount:
def __init__(self, owner, balance):
self.owner = owner
self.__balance = balance # private 변수 선언
def deposit(self, amount):
self.__balance += amount
return f'{amount}원이 입금되었습니다. 현재 잔액: {self.__balance}원'
def withdraw(self, amount):
if amount > self.__balance:
return '잔액 부족!'
self.__balance -= amount
return f'{amount}원이 출금되었습니다. 현재 잔액: {self.__balance}원'
def get_balance(self):
return f'현재 잔액: {self.__balance}원'
# 객체 생성
account = BankAccount("Kim", 10000)
print(account.deposit(5000))
print(account.withdraw(12000))
print(account.get_balance())
🖥 실행 결과
5000원이 입금되었습니다. 현재 잔액: 15000원
12000원이 출금되었습니다. 현재 잔액: 3000원
현재 잔액: 3000원
🔹 __balance 변수 앞에 __(언더스코어 두 개)를 붙이면 외부에서 직접 접근할 수 없도록 보호됩니다. 대신 get_balance() 메서드를 통해 접근해야 합니다.
3. 캡슐화와 속성 데코레이터 (Property Decorator)
파이썬에서는 @property 데코레이터를 사용하여 getter/setter 메서드를 더욱 간단하게 구현할 수 있습니다.
🔹 예제: @property 데코레이터 사용하기
class Person:
def __init__(self, name, age):
self.__name = name
self.__age = age
@property
def age(self):
return self.__age # Getter 역할
@age.setter
def age(self, new_age):
if new_age > 0:
self.__age = new_age
else:
raise ValueError("나이는 0보다 커야 합니다!")
person = Person("Alice", 25)
print(person.age) # 25 (getter 호출)
person.age = 30 # setter 호출
print(person.age) # 30
🔹 @property를 사용하면 getter 메서드를 호출할 때 속성처럼 사용할 수 있습니다.
4. 추상화(Abstraction)란?
추상화는 객체의 내부 동작을 감추고 필요한 기능만 제공하는 개념입니다. 이를 통해 인터페이스를 표준화하고, 유지보수를 쉽게 할 수 있습니다.
✅ 추상화의 특징
- 불필요한 세부 정보를 숨기고 필요한 기능만 제공
- 추상 클래스와 인터페이스를 사용하여 구조화된 설계 가능
- 객체지향 설계에서 중복을 최소화하고 코드의 일관성을 유지
🔹 예제: 추상 클래스와 추상 메서드
from abc import ABC, abstractmethod
class Animal(ABC): # 추상 클래스 정의
@abstractmethod
def make_sound(self):
pass # 하위 클래스에서 반드시 구현해야 함
class Dog(Animal):
def make_sound(self):
return "멍멍!"
class Cat(Animal):
def make_sound(self):
return "야옹!"
# 객체 생성
dog = Dog()
cat = Cat()
print(dog.make_sound())
print(cat.make_sound())
🖥 실행 결과
멍멍!
야옹!
🔹 ABC 클래스를 사용하여 추상 클래스를 정의하고, @abstractmethod를 통해 반드시 구현해야 할 메서드를 정의했습니다.
5. 캡슐화와 추상화를 결합하여 설계하기
추상화와 캡슐화를 함께 활용하면 유지보수성이 높은 코드를 만들 수 있습니다.
🔹 예제: 은행 시스템 설계
class Account(ABC):
def __init__(self, owner, balance):
self.owner = owner
self.__balance = balance
@abstractmethod
def get_balance(self):
pass
class SavingsAccount(Account):
def get_balance(self):
return f"{self.owner}님의 예금 계좌 잔액: {self._Account__balance}원"
savings = SavingsAccount("Kim", 50000)
print(savings.get_balance())
🖥 실행 결과
Kim님의 예금 계좌 잔액: 50000원
🔹 Account 클래스를 추상 클래스로 만들고, get_balance()를 하위 클래스에서 구현하도록 강제했습니다.
🎯 마무리
이 글에서는 캡슐화와 추상화를 활용하여 데이터 보호 및 인터페이스 설계를 효율적으로 하는 방법을 배웠습니다.
- 캡슐화(Encapsulation): private 변수를 사용하여 데이터 보호
- 추상화(Abstraction): 인터페이스를 제공하고 세부 구현을 숨김
- 속성 데코레이터(@property): getter/setter를 보다 쉽게 구현
- 추상 클래스와 메서드: 반드시 구현해야 할 메서드를 강제하여 일관성 유지
다음 글에서는 OOP 실전 프로젝트: 간단한 도서 관리 시스템을 만들어보겠습니다! 🚀
혼자 공부하는 파이썬:1:1 과외하듯 배우는 프로그래밍 자습서 - 프로그래밍 언어 | 쿠팡
현재 별점 4.8점, 리뷰 198개를 가진 혼자 공부하는 파이썬:1:1 과외하듯 배우는 프로그래밍 자습서! 지금 쿠팡에서 더 저렴하고 다양한 프로그래밍 언어 제품들을 확인해보세요.
www.coupang.com
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
'파이썬 > [객체지향 시리즈!]' 카테고리의 다른 글
📌 5. OOP 실전 프로젝트: 간단한 도서 관리 시스템 개발 (0) | 2025.02.07 |
---|---|
📌 3. 상속과 다형성: 코드 재사용성과 확장성 높이기 (0) | 2025.02.05 |
📌 2. 파이썬 클래스와 객체: 기본 개념과 활용 (0) | 2025.02.04 |
📌 1. 객체지향 프로그래밍이란? (개념과 기본 원칙) (0) | 2025.02.03 |
댓글