Python/내장함수&기타

[Python/내장함수] 클래스(=Class) 기본 사용 방법

클래스

[Python/내장함수] 클래스(=class)란?

class : 함수 + 변수 모아놓은 것  
오브젝트(object) : 클래스를 써서 만든 것
오브젝트(object) == 인스턴스(instance)

클래스를 정의한 후, 그 클래스를 사용해서 데이터 객체(인스턴스)를 만들 수 있다.
동일한 클래스에 의해 만들어진 각 개체들은 유사한 특징을 공유한다.
모든 인스턴스에서 메서드(=코드)는 동일하지만, 속성(데이터)는 다르다.

* 메서드 : 코드
* 속성 : 데이터
* 인스턴스 : 클래스에 의해 만들어진 데이터 객체

<클래스 정의하기>

* 모든 클래스는 __init__()이라는 특별한 함수를 갖고 있다.
* __init__()함수를 이용해서 객체의 처음상태를 직접 정의할 수 있다.
In [69]:
# Person 클래스를 정의하자

'''
<설명>
* Person 클래스는 name, age를 인수로 받을 수 있다.
* introduce 함수를 실행할 경우, 먼저 이름 소개를 하고, 
  나이 정보가 있다면 나이에 대해서도 소개를 한다.
'''
class Person:
    def __init__(self, name, age = None):
        self.name = name
        self.age = age
    
    def introduce(self):
        print('안녕! 내 이름은 ' + self.name + '이야')
        # 나이 정보가 있다면
        if self.age:
            print('나는 ' + str(self.age) + '살 이야')

<클래스 객체 만들기>

In [70]:
# 객체 생성
Juhee = Person('주희', 27)
In [71]:
# 객체에 정의되어 있는 함수 사용
Juhee.introduce()
안녕! 내 이름은 주희이야
나는 27살 이야
In [72]:
# Person 클래스에 의해 정의된 객체는, name과 age를 변수로 갖을 수 있다.
# 다만, age의 경우 값을 받지 못하면 None이 할당된다는 것에 주의
print(Juhee.name)
print(Juhee.age)
주희
27
In [73]:
# 다른 객체도 생성하자.
Alice = Person('앨리스')
Alice.introduce()
안녕! 내 이름은 앨리스이야
In [74]:
print(Alice.name)
print(Alice.age)
앨리스
None
In [75]:
# 앨리스와 주희의 객체 주소 비교
# 동일한 클래스에 의해 정의되었지만, 별개의 객체이므로 주소값이 다르다.
print(id(Juhee))
print(id(Alice))
2553110240672
2553109865920

<self의 중요성>

클래스를 정의한다는 것은, 사실상 사용자 정의 팩토리 함수를 정의하는 것과 같다.

* 1. juhee = Person('주희', 27)
타깃 식별자 (juhee)가 객체에 대한 포인터가 된다.

* 2. Person.__init__(juhee)
1번을 실행하면, self자리에 새로 만든 객체를 갈키는 타깃 식별자(juhee)가
대신 들어가게 된다.

* self 인자는 어떤 객체의 데이터를 처리해야 하는지 알 수 있게 해준다.  
self는 아주 중요한 인자이다.
self가 없다면 파이썬은 함수 호출을 어떤 객체에 적용해주어야 할지 알 수 없기 때문이다.

* 모든 메서드(=함수)의 첫 번째 인자는 self이다.
__init__() 함수 뿐만 아니라, 클래스에 정의되어 있는 모든 함수들이 self를 첫번째 인자로 필요로 한다.

<class를 상속시키기>

* 객체 지향 언어를 배울 때, 부모 클래스와 자식 클래스를 정의하는 법을 한번쯤 들어본 적 있을 것이다.

* Person 클래스를 상속받는 자식 클래스를 여러개 만들어보자.
ex) 선생님 클래스, 학생 클래스

* 자식 클래스는 부모 클래스의 특징을 물려받는다.
In [76]:
# 학생 클래스
'''
자식 class를 만들 때, 다음과 같이 하면 된다.
class Student(상속 받고자 하는 부모 클래스)
'''
class Student(Person):
    def study(self, subject):
        print('나는 오늘 ' + subject + '을(를) 공부할거야.')
In [77]:
# 선생님 클래스
class Teacher(Person):
    def work(self, time):
        print('퇴근까지 ' + str(time) + '시간 남았다.')
In [78]:
# A는 학생
A = Student('A', 10) # 객체 생성
A.introduce()        # 자기소개(Person 내장함수)
A.study('수학')      # Student 내장함수
안녕! 내 이름은 A이야
나는 10살 이야
나는 오늘 수학을(를) 공부할거야.
In [79]:
# B는 선생님
B = Teacher('B', 29) # 객체 생성
B.introduce()        # 자기소개(Person 내장함수)
B.work(2)            # Teacher 내장함수
안녕! 내 이름은 B이야
나는 29살 이야
퇴근까지 2시간 남았다.
In [80]:
# A는 학생이기 때문에, Teacher 클래스의 work 함수를 사용할 수 없다.
A.work(2)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-80-5cd0719d3608> in <module>
      1 # A는 학생이기 때문에, Teacher 클래스의 work 함수를 사용할 수 없다.
----> 2 A.work(2)

AttributeError: 'Student' object has no attribute 'work'
In [81]:
# B의 경우도 마찬가지. Student 클래스의 study 함수를 사용할 수 없다.
B.study('국어')
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-81-a0072a37d09a> in <module>
      1 # B의 경우도 마찬가지. Student 클래스의 study 함수를 사용할 수 없다.
----> 2 B.study('국어')

AttributeError: 'Teacher' object has no attribute 'study'
introduce() 함수는 Person 클래스로부터 상속받았기 때문에
A(=학생), B(=선생님)둘다 사용할 수 있다.

하지만 study, teach 함수는 각자 개별적으로 정의한 함수이기 때문에
위의 예제처럼 정상 작동하지 않는다.