반원 블로그

01c. 클래스의 Setter, Getter 본문

2018~/파이썬 자료구조 알고리즘

01c. 클래스의 Setter, Getter

반원_SemiCircle 2019. 4. 20. 03:27

메소드 Setter, Getter

Setter는 값을 수정하는, Getter는 값을 조회하는 메소드를 말합니다.

클래스로 만든 인스턴스의 속성을 변경하거나 조회 및 삭제를 하려면 메소드를 거치게끔 설계해야합니다. 이는 캡슐화(Encapsulation)와 은닉화(Hidden) 때문인데, 핵심은 "인스턴스 변수를 직접 접근 및 수정을 막고 반드시 메소드를 거치도록하여 클래스 내부의 변수명을 숨기고 데이터 변조 위험성을 낮춘다"입니다.

앞에서 작성했던 코드에서 굳이 메소드를 이용하여 값을 조회하고 수정한 것입니다.

##메소드 사용하여 인스턴스 활용
#1.현재 이름과 키 정보 조회
print("현재 {}의 키는 {}cm 입니다.".format(c1.getName(), c1.getHeight()))
print("현재 {}의 키는 {}cm 입니다.".format(c2.getName(), c2.getHeight()))

#2.키를 성장
c1.growHeight(10) #growHeight 메소드의 매개변수 add값을 10 넣어준다.
c2.growHeight(30) #growHeight 메소드의 매개변수 add값을 10 넣어준다.

클래스 속성과 메소드에 대한 기본 접근 설정

파이썬에서는 다른 프로그래밍 언어와는 다르게 접근지정자(public, private 등)가 없습니다. 파이썬은 기본적으로 인스턴스의 속성에 직접 접근을 허용합니다.

아래 예제는 직접 접근하여 인스턴스 변수 값을 수정하는 방법이며, 우리는 이처럼 직접접근이 수행되지 않도록 다음 목차에서 은닉화를 해보고자 합니다.

막아야될 접근 방법

#03ClassExUseF.py
##상황 : 자라는 아이들의 키를 관리하는 요정의 프로그램
class Child:
    #클래스 생성자 정의
    def __init__(self, Child_name, Child_height):
        self.name = Child_name
        self.height = Child_height

    #필요한 메소드 구현
    def getName(self):
        return self.name #이름 정보를 반환

    def getHeight(self):
        return self.height #키 정보를 반환

    def growHeight(self, add):
        temp=self.height #임시 지역변수. 성장전 키값 저장
        self.height += add
        print("성장했습니다.{}->{}".format(temp,self.height)) #성장결과 출력


##메인 코드 영역

#어린이 인스턴스 2개 생성
c1 = Child('Tom',150) #Child_name과 Child_height이 'Tom',150인 어린이 정보를 생성

##메소드 사용하여 인스턴스 활용
#1.현재 이름과 키 정보 조회
print("현재 {}의 키는 {}cm 입니다.".format(c1.getName(), c1.getHeight()))

#2.키를 성장
#c1.growHeight(10) #growHeight 메소드의 매개변수 add값을 10 넣어준다.
c1.height+=10 #키를 증가 시킨다. ->변수에 직접 접근이 허용되있다.

#3.현재 이름과 키 정보 조회
print("현재 {}의 키는 {}cm 입니다.".format(c1.getName(), c1.getHeight()))

출력결과

현재 Tom의 키는 150cm 입니다.
현재 Tom의 키는 160cm 입니다.

###은닉화
클래스에서 사용하는 속성 또는 메소드 앞에 _(언더바 2개)를 붙이면 외부에서 접근하여 사용할 수 없습니다. 비슷한 예로 클래스 생성자 메소드(_init)이 있습니다. 이렇게 하면 속성에 직접 접근할 시 에러가 발생합니다. 공개가 안되있으니 없는 속성이라는 메시지가 나옵니다.

#04ClassExUseT.py
##상황 : 자라는 아이들의 키를 관리하는 요정의 프로그램
class Child:
    #클래스 생성자 정의
    def __init__(self, Child_name, Child_height):
        self.__name = Child_name
        self.__height = Child_height

    #필요한 메소드 구현
    def getName(self):
        return self.__name #이름 정보를 반환

    def getHeight(self):
        return self.__height #키 정보를 반환

    def growHeight(self, add):
        temp=self.__height #임시 지역변수. 성장전 키값 저장
        self.__height += add
        print("성장했습니다.{}->{}".format(temp,self.__height)) #성장결과 출력

##메인 코드 영역

#어린이 인스턴스 2개 생성
c1 = Child('Tom',150) #Child_name과 Child_height이 'Tom',150인 어린이 정보를 생성

##메소드 사용하여 인스턴스 활용
#1.현재 이름과 키 정보 조회
print("현재 {}의 키는 {}cm 입니다.".format(c1.getName(), c1.getHeight()))

#2.키를 성장
#c1.growHeight(10) #growHeight 메소드의 매개변수 add값을 10 넣어준다.
c1.__height+=10 #키를 증가 시킨다.

#3.현재 이름과 키 정보 조회
print("현재 {}의 키는 {}cm 입니다.".format(c1.getName(), c1.getHeight()))

출력결과

현재 Tom의 키는 150cm 입니다.
  File "파일경로/04ClassExUseT.py", line 32, in <module>
    c1.__height+=10 #키를 증가 시킨다.
AttributeError: 'Child' object has no attribute '__height'

위키독스 연재 : https://wikidocs.net/book/2868

Comments