python

[python] 파이썬 클래스

vhxpffltm 2019. 8. 13. 23:04

파이썬 클래스

클래스... 대부분의 언어를 하면서 객체 지향 언어와 함께 들어보고 사용해 봤을 것이다. 

파이썬은 모든 것이 객체이며 클래스 역시 파이썬에서는 하나의 객체이다.

 

다음의 코드를 통해 클래스란 타입을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
'''
파이썬은 모든것이 객체이다, 클래스 역시 파이썬에서 하나의 객체이다.
str이라는 클래스는 type 클래스의 객체이다.
클래스에서 생성된 객체를 인스턴스라 한다.
'''
= 'hello world'
print(type(s))
print(type(str))
print(s.__class__) # 어떤 클래스(타입)에 의해 생성되었는지 담고 있는 지역변수 : __class__
print(s.replace('hel','yol'))
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

위와 같은 타입 결과를 얻을 수 있다. 부가 설명은 주석으로 처리하였다.

 

클래스 정의 및 재정의, 클래스변수, 은닉과 이름장식

C++ 과 비슷하다고 생각하면 된다. 변수명에 클래스의 이름으로 인스턴스를 생성하고 속성값고 메서드를 호출한다. 클래스를 정의하는 방법은 코드를 보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class book:
    name = str()
    var2 = '클래스변수'
    __var = '한국' # 클래스 변수, __하면 기존 변수명으로 확인 불가 : 접근제한
    def __init__(self,name): #초기화 함수 재정의
        self.name = name
    def read(self): #self는 첫번째 매개변수 선언해야 함
        print(self.name + ' is mine')
    def gettt(self):
        return self.__var
    def settt(self,var):
        self.__var = var  #접근제한의 값을 변경하고 반환한함
 
= book('delvert'#인스턴스 생성,  인자값(name때문)을 넣고 인스턴스 생성하기
r.name = '철수'
r.read() #메서드 호툴
# 클래스 생성 : C++과 유사함
 
print(r.var2) # 클래스 변수 값 확인
#클래스에 의해 생성된 모든 객체에서 같은 값을 조회할 때 사용가능
#name은 __init() 함수내에서 사용, 객체가 인스턴스화 될 때마다 새로운 값이 할당되며 서로다른 객체간 값을 공유 못함
 
 
 
ia = book('한쿡')
ia.settt('Tistory')
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

주의할점만 보자,

클래스의 맴버함수에는 항상 'self'가 있어야한다. 이 self를 통해 속성을 호출해야한다.

 

__init__() 는 초기화 함수 재정의이다. 이것을 사용하면 인스턴스 생성시 반드시 이름을 인자값으로 넣어야한다. 두 번째 인자인 name은 객체 인스턴스 생성시에 인자 값을 위한 매개변수이다. 

 

클래스변수는 클래스안에서 정의한 변수이다. 보통 클래스에 의해 생성된 모든 객체에서 같은 값을 조회할 때 사용한다. 이와 함께 인스턴스 변수와 차이가 있으나 여기서 깊게 다루지는 않겠다. 주석을 참고하자.

 

클래스에서 정보 은닉은 파이썬에서 이름 장식으로 표현한다. 클래스변수에 '__변수명' 로 클래스를 정의할 때 사용하던 변수명으로는 접근할 수 없다. 그래서 gettt(), settt() 메서드를 통해 값을 변경하고 반환할 수 있다.  

 

코드의 결과는 아래와 같다.

 

 

 클래스 상속

클래스하면 상속과 다형성을 뺴놓을 수 없다. C++에서는 이를 위해 가상함수의 개념이 필요하지만 파이썬에서는 어떤 것이 필요한지 알아보자.

 

우선 상속은 중복 코드를 최소화 함과 클래스간의 계층 관계 파악이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class parent:
    nation = '나라'
    def __init__(self,name):
        self.name = name
    def chk(self):
        print(self.name + ' 부모에서 나라 확인 완료')
 
class child1(parent): #부모의 자식 클래스를 선언
    #nation = '한쿡'  # 클래스 변수
    #def __init__(self,name): #초기화 삼수 재정의
    def f(self):
        print(self.name + 'is my 국가')
 
class child2(parent): #부모의 자식 클래스를 선언
    #nation = '영국'
    #def __init__(self,name):
    #    self.name = name
    def f2(self):
        print(self.name + '다른나라')
= child1('한국'# child1 인스턴스 생성(부모 init 활용)
print(m.nation)
print(m.f())
 
m2 = child2('영국은 '#child2 인스턴스 생성
print(m2.f2())
 
print(m.chk())
print(m2.chk())
 

 

크게 어려운 내용은 없다. 마지막에서 자식 클래스의 인스턴스로 부모 클래스의 변수와 맴버함수를 확인한다면 크게  이해하는데 어렵지는 않을 것이다. 즉, print(m.nation)을 실행하면 알 것이다.

 

__class__ 로 타입 확인 가능!! __base__로 부모 클래스 확인 가능하다.
부모클래스가 2개이면 (부모 클래스이름, 부모클래스이름2) 로 적용가능하다.

 

상속을 하는 방법은 위의 코드와 같이 class '자식클래스이름'(부모클래스) 의 형태이다. 

 

실행결과는 아래와 같다.

 

클래스 다형성

다형성은 부모 클래스와 동일한 이름의 메소드를 그대로 자식 클래스에서 구현하여 재정의하는 것이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#다형성
class dev:
    def __init__(self, name):
        self.name = name
    def coding(self):
        print(self.name + ' 개발자입니다.')
 
class python(dev):
    def coding(self):
        print(self.name + ' 파이썬')
class cpp(dev):
    def coding(self):
        print(self.name + ' c++')
class js(dev):
    def coding(self):
        super().coding()
        print(self.name + ' javascript')
pb = python('a는')
cb = cpp('b는')
jb = js('c는')
#부모 클래스와 동일한 이름의 메서드를 그대로 자식 클래스에서 구현하여 재정의 하는것을 다형성이라 한다.
#super() 를 통해 부모 인스턴스를 확보하여 부모의 메서드를 호출할 수 있다.
 

 

코드를 보면 맴버함수 coding이 모두 이름이 같다. 위 코드의 결고가 어떤지는 금방 알 수 있을 것이다.