본문 바로가기
Computer & Program/python

[python] class(클래스) - 01

by TDRemon 2024. 2. 24.
반응형

안녕하세요. TDR입니다.

이번에는 python에서 class를 어떻게 선언하고 어떤 식으로 사용하는지 간략히 정리해 보겠습니다.

Default format

class SomeClass:
    # 생성자
    def __init__(self):
        pass
    
    def set_fruits(self, fruits):
       self.fruits = fruits
       
    def get_fruits(self):
       return self.fruits
    
    def set_count(self, count):
        self.count = count
    
    def get_count(self):
       return self.count
       
class_obj = SomeClass()
class_obj.set_fruits('apple')
class_obj.set_count(10)
print(class_obj.get_fruits())  # apple
print(class_obj.get_count())  # 10
class_obj.fruits = 'banana'
class_obj.count = 20
print(class_obj.get_fruits())  # banana
print(class_obj.get_count())  # 20
class_obj.color = 'red'
print(class_obj.color)  # red

class 이름은 관례적으로 대문자로 시작하고 단어 연결도 대문자로 합니다.

그리고 생성자 함수인 __init__(self) 를 보면 매개변수로 self를 받고 있습니다. 다른 함수들도 모두 첫번째 매개변수로 self가 있는 것을 볼 수 있는데, 이를 통해 class 내의 attribute나 method에 접근이 가능합니다.

fruites와 count라는 get/set 함수를 볼 수 있습니다. 이를 통해 class 내부의 attribute의 값을 주입하고 있습니다. 하지만 바로 다음 줄에 함수가 아닌 직접 attribute에 접근해서 값을 넣고 빼는 것을 볼 수 있습니다. 이는 python의 class의 attribute가 기본적으로 모두 public임을 의미합니다.

그리고 마지가 2줄을 보면 class instance에 직접 color라는 attribute를 생성 및 접근을 하는 것을 볼 수 있습니다. 이러면 class를 만든 사람이 의도하지 않은 형태로 쓰일 수 있어서 바람직하지 않습니다.

다음 예제에서 private 접근제한자 사용 방법과 사용자가 임의로 attribute를 생성하지 못하게 하는 방법을 봐보겠습니다.

Private & __slots

class SomeClass:
    __slots__ = ['__fruits', '__count']
    
    # 생성자
    def __init__(self):
        pass
    
    def set_fruits(self, fruits):
       self.__fruits = fruits
       
    def get_fruits(self):
       return self.__fruits
    
    def set_count(self, count):
        self.__count = count
    
    def get_count(self):
       return self.__count
       
class_obj = SomeClass()
class_obj.set_fruits('apple')
class_obj.set_count(10)
print(class_obj.get_fruits())  # apple
print(class_obj.get_count())  # 10

# AttributeError
class_obj.fruits = 'banana'
class_obj.count = 20
print(class_obj.get_fruits())
print(class_obj.get_count())

# AttributeError
class_obj.color = 'red'
print(class_obj.color)

바뀐 점은 변수 이름 앞에 __가 붙은 것과 __slots__ 변수가 추가된 점입니다. 

먼저 변수 이름 앞에 __를 붙임으로서 해당 attribute를 private으로 선언할 수 있습니다. 그래서 이제는 class_obj.fruits와 같이 직접 접근이 불가합니다.

__slots__은 사용할 attribute를 미리 선언해 줌으로서 class 사용자가 임의로 attribute를 생성하는 것을 막을 수 있습니다. 즉, class 작성자가 의도한 대로만 사용하도록 강제할 수 있습니다. 참고로, ['__fruits', '__count']와 같이 list 형태로 작성하였지만 ('__fruits', '__count')와 같이 tuple 형태로 작성하는 것도 가능합니다.

다음에는 비공개 메소드, 정적 메소드, 클래스 메소드에 대해서 알아 보겠습니다.

 

[python] class(클래스) - 02

안녕하세요. TDR입니다. 오늘은 1부에 이어 비공개, 정적 , 클래스 메소드에 대해서 간략히 정리해 보겠습니다. https://tdremon.tistory.com/entry/python-class-01 Private method(비공개 메소드) class SomeClass: def __i

tdremon.tistory.com

 

 

[python] class(클래스) - 03

안녕하세요. TDR입니다. 2부에 이서 클래스 상속, 추상 클래스에 대해서 간략히 정리해 보겠습니다. https://tdremon.tistory.com/entry/python-class-01 https://tdremon.tistory.com/entry/python-class-02 Class inheritance(클래

tdremon.tistory.com

 

반응형

'Computer & Program > python' 카테고리의 다른 글

[python] class(클래스) - 03  (0) 2024.02.26
[python] class(클래스) - 02  (1) 2024.02.25
[python] 지역변수 & 전역변수  (0) 2024.02.23
[python] function(함수) - 02  (0) 2024.02.22
[python] function (함수) - 01  (1) 2024.02.21

댓글