참고 자료
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__( ) 메서드를 통해 생성이 되었으므로 각 변수들이 인스턴스 객체가 생성될 때 같이 생성되므로 값들의 참조가 다르기 때문에 서로 값이 변할 때 영향을 미치지 않는다.
- 클래스를 설계할 경우에는 이런 특징을 잘 고려하여 설계하여야 한다.
'Python > 파이썬 기초' 카테고리의 다른 글
에러(error)와 예외(exception) - 파이썬 기초(26) (0) | 2019.01.09 |
---|---|
클래스(class)의 상속(inheritance)과 비공개변수 - 파이썬 기초(25) (0) | 2019.01.08 |
파일 읽기(read), 쓰기(write), with구문- 파이썬 기초(23) (0) | 2019.01.01 |
모듈(module)과 패키지(package), import - 파이썬 기초(22) (0) | 2018.12.29 |
리스트 컴프리헨션 - 파이썬 기초(21) (0) | 2018.12.28 |
댓글