파이썬 목차 보기
0. INTRO
파이썬을 계속해서 공부해 나가다 보면, 클래스 함수에서 모르는 코드들이 쏙쏙 튀어나올 것이다. 이 코드들은 아주 유용한데, 이전에 클래스에서 속성 초기화와 메서드 함수 코드의 기본에 대해 알아보았다. 이번에는 유용한 코드들을 미리 알아두기 위해 자주 쓰이는 메서드와 속성 함수를 정리해두고자 한다.
1. 클래스 유형에서 기본 코드가 가지는 의미
이전에 생성한 카운트 클래스 함수에서 사용한 기본 속성 코드는 __init__ 코드뿐이었다. 그런데 이 클래스 함수를 정의하고 사용하면 다음과 같은 이상한 코드가 출력되는 경우를 많이 볼 것이다. 다음의 그림을 보자.
가장 먼저 눈에 띄는 코드가 바로 '___main__' 코드이다. 그리고 y 변수와 데이터값, 그리고 주소이다. 어디서 많이 본 구조이지 않은가? 바로 데이터의 구조와 동일한 형태를 가지고 있다. 즉, 클래스는 함수를 잘게 쪼개어 하나의 덩어리 형태로 동일한 주소의 메모리에 할당하는 것이라고 볼 수 있겠다. 따라서 포인터의 역할을 '.'으로 할 수 있는 것이다.
결과적으로 __main__ 코드는 클래스 함수 전체를 의미한다. 그리고 이렇게 클래스 형태로 함수를 만드는 것을 내장 함수(built-in functions, BIFs)라고 한다. 다시 말해서, __main__ 함수에는 __init__ 이라는 내장 함수가 존재하고 이 내장 함수 __init__ 의 프로그램 동작 명령은 바로 변수의 초기화에 있다.
그런데 파이썬에는 포인터를 변경할 수 없다. 굳이 우리가 주소를 알 필요가 있을까? 어떤 클래쓰함수를 지칭할 때 메모리 주소 형태로 그 값을 반환하는 것은 가독성에 불편함을 줄 수 있다. 이때 필요한 코드가 바로 '__repr__' 코드이다.
2. 언더바(Under Bar) '__' 의 의미
클래쓰 함수 내부에 존재하는 이 __repr__ 함수는 놀랍게도 어떤 클래스 변수의 반환을 문자열로 바꾸어준다. 따라서 우리가 어떤 클래스 함수의 메모리를 담고 있는 변수를 출력하도록 할 때 사용자가 임의로 설정한 문자열로 반환하도록 할 수 있는 것이다. 사용법은 다음의 예시 코드를 참고하자.
예시 코드:
class YOU:
def __init__(self, y="you"):
self.you=y
def __repr__(self):
return "Yes, You! YOU!!!"
* 위의 결과처럼 모든 __????__ 코드들은 클래스 내부의 속성에 접근하는 코드들이다.
3. 언더 바코드 정리 _ 반복문에 유용한 'next'와 'iter'
코드를 이해하기 위해서 데이터의 자료형의 특징을 짚고 넘어가자. 대표적으로 리스트, 튜플, 딕셔너리와 같은 데이터 타입을 떠올리면 이들은 데이터가 순차적으로 저장되어있다는 것을 어렴풋이 눈치챌 수 있다. 이렇게 자료 구조가 순차적으로 저장된 형태의 객체를 반복 가능한(iterable) 성질을 가졌다고 말한다. 그리고 이 반복 가능한 성질을 번호와 같은 순회 정보를 가지는 객체를 반복자(iterator)이라고 한다. 즉, iterable 한 객체들은 모두 iterator가 되기 위한 조건을 충족하고 있는 것이다. 예를 들어, 1,2,3,4,5의 데이터가 리스트 형태로 존재한다고 가정하자. 반복문을 사용하여 인덱스를 순차적으로 나타내면 다음과 같다.
앞서 설명한 바와 같이 리스트 자료구조는 반복 가능한 성질을 가졌다. 그렇다면 반복자는 무엇인가? 바로 인덱스 값에 해당한다고 볼 수 있다. 즉, 어떤 리스트의 첫 번째 원소가 0의 인덱스를 가리키면 다음의 순서는 인덱스 1을 가리켜야 한다. 이렇게 반복자는 iterable 한 객체의 다음 인덱스 값에 해당한다고 할 수 있다. 그렇다면 반복자 역시 데이터 변수라고 볼 수 있다. 그렇다면, 순차적으로 다음 인덱스를 지칭하도록 누가 명령을 내려주는 것인가?
클래스 함수에서 이 순차적 명령을 내려주는 함수를 바꿔주는 역할을 바로 '__next__' 함수가 제공한다. 같은 맥락으로 '__iter__' 함수는 반환되는 인덱스 값을 변경한다. 반복 가능한 객체에 대해 이해가 되었다면, 다음의 예제 코드로 카운트 함수를 더 괴랄하게 만들어보자.
예시 코드:
class Count:
def __init__(self,index=None):
self.list=[1,2,3,4,5]
self.index=index
def __iter__(self):
self.index=1
return self
def __next__(self):
if self.index>=5:
raise StopIteration
else:
next = self.list[self.index]
self.index+=2
return next
* 여기에서 raise 코드는 예외 상황을 처리하는 코드이다. 그리고 StopIteration 코드로 반복문을 중지할 수 있다.
코드 결과:
* 참고로 iter() 함수는 괄호안의 반복 가능한 객체의 주소를 반환한다.
'COMPUTER SCIENCE > Python' 카테고리의 다른 글
[Section 4] 백트래킹(Backtracking)이란? _ 이항 계수 예제 (0) | 2022.01.08 |
---|---|
[Section 3] 동적 메모리의 할당 _ 파이썬 메모리 관리자 (0) | 2022.01.06 |
[Section 3] 데이터 타입의 이해 _ 클라쓰(Class) (0) | 2022.01.05 |
[Section 3] 파이썬의 데이터 타입 (0) | 2021.12.31 |
[Section 4] 재귀 함수 예제 _ 팩토리얼 함수 구현하기 (0) | 2021.12.30 |