DINO NET

(23.02.03) 객체 지향 프로그래밍 기본 개념 2. 캡슐화(Encapsulation) 본문

program()/파이썬

(23.02.03) 객체 지향 프로그래밍 기본 개념 2. 캡슐화(Encapsulation)

2023. 2. 3. 00:13

캡슐화(Encapsulation)

1. 객체의 일부 구현 내용에 대한 외부로부터의 직접적인 액세스를 차단하는 것.
2. 객체의 속성과 그것을 사용하는 행동을 하나로 묶는 것.

1. 객체의 일부 구현 내용에 대한 외부로부터의 직접적인 액세스를 차단하는 것.

: 변수, 메소드명 앞에 언어바 두 개 (__)를 쓰면 "클래스 외부" 에서 사용하지 못한다.

class Citizen:
    """주민 클래스"""
    drinking_age = 19 # 음주 가능 나이

    def __init__(self, name, age, resident_id):
        """이름, 나이, 주민등록번호"""
        self.name = name
        self.__age = age
        self.__resident_id = resident_id
        
human1 = Citizen("김아무개", 35, "29384")

print(Citizen.name) #김아무개
print(Citizen.__resident_id) #error

외부에서 접근이 불가능하므로 내부에서 접근하는 메소드를 만들어 이끌어낼 수 있다.

 

2. 객체의 속성과 그것을 사용하는 행동을 하나로 묶는 것.

__변수는 그에 접근하는 통로를 메소드로 제한했으므로 속성과 행동을 하나로 묶은 것이다.

class Citizen:
    """주민 클래스"""
    drinking_age = 19 # 음주 가능 나이

    def __init__(self, name, age, resident_id):
        """이름, 나이, 주민등록번호"""
        self.name = name
        self.__age = age
        self.__resident_id = resident_id
        
   def get_age(self):
   		return self.__age
        
   def set_age(self, new_age):
       if 0 <= new_age:
           self.__age = new_age
        else:
            print("나이는 음수 값이 될 수 없습니다. 0으로 초기화 합니다.")
            self.__age = 0
        
human1 = Citizen("김아무개", 35, "29384")

print(human1.get_age()) #35

human1.set_age(38)
print(human1.get_age()) #38

캡슐화된 변수 값을 읽는 메소드를 getter 메소드라 하고

캡슐화된 변수 값을 설정하는 메소드를 setter 메소드라 한다.

*setter 메소드에서 값에 대한 제한을 넣는 것이 좋다.

 

*모든 정보를 getter와 setter 메소드를 설정하지 않는다. 위 예시에서 __resident_id와 같은 경우에는 민감한 정보이므로 사용하지 않는 것이다. 

def identify(self, value):
    if self.__resident_id == value:
        print("{}님 확인되었습니다.".format(self.name))
    else:
        print("주민등록번호가 일치하지 않습니다.")

위 예제와 같이 다른 메소드를 통해 사용이 가능한데, 이곳에서도 __resident_id 값은 여전히 캡슐화된 상태이다.

 

-> 변수에 간접할 수 있는 메소드는 getter / setter / 그 외 다른 메소드가 있는 것이다.