추상 데이터 타입은 일련의 객체들과 그 객체들에게 적용할 작업을 뜻한다. 이 두가지가 묶여 있는 이유는 프로그램의 한 지점에서 다른 지점으로 객체를 넘길 때 그 객체의 데이터 속성을 접근할 뿐만 아니라 그 데이터를 쉽게 조작할 수 있는 작업까지도 넘길 수 있기 때문이다.
파이썬에서는 클래스를 사용하여 데이터 추상화를 구현한다. 클래스 정의는 type이라는 타입을 가진 객체를 생성하고 그 객체를 instancemethod이라는 타입을 가진 일련의 객체들과 연결시켜 준다. 예를 들어 IntSet.insert는 IntSet이라는 클래스에 정의된 insert라는 메소드를 뜻하는 것이다.
# IntSet 클래스
class IntSet(object):
def __init__(self):
self.vals = []
def insert(self, e):
if not e in self.vals:
self.vals.append(e)
def member(self, e):
return e in self.vals
def remove(self, e):
try:
self.vals.remove(e)
except:
raise ValueError(str(e) + 'not found')
def getMembers(self):
return self.vals[:]
def __str__(self):
self.vals.sort()
result = ''
for e in self.vals:
result = result + str(e) + ','
return '{' + result[:-1] + '}' #-1 omits trailing comma
print(type(IntSet), type(IntSet.insert))
위의 코드를 실행하면 다음과 같은 결과가 나온다.
출력 결과
<class 'type'> <class 'function'>
클래스는 다음 두 가지 작업을 지원한다.
인스턴스 생성은 새로운 클래스의 인스턴스를 만들 때 사용된다. 예를 들어 s = IntSet()은 IntSet 타입의 새로운 객체를 생성한다. 이 객체를 IntSet의 인스턴스라고 부른다.
속성 레퍼런스는 점 표기법을 사용하여 클래스의 속성에 접근한다. 예를 들어 s.member는 IntSet 타입의 인스턴스인 s에 연관된 메소드 member를 의미한다.
여기 기술된 InSet 클래스 정의의 첫 줄은 IntSet이 object의 하위 클래스라는 것을 명시하고 있다. 파이썬은 두 개의 밑줄 표시로 시작하고 끝나는 특별한 메소드들이 몇 개 있다. 클래스의 인스턴스를 생성할 때마다 클래스에 정의된 __init__ 메소드를 호출하게 된다. 그러면 인터프리터는 IntSet 타입의 새로운 인스턴스를 생성하고 IntSet.__init__ 메소드를 호출한다. 클래스의 인스턴스와 연결된 메소드는 점 표기법을 사용해 호출한다.
s = IntSet()
s.insert(3)
print(s.member(3))
위의 코드는 IntSet의 새로운 인스턴스를 생성한 후 int형 3을 IntSet에 삽입한다. 출력 결과는 True이다.
클래스에서 가장 마지막으로 정의된 메소드 __str__은 또 다른 특별한 메소드이다. print문을 사용하면 print를 하려는 객체와 연관된 __str__ 함수가 자동으로 호출된다.
s = IntSet()
s.insert(3)
s.insert(5)
print('OUTPUT : ', s)
출력 결과
OUTPUT : {3,5}
'파이썬' 카테고리의 다른 글
(파이썬) 상속/Inheritance (0) | 2023.08.09 |
---|---|
(파이썬) Person 클래스 (0) | 2023.08.09 |
(파이썬) 예외 처리하기 (0) | 2023.08.06 |
(파이썬) 문자 번역하기 (0) | 2023.08.05 |
(파이썬) 딕셔너리(Dictionary) (1) | 2023.08.04 |