[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()
In [72]:
# Person 클래스에 의해 정의된 객체는, name과 age를 변수로 갖을 수 있다.
# 다만, age의 경우 값을 받지 못하면 None이 할당된다는 것에 주의
print(Juhee.name)
print(Juhee.age)
In [73]:
# 다른 객체도 생성하자.
Alice = Person('앨리스')
Alice.introduce()
In [74]:
print(Alice.name)
print(Alice.age)
In [75]:
# 앨리스와 주희의 객체 주소 비교
# 동일한 클래스에 의해 정의되었지만, 별개의 객체이므로 주소값이 다르다.
print(id(Juhee))
print(id(Alice))
<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 내장함수
In [79]:
# B는 선생님
B = Teacher('B', 29) # 객체 생성
B.introduce() # 자기소개(Person 내장함수)
B.work(2) # Teacher 내장함수
In [80]:
# A는 학생이기 때문에, Teacher 클래스의 work 함수를 사용할 수 없다.
A.work(2)
In [81]:
# B의 경우도 마찬가지. Student 클래스의 study 함수를 사용할 수 없다.
B.study('국어')
introduce() 함수는 Person 클래스로부터 상속받았기 때문에
A(=학생), B(=선생님)둘다 사용할 수 있다.
하지만 study, teach 함수는 각자 개별적으로 정의한 함수이기 때문에
위의 예제처럼 정상 작동하지 않는다.
'Python > 내장함수&기타' 카테고리의 다른 글
[Python/내장함수] zip함수와 *args, **kwargs 란? (0) | 2020.04.19 |
---|---|
[Python/내장함수] lambda, map, filter, reduce 함수 사용법 (0) | 2020.04.19 |
[Python/기타] 알고리즘(set을 이용한) 시간초과에 도움이 되는 팁 (0) | 2020.03.14 |
[Python/기타] 파이썬 시간 복잡도(Time Complexity) (0) | 2020.02.26 |
[Python/내장함수] 예외 처리하기 (try / except문) (0) | 2020.01.03 |