본문 바로가기
Python/파이썬 기초

클래스(class)와 어트리뷰트(attribute), 인스턴스(instance), 메서드(method) - 파이썬 기초(24)

by 콩돌 2019. 1. 3.
반응형

참고 자료

https://docs.python.org/ko/3/tutorial/classes.html



파이썬 버전 3.7 기준



파이썬에서의 클래스


본 포스팅에서 다루는 내용은 다음과 같다.

클래스(class), 어트리뷰트(attribute), 인스턴스(instance), 메서드(method) 등.



클래스(Class)

  ○ 클래스는 데이터와 기능(함수)을 묶어 놓은 객체이다.

    ▷ 특정 기능(함수)를 수행하는 것과 데이터를 저장하는 것을 이용하여 사용자가 원하는 기능을 하는 객체를 만들어 낼 수 있다.

  ○ 클래스는 객체지향 언어의 핵심 기능이라 할 수 있다.


클래스의 정의 및 클래스 객체

  ○ 클래스를 정의하는 형식은 다음과 같이 나와 있다.

    ▷ classname에는 사용자가 원하는 클래스의 이름을 적으면 되며 그 끝에는 반드시 콜론(:)을 배치시켜야 한다.

    ▷ 내용에는 함수, 변수, 각종 구문 등 사용자가 원하는 기능을 집어넣으면 된다.

    ▷ 클래스의 내용은 다른 구문들과 마찬가지로 들여쓰기(스페이스, 텝)로 구분이 되며, 4개의 스페이스를 사용하는 것이 권장된다.


클래스(class)의 기본 구성)

class classname :

    내용


  ○ 클래스 객체는 다음 두 종류의 연산이 가능하다.

    ▷ 어트리뷰트(attribute) 참조

      - 이 연산은 쉽게 설명하면 설명하는 클래스 내부의 변수나 함수에 접근하는 것을 의미한다.

      - 변수인 경우 "클래스이름.어트리뷰트이름"과 같은 형식으로 접근 가능하다.

      - 함수(메서드)인 경우 "클래스이름.어트리뷰트이름(입력)"과 같은 형식으로 접근 가능하다.

    ▷ 인스턴스(instance) 객체 생성

      - "인스턴스객체이름=클래스객체이름"으로 인스턴스객체를 생성할 수 있다. 


어트리뷰트 참조의 형식)

classname.variable

classname.function(input)


클래스 객체의 인스턴스 생성 형식)

x = classname()


※ 어트리뷰트(attribute)?

  - 어트리뷰트란 클래스 내부에 포함되어있는 함수(메서드)나 변수 등을 의미한다.


인스턴스(instance) 객체

  ○ 인스턴스란 클래스에 의해 만들어진 객체이다.

    ▷ 쉽게 설명하면 클래스의 클론이라고 생각하면 된다.

  ○ 인스턴스가 가능한 유일한 연산은 위에서 설명한 "어트리뷰트 참조"이다.

    ▷ 어트리뷰트중 단순히 변수에 해당하는 어트리뷰트를 불러오거나 바꾸는 참조가 가능하며,

    ▷ 어트리뷰트중 메서드에 해당하는 어트리뷰트를 불러와 메서드가 정의하는 기능을 수행하는 참조 역시 가능하다.


메서드(method) 객체

  ○ 객체에 포함되어있는 함수를 메서드라 칭한다.

    ▷ 즉, 클래스 객체에 포함되어 함수도 메서드이다.

  ○ 클래스에서의 메서드 객체는 사용자가 정의할 수 있는 객체가 있는 반면에, 몇 가지 특수한 역할을 하는 메서드도 존재한다.

    ▷ __init__( ) 이라는 특수한 메서드는 클래스의 초기 상태를 정의할 수 있는 메서드이다. 즉, 클래스가 처음 작동 혹은 인스턴스가 처음 만들어질 때, 작동하여 초기 상태를 설정할 수 있다.



간단한 클래스 작성과 사용 예제


예제 클래스의 작성

다음 예제는 위의 설명들을 종합하여 만든 간단한 클래스이다.


  ○ 클래스의 정의

    ▷ 먼저, class Exam:을 입력하여 Exam이라는 이름을 가지는 클래스를 정의하였다.


  ○ 닥스트링(Docstring)

    ▷ ''' ''' 닥스트링을 이용하여 함수와 마찬가지로 클래스의 설명을 적어 넣는 것이 가능하다.


  ○ 클래스의 변수 입력

    ▷ a는 클래스 객체와 인스턴스 객체가 동일한 값(주소)을 가지는 변수 객체이다.

    ▷ list1 역시 클래스 객채와 인스턴스 객체가 동일한 값(주소)을 가지는 빈 리스트이다.


  ○ 클래스의 메서드 정의

    ▷ __init__( ) 메서드를 통해 인스턴스 객체를 만들시 2개의 초기 값을 입력받아 인스턴스 객체 변수에 할당하도록 설정하였고, d라는 변수에는 5라는 초기값과, list2라는 빈 리스트를 가지도록 설정하였다.

    ▷ list_append_method() 라는 메서드를 정의하여 이 메서드를 실행하면 list1 및 list2에 각각의 값을 appped 하도록 설정하였다.


  ○ 메서드에서의 self의 의미

    ▷ 각 메서드의 처음 입력값은 self로 고정되어 있는데 이는 인스턴스를 받아 드린다는 의미이다. 

    ▷ 문법적으로는 self를 사용하지 않아도 무방하지만, 가독성 측면에서 self를 사용하는 것이 권장된다.


클래스 작성 예제)

class Exam:

    ''' An class example '''

    

    a = 'class global variable'

    list1 = []

    

    def __init__(self, input1, input2):

        ''' Initialize some variables'''

        self.b = input1

        self.c = input2

        self.d = 5

        self.list2 = []


    def list_append_method(self, v1, v2):

        ''' Two lists are appended '''

        self.list1.append(v1)

        self.list2.append(v2)



예제 클래스의 인스턴스 객체 생성 및 메서드 사용

상기 클래스를 실행하는 것으로 클래스의 작동과정을 설명하고자 한다.


  ○ 인스턴스 객체의 생성

    ▷ __init__( ) 메서드에서 2개의 변수를 입력 받는 것으로 정의했으므로 2개의 변수를 입력하였다.

       (총 3개지만 맨 앞 self는 자동으로 정의된 인스턴스를 받아드리기 때문에 따로 입력할 필요가 없다.)

    ▷ 몇 가지 비교를 위해 2개의 인스턴스를 작성하였다.


인스턴스 객체의 생성)

In[3]: x = Exam('x1','x2')

In[4]: y = Exam('y1','y2')


  ○ 생성된 변수의 비교 

    ▷ 다음 예제는 생성된 변수를 비교한 결과이다.

    ▷ 스크립트에서 제시하는 것과 같이 초기 입력값들이 잘 입력되었다.

    ▷ Exam.b,c,d는 생성이 안되어 있는데 그 이유는 클래스 객체는 __init__( ) 메서드가 작동하지 않았기 때문이다.이 변수를 불러오려고 시도할 시에 Attribute Error가 발생한다.


생성된 변수의 비교)

 작성 스크립트

 변수

 Exam

 x

 y

 In[5]: x.a

 Out[5]: 'class global variable'

 In[6]: x.b

 Out[6]: 'x1'

 In[7]: x.c

 Out[7]: 'x2'

 In[8]: x.d

 Out[8]: 5

 In[9]: y.a

 Out[9]: 'class global variable'

 In[10]: y.b

 Out[10]: 'y1'

 In[11]: y.c

 Out[11]: 'y2'

 In[12]: y.d

 Out[12]: 5

 In[13]: Exam.a

 Out[13]: 'class global variable'

 a

'class global variable'

 'class global variable'

 'class global variable'

 b

 -

 'x1'

'y1' 

 c

-

 'x2'

 'y2'

 d

 -

 5

 5


  ○ 클래스 객체의 변수와 인스턴스 변수 변경시 비교

    ▷ Exam.a와 x.b, y.c를 변경하였다.

    ▷ Exam.a를 변경했을 시에는 클래스 객체가 변경되었으므로, 이를 참조하던 x.a, y.a가 서로 따라서 변한 것을 확인할 수 있다.

    ▷ 반대로 x.b와 y.c를 변경했을 시에는 x와 y의 각각의 어트리뷰트에 영향을 미치지 않는 것을 확인할 수 있다.  


클래스 객체의 변수 및 인스턴스 변수 변경시 비교)

 작성 스크립트

 변수

 Exam

 x

 y

 In[14]: Exam.a = 'change'

 In[15]: x.b='x1_1'

 In[16]: y.c='y2_2'


 In[17]: x.a 

 Out[17]: 'change'

 In[18]: x.b

 Out[18]: 'x1_1'

 In[19]: x.c

 Out[19]: 'x2'

 In[20]: x.d

 Out[20]: 5

 In[21]: y.a

 Out[21]: 'change'

 In[22]: y.b

 Out[22]: 'y1'

 In[23]: y.c

 Out[23]: 'y2_2'

 In[24]: y.d

 Out[24]: 5

 a

'change'

'change'

'change'

 b

 -

 'x1_1'

'y1' 

 c

-

 'x2'

 'y2_2'

 d

 -

 5

 5


  ○ list_append_method 사용시 작성된 list1과 list2의 결과 비교 

    ▷ list_append_method를 사용하여 각각의 리스트에 값을 추가한 결과 다음과 같은 결과를 보여준다.

    ▷ 먼저 list1은 x나 y의 값이 동일한 결과를 보여주는데 이는 클래스 객체인 Exam의 list1을 서로 참조하기 때문이다.

    ▷ list2는 각각 서로 다른 값이 들어가 있는 것을 확인할 수 있다.


list_append_method 사용시 작성된 list1과 list2의 결과 비교)

In[25]: x.list_append_method(1,2)

In[26]: y.list_append_method(3,4)

In[27]: x.list1

Out[27]: [1, 3]

In[28]: x.list2

Out[28]: [2]

In[29]: y.list1

Out[29]: [1, 3]

In[30]: y.list2

Out[30]: [4]


※ a변수와 list1에 대한 고찰 및 주의사항

  - 두 변수는 클래스 내부에서 각각의 값이 정의되었고 x y 각 인스턴스의 a와 list1값은 클래스 객체의 값을 참조하기 때문에 클래스 객체의 변수를 변경할 시에 같이 변경이 된다.

    》 위의 예에는 보여주지 않았지만 만약 각 인스턴스의 a나 list1을 먼저 변경하면 더 이상 클래스 객체의 값을 참조하지 않으므로 클래스 값을 바꾸더라도 인스턴스의 a나 b 값이 변경되지 않는다.

  - 나머지 값들은 __init__( ) 메서드를 통해 생성이 되었으므로 각 변수들이 인스턴스 객체가 생성될 때 같이 생성되므로 값들의 참조가 다르기 때문에 서로 값이 변할 때 영향을 미치지 않는다.

  - 클래스를 설계할 경우에는 이런 특징을 잘 고려하여 설계하여야 한다.

반응형

댓글