참고 서적
컴퓨팅 사고를 위한 파이썬
|
객체(Object)와 클래스(Class)
클래스는 객체의 기본 틀이 되는 속성이다.
예를 들어서 마커 펜을 생산하는 공장이 있다고 하자, 마커 펜을 만들어내는 공장의 기계를 클래스라고 하고 각각 다른 색 잉크와 다른 색 커버가 있는 각각이 마커펜을 객체라고 할 수 있다.
class seal: #클래스 정의
pass
stamp = seal() #인스턴스 = 클래스명()
여기서 stamp의 타입을 알아보자.
>>> type(stamp)
<class'__main__.seal'>
'__main__.seal' 임을 확인할 수 있다. 이 타입은 이 객체가 seal 클래스로부터 만들어진 인스턴스(instance, 클래스의 구조로 만들어진 실체)라는 의미이다.
* 언더바(_) 는 예전에 C++이나 java에서 사용된 클래스에서는 함수를 이런 이름으로 작성하였고, 이것이 그대로 파이썬에 적용되어 생성자, 즉 클래스를 초기화할 때 쓰는 함수 이름으로 사용되었다. 이런 종류의 이름은 __doc__처럼 클래스에서 한번씩만 쓰게 된다.
클래스 선언
일단 아무것도 하지 않는 클래스 block_factory() 를 만들어보자
class block_factory: #클래스
pass
block = block_factory() #block 객체
그리고 block 이라는 변수에 클래스 이름을 써주는 것만으로도 객체를 생성할 수 있다. block_factory()로 객체를 생성하고 block 객체에 이 클래스를 할당하였다.
여기서 클래스를 할당하는 것이 변수에 자료를 입력하는 방법과 같지만, 이 때 block은 변수가 아닌 객체이다.
class block_factory:
def __init__(self):
pass
여기서 '__init__'을 넣고 클래스를 정의하였다. 여기서 self는 자기 자신을 가리키는 것이다.
관용적으로 self는 첫번 째에 무조건 적으로 쓰고 클래스 자기 자신을 가리킨다.
여기에 매개변수 하나를 넣어 클래스를 초기화 해보자.
class block_factory:
def __init__(self,company):
self.company = company
block = block_factory("Gole")
print("The block came from", block.company)
클래스에 스스로 지칭할 때는 self.compoany 로 접근하였고, 객체 block에서는 block.company로 접근하였다.
객체 생성하기(1)
앞서 블록 클래스에서 여러 객체를 만들어보고, 객체의 정보를 출력해주는 간단한 프로그램을 만들어보자.
class block_factory:
def __init__(self,company):
self.company = company #객체 생성시 company만 초기화
newblock = block_factory("Gole") #객체 생성( 초기화 company는 인자 전달)
newblock.color = "blue"
newblock.shape = "long"
print("블록 정보 출력")
print("제조 회사 :", newblock.company)
print("블록 컬러 :", newblock.color)
print("블록 모양 :", newblock.shape)
처음 __init__에 다른 매서드(.color/.shape)를 넣지 않아도 뒤에 newblock을 불러 오고 난 뒤 초기 속성값을 지정할 수 있다. 이 정보들을 전부 '__init__'에 넣어 객체를 만들 때 초기화를 할 수 있도록 해보자.
class block_factory:
def __init__(self,company,color,shape):
self.company = company # 초기화
self.color = color
self.shape = shape
newblock = block_factory("Gole","blue","long") #객체 생성( 초기화 company는 인자 전달)
print("블록 정보 출력")
print("제조 회사 :", newblock.company)
print("블록 컬러 :", newblock.color)
print("블록 모양 :", newblock.shape)
이제 __init__ 생성자가 외부에서 전달되는 초깃값들을 모두 받을 수 있게 되었다. 이 방법은 여러 개의 객체를 생성할 때에는 이 방법이 편리하다.
객체 생성하기(2) - 여러 객체 생성
이제 여러 객체를 생성해본다. 블록 하나가 아니라 여러개의 블록 인스턴스를 만들어보자
class block_factory:
def __init__(self,company,color,shape):
self.company = company # 초기화
self.color = color
self.shape = shape
newblock = block_factory("Gole","blue","long") #객체 생성
newblock2 = block_factory("Gole","black","short")
newblock3 = block_factory("Oxfold","red","big")
print("블록 정보 출력")
print("제조 회사 :", newblock.company,"블록 컬러 :", newblock.color,"블록 모양 :", newblock.shape)
print("제조 회사 : %s 블록 컬러 : %s 블록 모양 : %s"%(newblock2.company, newblock2.color,newblock2.shape))
print("제조 회사 : {0} 블록 컬러 : {1} 블록 모양 : {2}".format(newblock3.company,newblock3.color,newblock3.shape))
객체 생성하기(3) - 메서드 추가하기
객체라는 것은 데이터와 함수(메서드)를 포함하는 개념이다. 데이터가 뭔가 수행하는 작업을 메서드라고 하는데, 클래스 안에 이를 정의해두면 객체의 동작을 지시하는 방법을 만들 수 있다. 블록의 색이 부족해서 다른 색의 블록을 만든다고 생각해보자.
class block_factory:
def __init__(self,company,color,shape):
self.company = company # 초기화
self.color = color
self.shape = shape
def make_pink(self):
self.color = "PINK"
newblock = block_factory("Gole","blue","long") #객체 생성
print("블록 정보 출력")
print("제조 회사 :", newblock.company,"블록 컬러 :", newblock.color,"블록 모양 :", newblock.shape)
newblock.make_pink() #self.color 변경 함수 호출
print("블록 정보 출력")
print("제조 회사 :", newblock.company,"블록 컬러 :", newblock.color,"블록 모양 :", newblock.shape)
출력 값을 통해서 make_pink() 함수를 호출하고 나서 블록 컬러가 blue 에서 pink 로 바뀐 것을 확인할 수 있다.
즉, make_pink() 메서드를 만든 후, 객체에서 make_pink 메서드를 호출하여 실행한 것이다. 특별히 무언가를 하지 않고도 메서드를 호출함으로써 make_pink() 결과를 받을 수 있게 되었다.
클래스 상속하기
객체지향 언어를 사용하다 보면 상속(inheritance)라는 단어를 자주 들을 것이다. 상속이란 부모의 것을 물려받는 것이다.
즉, 클래스에서의 상속도 마찬가지이다. 클래스가 하나 존재할 때, 이미 존재하는 클래스의 특징인 메서드를 그대로 이어받는 것을 의미한다.
우선 클래스 하나와 메서드 하나를 보자
class korea:
def say(self):
print("im' from korea")
south koream 클래스를 하나 더 만들어 korea 클래스로부터 메서드 say를 상속받도록 할 것이다.
* 클래스를 만들되, 부모 클래스의 이름을 괄호에 써준다.
class korea: #부모 클래스
def say(self):
print("im' from korea")
class south_korea(korea): #자식 클래스: 부모로부터 상속받기
pass
메서드 say()가 제대로 상속되었는지 확인해보자
class korea: #부모 클래스
def say(self):
print("im' from korea")
class south_korea(korea): #자식 클래스: 부모로부터 상속받기
pass
#제대로 상속 되었는지 확인하기 위해 추가함
a = korea()
b = south_korea()
a.say()
b.say()
매직 메서드의 종류
매직 메서드(magic method)는 클래스를 다채롭게 사용할 수 있게 만들어주는 마법같은 방법이다. 처음에 배운 생성자(__init__) 역시 매직 메서드의 일종이다.
* 객체가 시작되거나 종료될 때 사용하는 매직 메서드
이름 | 설명 |
__init__(cls, ...) | 인스턴스가 생성되면 처음 하는 동작 지정 |
__new__(self, ...) | 인스턴스가 생성되면 처음 실행하는 동작 지정 |
__del__(self) | 객체가 소멸할 때 동작 지정 |
* 객체를 출력했을 때 나오는 문자를 지정하는 매직 매서드
이름 | 설명 |
__str__(self) | 객체의 데이터를 문자열로 만들어서 반환, print(a)로 출력하면 해당 부분 호출 (return) |
* 객체의 속성과 관련된 매직 매서드 (데이터를 참조할 때 호출한다.)
이름 | 설명 |
__getattribute__(self, name, ...) | 객체의 속성(데이터)을 참조할 때 무조건 호출 |
__getattr__(self, name, ...) | 참조 시, 속성이 존재하지 않을 때 호출 |
__setattr__(self, name, ...) | 객체의 속성을 변경할 때 호출 |
다른 객체를 변경하는 데 사용하는 클래스에서 사용하는 매직 매서드
이름 | 설명 |
__get__(self, instance, owner) | 특정 객체의 값을 참조할 때 호출 |
__set__(self, instance, value) | 특정 객체의 값을 변경할 때 호출 |
연산자들을 재정의하기 위해 사용하는 매직 매서드
이름 | 설명 |
__neg__(self) | -a(객체)를 정의한다. |
__gt__(self, other) | x>y를 정의한다. |
__add__(self, other) | x+y를 정의한다. |
__init__(self) | int(a)를 정의한다. |
'python > 기초' 카테고리의 다른 글
[Python] 인코딩된 JSON파일 디코딩하기 (0) | 2022.10.11 |
---|---|
(파이썬 기본문법) 파일 입출력 (1) | 2022.09.26 |
[기초] 파이썬 문자열 개념 정리 / Python 파이썬 (0) | 2022.05.13 |
[기초] 문자열에서 특정 문자 찾기 / find(), startswith(),endswith() / Python 파이썬 (0) | 2022.05.11 |
[기초] 배열(Array) / Python 파이썬 (0) | 2022.04.12 |