(아 만들어준 썸네일이 너무 웃기다)
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)의 기본 개념 중 하나로, 객체의 내부 상태를 외부로부터 숨기고, 허용된 방식으로만 접근하게 하는 기법이다.
self.__name
__
으로 시작하는 변수는 private 변수로 간주되어 외부에서 직접 접근이 불가하다.p1.__name
으로 접근할 수 없음@property
def Name(self):...
@Name.setter
def Name(self, value):...
직접 접근을 막고, 통제된 방식으로만 값을 변경하도록 만드는 것이 캡슐화의 본질인데 __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
데이터를 보호하면서 외부에서 제한된 방식으로 접근할 수 있게 만든다.
@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)
처럼 사용이 가능하며 인스턴스 상태와 무관하므로 객체를 만들 필요가 없다. 즉, 클래스의 '기능적 범위'에 속하지만 인스턴스와 무관한 함수를 정의한다.
__name
: 외부에서 직접 접근 불가능한 private 변수@property
: getter: 읽기 권한 제공 (p1.Name)@setter
: setter: 쓰기 권한 제공 (p1.Name = "값"), 조건/로직 삽입 가능@staticmethod
: 클래스와 관련 있지만 인스턴스 상태에 의존하지 않는 함수 정의 가능