본문 바로가기
C++ 200제/코딩 IT 정보

[파이썬 입문 클래스] 인스턴스, 메소드, 상속 등 예제 총정리

by vicddory 2019. 8. 20.

클래스 (class)

Python 클래스(class)는 다음 예제와 같이 정의합니다. 클래스 이름은 관습적으로 대문자로 시작합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass:
    """A simple example class""" # 따옴표 3개로 코멘트
 
    def __init__(self):          # 컨스트럭터 (생성자)
        self.name = ""
 
    def getName(self):           # getName() 메소드
        return self.name
 
    def setName(self, name):     # setName() 메소드
        self.name = name
 
= MyClass()                    # 클래스의 인스턴스 생성
a.setName("Tanaka")              # setName() 메서드 호출
print a.getName()                # getName() 메서드 호출
cs


파이썬 클래스 정의 시작 부분에는 """...""" 안에 도큐먼트 스트링(문서 문자열)을 작성할 수 있습니다. 


1
2
3
def MyClass:
    """A sample class"""
    (생략)
cs

클래스 변수, 인스턴스 변수(attribute)

클래스는 인스턴스 변수, 클래스 변수를 가질 수 있습니다. 인스턴스 변수는 "인스턴스 변수 이름"으로 표시되며, 인스턴스별로 독립적입니다. 생성자 __init __ (후술)에서 초기화하는 것이 좋습니다.


1
2
3
4
5
6
7
8
9
10
11
12
class MyClass:
    def __init__(self):
        self.name = ""  # 인스턴스 변수
 
a1 = MyClass()
a1.name = "류현진"
 
a2 = MyClass()
a2.name = "손흥민"
 
print a1.name            #=> 류현진
print a2.name            #=> 손흥민
cs


클래스 변수는 "클래스 이름, 변수 이름"으로 표시되고 모든 인스턴스에서 공유하는 변수입니다.


1
2
3
4
class MyClass:
    PI = 3.14        #=> 클래스 변수
 
print MyClass.PI     #=> 3.14
cs


다음은 파이썬 클래스 변수를 사용하여 인스턴스 변수 값을 변경하는 샘플 코드입니다.


1
2
3
4
5
6
7
8
9
class MyClass:
    count = 0               # 클래스 변수 초기화
 
    def __init__(self):
        MyClass.count += 1  # 클래스 변수 값 변경
 
a1 = MyClass()
a2 = MyClass()
print MyClass.count         #=> 2
cs


클래스 변수와 인스턴스 변수는 동적으로 추가할 수 있습니다.


1
2
3
4
5
6
class MyClass:
    pass
 
a1 = MyClass()
a1.name2 = "손흥민"      # 인스턴스 변수 추가
MyClass.PI2 = 3.141593  # 클래스 변수 추가
cs


인스턴스 변수가 존재하지 않으면 "인스턴스 변수 이름"은 클래스 변수를 참조한다는 점을 유의하세요. "인스턴스 변수 이름"에 값을 할당한 시점에서 인스턴스 변수가 생성되며, 이후에는 인스턴스 변수가 참조됩니다.


1
2
3
4
5
6
7
8
9
class MyClass:
    PI = 3.14
 
a1 = MyClass()
a2 = MyClass()
print a1.PI         # 클래스 변수 MyClass.PI(3.14)가 참조됨
a1.PI = 3.141593    # 인스턴스 변수 a1.PI가 생성됨
print a1.PI         # 인스턴스 변수 a1.PI(3.141593)가 참조됨
print a2.PI         # 클래스 변수 MyClass.PI(3.14)가 참조됨
cs


Python에서는 private, protected 등의 범위(스코프)를 제어하는 기능이 없어서, 클래스 변수, 인스턴스 변수는 어디서든(public) 참조할 수 있습니다.


개발자를 위한 프로그래밍 팁개발자를 위한 프로그래밍 팁

메소드 (method)

파이썬 클래스가 보유한 함수를 메소드라고 합니다. 메소드도 어디서든(public) 참조할 수 있습니다. 함수의 첫 번째 인수는 클래스의 인스턴스, 두 번째 인수 이후가 메소드의 인수입니다.


1
2
3
4
5
6
7
class MyClass:
    name = ""
    def setName(self, name): # 첫 번째 인수는 자동 인스턴스 (self)
        self.name = name
 
= MyClass()
a.setName("류현진")
cs


액세스 제한 (_, __) (접근 제한)

Python에서는 private, protected와 같은 액세스(접근) 한정자는 지원되지 않습니다. 밑줄 언더바( _ )로 시작하는 변수와 함수는 외부에서 참조하지 않는다는 보편적인 규칙이 있습니다. 밑줄 2개( __ )로 시작하는 변수 및 함수는 참조가 제한됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyClass:
    def __init__(self):
        self.name = "tanaka"
        self._name = "yamada"
        self.__name = "suzuki"
 
    def hello(self): print 'hello'
    def _hello(self): print 'hello'
    def __hello(self): print 'hello'
 
= MyClass()
 
print a.name        # 참조 가능
print a._name       # 참조 가능. 관습적으로 참조하지 않음
# print a.__name    # 참조 불가 (AttributeError 예외)
 
a.hello()           # 참조 가능
a._hello()          # 참조 가능. 관습적으로 참조하지 않음
# a.__hello()       # 참조 불가 (AttributeError 예외)
cs


그래도 __로 시작하는 변수나 함수도 ,_ 클래스 이름 __ 변수 이름으로 변환 될 뿐, 아래 예제와 같은 방법으로 접근(액세스)할 수 있습니다.


1
2
print a._MyClass__name
a._MyClass__hello()
cs

생성자(__init__)

__init__() 메서드는 클래스의 인스턴스가 생성될 때 호출됩니다. 생성자, 컨스트럭터, Constructor라고 합니다.


1
2
3
4
5
6
7
8
class MyClass:
    def __init__(self, name):
        self.name = name
    def getName(self):
        return self.name
 
= MyClass("류현진")
print a.getName()          #=> 류현진
cs


소멸자(__del__)

__del __() 메서드는 파이썬 클래스의 인스턴스가 소멸될 때 호출됩니다. 소멸자, 디스트럭터, Destructor라고 합니다.


1
2
3
4
5
6
7
8
class MyClass:
    def __init__(self):
        print "INIT!"
    def __del__(self):
        print "DEL!"
 
= MyClass()       #=> INIT!
del a               #=> DEL!
cs


문자열 화 (__str__)

__str__()는 인스턴스를 암시적으로 문자열로 변환할 때, 해당 변환 프로세스를 정의합니다.


1
2
3
4
5
6
7
8
9
class MyClass:
    def __init__(self, name):
        self.name = name
 
    def __str__(self):
        return "My name is " + self.name
 
= MyClass("손흥민")
print a                #=> My name is 손흥민
cs


개발자를 위한 프로그래밍 팁개발자를 위한 프로그래밍 팁


상속 (inheritance)

다른 객체지향 언어와 마찬가지로 클래스를 상속할 수 있습니다. 아래 예제에서는 MyClass 클래스를 상속한 MyClass2 서브 클래스를 정의합니다. 파이썬 서브 클래스는 부모 클래스가 가지는 속성과 메소드를 상속하여 이용할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
class MyClass:
    def hello(self):
        print "우리형은"
 
class MyClass2(MyClass):
    def world(self):
        print "메시다"
 
= MyClass2()
a.hello()           #=> 우리형은
a.world()           #=> 
cs


서브 클래스는 부모 클래스의 메서드를 재정의(오버라이드, 오버라이딩) 할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
class MyClass:
    def hello(self):
        print "베리굿 조현"
 
class MyClass2(MyClass):
    def hello(self):    # 부모 클래스의 hello() 메소드를 오버라이드(override)
        print "트와이스 지효"
 
= MyClass2()
a.hello()               #=> HELLO
cs


부모 클래스 (super ())

super()는 부모 클래스를 참조하는 것입니다. 첫 번째 인수에는 클래스, 두 번째 인수에는 인스턴스를 지정합니다. 아래 예제에서는 서브 클래스의 생성자에서 부모 클래스의 생성자를 호출합니다.


1
2
3
4
5
6
7
8
9
10
11
12
class MyClass1(object):
    def __init__(self):
       self.val1 = 123
 
class MyClass2(MyClass1):
    def __init__(self):
        super(MyClass2, self).__init__()
        self.val2 = 456
 
= MyClass2()
print a.val1                #=> 123
print a.val2                #=> 456
cs

다중 상속

Python은 다중 상속을 지원합니다. 아래 예제에는 MyClassA, MyClassB 모두 상속하는 MyClassC을 정의합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyClassA:
    def funcA(self):
        print "MyClassA:funcA"
 
class MyClassB:
    def funcB(self):
        print "MyClassB:funcB"
 
class MyClassC(MyClassA, MyClassB):
    pass
 
= MyClassC()
a.funcA()        # MyClassA 메소드도
a.funcB()        # MyClassB 메소드도 사용 가능
cs


클래스 계층 구조

Python 클래스는 모두 object를 루트로 하는 클래스 계층 구조로 구성되어 있습니다.


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
object
 +- int
 |   +- bool
 +- long
 +- float
 +- complex
 +- basestring
 |   +- str
 |   +- unicode
 +- list
 +- tuple
 +- dict
 +- file
 +- BaseException
     +- SystemExit
     +- KeyboardInterrupt
     +- GeneratorExit
     +- Exception
         +- StopIteration
         +- StandardError
         |   +- BufferError
         |   +- ArithmeticError
         |   |   +- FloatingPointError
         |   |   +- OverflowError
         |   |   +- ZeroDivisionError
         |   +- AssertionError
         |   +- AttributeError
         |   +- EnvironmentError
         |   |   +- IOError
         |   |   +- OSError
         |   |       +- WindowsError (Windows)
         |   |       +- VMSError (VMS)
         |   +- EOFError
         |   +- ImportError
         |   +- LookupError
         |   |   +- IndexError
         |   |   +- KeyError
         |   +- MemoryError
         |   +- NameError
         |   |   +- UnboundLocalError
         |   +- ReferenceError
         |   +- RuntimeError
         |   |   +- NotImplementedError
         |   +- SyntaxError
         |   |   +- IndentationError
         |   |       +- TabError
         |   +- SystemError
         |   +- TypeError
         |   +- ValueError
         |       +- UnicodeError
         |           +- UnicodeDecodeError
         |           +- UnicodeEncodeError
         |           +- UnicodeTranslateError
         +- Warning
             +- DeprecationWarning
             +- PendingDeprecationWarning
             +- RuntimeWarning
             +- SyntaxWarning
             +- UserWarning
             +- FutureWarning
             +- ImportWarning
             +- UnicodeWarning
             +- BytesWarning
cs




파이썬 입문 강좌 11강


관련 글

[파이썬 입문] 클래스 사용법 - 4단계로 마스터

[파이썬 프로그래밍 함수] def, global, lambda, iterator, yield @ 사용 방법

[파이썬 입문] 구문 - 문법, 주석, 들여쓰기, 인코딩 규칙

[파이썬 입문] 제어문 - if else while for in break continue

[파이썬 입문] 리스트 튜플 딕셔너리 (List, Tuple, dict)

[파이썬 입문] 자료형 문자열 각종 수식 정리

댓글