# 접근 제어

class Cls1 :
    def sef_data1(self, val1, val2): # 지정하고자하는 외부의 값에 설정할 수 있다. #프로퍼티값을 입력받아 사용할 수 있다.
        self.val1 = val1
        self.val2 = val2

    def get_data1(self):
        print(self.val1) # 인스턴스에 있는 val1
        print(self.val2) # 인스턴스에 있는 val2


ins1 = Cls1()
ins1.sef_data1(10, "abc") # 외부에서 self에 접근할 수는 없다. val1 과 val2만 접근해서 쓰면 된다.
ins1.get_data1()  # 인스턴스에 프로퍼티값이 들어간다.

print("--------------------------------------------------------")

class Cls2 :
    def set_data2(self, val1, val2):
        self.val1 = val1
        self.val2 = val2

# 메서드로 접근할 필요 없는 방식 ; 하지만 실무에서는 사용 못한다 ;
ins2 = Cls2()
ins2.set_data2(100, "aaaaa")
print(ins2.val1) # 필드로 접근 가능   instance.property
print(ins2.val2) # 필드로 접근 가능

ins2.val2 = "cccc"
print(ins2.val2)

# 그러면 메서드는 왜 쓰냐? ;
# 무결성, 원자성이 깨진다. ;
# 만약 외부에서 프로퍼티값을 수정할 때는 어떠한 조건을 거쳐야한다.
# 어떻게 제어할까 ? ;

 

 

# 접근 제어

class Cls1:
    def set_data1(self,val1,val2,val3):
        self.val1 = val1
        self._val1 = val1
        self.__val2 = val2
        self.__val3__ = val3

    def __get_print1(self):
        print("이것은 비공개 메서드 입니다.")

    def __get_print2__(self): # 되더라도 이렇게 메서드를 선언하면 안됨. # 내가 제어하는 건지 파이선이 제어하는 건지 구분이 안됨.
        print("이것은 공용 메서드 입니다.")



# 1
ins1 = Cls1()
ins1.set_data1(10,20, 30)
print(ins1._val1) # _ 는 접근 경고가 뜬다. ;
print()
# print(ins1.__val2) # __ 는 에러가 발생 ; 강제성을 띈다 ; 프로퍼티값 비공개 속성 ; 해당 클래스 내에서만 접근이 가능하다. 외부에서의 접근을 막는다 ; 메서드로만 접근이 가능하다
print(ins1.__val3__) # __의 예외 ; 접근 가능 ; 공용으로 사용하는 레퍼런스로 인식한다.

#2
# ins1.__get_print1() # 에러 발생 ; __  메서드 또한 비공개 가능하다. ; 비공개 메서드
ins1.__get_print2__() # 되더라도 이렇게 메서드를 선언하면 안됨.

 

'언어 > Python' 카테고리의 다른 글

[Python] del 예제  (0) 2023.09.21
[Python] init 예제  (0) 2023.09.21
[Python] 클래스 - self  (0) 2023.09.21
[Python] 클래스 예제  (0) 2023.09.21
[python] 사용자 정의 함수  (0) 2023.09.20

+ Recent posts