[Python] Encapsulation

미남잉·6일 전
0

Advanced Python

목록 보기
5/10


(아 만들어준 썸네일이 너무 웃기다)

Encapsulation(캡슐화)

class Person:
    def __init__(self, name, age, gender):
        self.__name = name
        self.__age = age
        self.__gender = gender

    @property
    def Name(self):
        return self.__name

    @Name.setter
    def Name(self, value):
        if value == "Bob":
            self.__name = "Default Name"
        else:
            self.__name = value

    @staticmethod
    def mymethod():
        print("Hello World!")

# 클래스 메서드 직접 호출
Person.mymethod()

# 인스턴스 생성
p1 = Person("Mike", 20, 'm')
print(p1.Name)  # Mike 출력

# 인스턴스를 통한 static method 호출
p1.mymethod()   # Hello World! 출력

# name 변경
p1.Name = "Bob"
print(p1.Name)  # Default Name 출력

캡슐화는 객체지향 프로그래밍(OOP)의 기본 개념 중 하나로, 객체의 내부 상태를 외부로부터 숨기고, 허용된 방식으로만 접근하게 하는 기법이다.

1. 접근 제한 (Access Restriction)

self.__name

  • __ 으로 시작하는 변수는 private 변수로 간주되어 외부에서 직접 접근이 불가하다.
  • 클래스 외부에서는 p1.__name으로 접근할 수 없음

2. Getter/Setter를 통한 제어된 접근

@property
def Name(self):...
@Name.setter
def Name(self, value):...
  • @property를 사용해 Name을 속성처럼 읽을 수 있게 함 (p1.Name).
  • @Name.setter를 통해 Name을 속성처럼 쓸 수 있게 함 (p1.Name = "Bob").
  • setter 내부에서 조건문을 통해 값에 대한 검증/제어 수행 → 캡슐화의 핵심

직접 접근을 막고, 통제된 방식으로만 값을 변경하도록 만드는 것이 캡슐화의 본질인데 __name 변수에 외부에서 직접 접근하면 아무 값이나, 의미 없는 값, 오류 유발 값 등이 들어갈 수 있게 된다.

프로그램의 안정성을 위해 사용되며, setter 내부에서 조건을 주거나, 타입 검사를 하거나 길이 제한 등을 둘 수 있다.

@Name.setter
def Name(self, value):
    if not isinstance(value, str):
        raise ValueError("Name must be a string")
    if value == "":
        raise ValueError("Name cannot be empty")
    self.__name = value

데이터를 보호하면서 외부에서 제한된 방식으로 접근할 수 있게 만든다.

3. 정적 메서드 (Static Method)

@staticmethod
def mymethod():
   print("Hello world")
  • 클래스나 인스턴스 모두로 호출 가능 (Person.mymethod() 또는 p1.mymethod()).
  • 인스턴스 상태와 무관한 기능 → 캡슐화의 보조 수단으로 사용됨

정적 메서드는 클래스 인스턴스(self)에 접근하지 않고, 클래스 변수(cls)에도 접근하지 않는다. 그냥 클래스의 범주에 속해 있는 일반 함수이다.

클래스와 논리적으로 관련된 기능이지만, 특정 인스턴스와는 관련이 없을 때 사용된다.

class MathUtil:
    @staticmethod
    def add(a, b):
        return a + b

MathUtil.add(3, 4)처럼 사용이 가능하며 인스턴스 상태와 무관하므로 객체를 만들 필요가 없다. 즉, 클래스의 '기능적 범위'에 속하지만 인스턴스와 무관한 함수를 정의한다.

4. 요약

  • __name: 외부에서 직접 접근 불가능한 private 변수
  • @property: getter: 읽기 권한 제공 (p1.Name)
  • @setter: setter: 쓰기 권한 제공 (p1.Name = "값"), 조건/로직 삽입 가능
  • @staticmethod: 클래스와 관련 있지만 인스턴스 상태에 의존하지 않는 함수 정의 가능
  • 핵심 개념: 객체 내부의 구현을 숨기고, 정의된 방식으로만 접근을 허용함
profile
Computer Vision Engineer

0개의 댓글

관련 채용 정보