본문 바로가기
파이썬/[객체지향 시리즈!]

📌 4. 캡슐화와 추상화: 데이터 보호와 인터페이스 설계

by 배불뚝 아저씨 2025. 2. 6.
반응형

1. 객체지향 프로그래밍(OOP) 개요 (이전 시리즈 요약)

이전 글에서는 상속과 다형성의 개념을 배웠습니다. 핵심 내용은 다음과 같습니다:

  • 상속(Inheritance): 기존 클래스의 기능을 물려받아 새로운 클래스를 생성 (코드 재사용성 향상)
  • 다형성(Polymorphism): 같은 메서드를 여러 클래스에서 다르게 구현할 수 있음
  • 추상 클래스(Abstract Class): 공통 인터페이스를 제공하여 코드의 구조를 명확하게 정의

이번 글에서는 **캡슐화(Encapsulation)**와 **추상화(Abstraction)**를 다루며, 데이터 보호 및 인터페이스 설계를 효율적으로 하는 방법을 알아보겠습니다.


2. 캡슐화(Encapsulation)란?

캡슐화는 객체의 내부 데이터를 외부에서 직접 접근하지 못하도록 제한하는 개념입니다. 이를 통해 데이터 보호와 유지보수의 용이성을 확보할 수 있습니다.

✅ 캡슐화의 특징

  1. **변수를 ****private**으로 선언하여 직접 접근 차단
  2. Getter 및 Setter 메서드를 통해 데이터를 제어
  3. 클래스 내부의 동작을 감추고, 필요한 기능만 제공

🔹 예제: 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)란?

추상화는 객체의 내부 동작을 감추고 필요한 기능만 제공하는 개념입니다. 이를 통해 인터페이스를 표준화하고, 유지보수를 쉽게 할 수 있습니다.

✅ 추상화의 특징

  1. 불필요한 세부 정보를 숨기고 필요한 기능만 제공
  2. 추상 클래스와 인터페이스를 사용하여 구조화된 설계 가능
  3. 객체지향 설계에서 중복을 최소화하고 코드의 일관성을 유지

🔹 예제: 추상 클래스와 추상 메서드

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

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

반응형

댓글