티스토리 뷰

컴퓨터

Python 개체 설계의 유연함

고래처럼 2023. 5. 8. 10:09

Python은 정적 타입 시스템이 없는 인터프리터 언어입니다.


그리고 주류 언어들과 비슷하게 개체 지향(객체 지향, object-oriented) 언어입니다.
그래서 Python에서는 모든 것은 개체입니다.


C#, Java와 같은 개체 지향 언어에서도 개체를 중요하게 생각하고,
프로그램의 디자인의 기본 단위를 개체로 둡니다.

 

Python의 오브젝트와 C#, Java의 오브젝트는 무엇이 다른 걸까요?

len() vs. Length

만약 C#(혹은 Java)에서 콜렉션의 길이를 구하려면 어떻게 해야할까요?


C#이라면 클래스에서 LengthCount같은 속성(Property)를 정의해 놓았을겁니다.
그래서 x.Length 처럼 길이를 구해야합니다.

 

Python의 경우는 조금 다릅니다. len(x)로 모든 걸 해결합니다.

 

똑같은 방식으로 콜렉션의 총합을 구하려면,
C#에서는 클래스 안에 int Total() 같은 메소드를 정의하고 나중에
x.Total()를 통해 총합을 구해야합니다.


Python은 그냥 sum(x)로 해결합니다.

 

C#과 Java는 클래스를 통해 (또는 인터페이스를 통해) 개체를 정의할 수 있습니다.
그래서 클래스를 정의할 때마다 Length, Count, Total() 같은 속성이나 메소드를 정의해야 합니다.


그 결과 클래스마다 사용하는 메소드의 이름이 다릅니다.

Length, Count를 사용하는지 항상 확인해야 합니다.

Total()인지, Sum()인지도 확인해야 합니다.

 

이와 달리, Python은 붙박이(built-in) 함수 len, sum을 통해서
개체가 이런 기능들을 어떻게 제공해야 하는지에 대한 표준을 제공합니다.

 

따라서 프로그래머는 개체가 Length를 사용하는지 Count를 사용하는지 기억할 필요가 없습니다.
len만 기억하면 됩니다.

dunder 메소드 (e.g. __len__)

또 이런 붙박이 함수나 Python 문법들은 Python 오브젝트의 dunder 메소드를 사용하기 때문에,
붙박이 함수나 Python 문법은 개체를 설계하는 일종의 표준을 제공합니다.


len의 경우는 __len__를 사용하거나, __iter__를 사용해 개체의 길이를 잽니다.
for ... in ...같은 문법은 __iter__를 이용해 개체의 데이터들을 순회합니다.

 

만약에 개체가 여러 데이터를 표현한다면, __iter__를 구현해 for ... in ...의 사용을 지원할 수 있습니다.


__contains__를 구현해 ... in ...를 지원할 수 있습니다.

 

만약 개체가 키-값 쌍을 표현한다면, __getitem__를 구현해 obj[key]같은 문법을 지원할 수 있습니다.
개체가 해쉬-가능(hashable)해야 한다면, __hash__만 구현하면 됩니다.

 

따로 인터페이스나 클래스 설계를 위해 깊이 생각하지 않고,
필요한 기능을 그떄그때 붙여서 사용할 수 있습니다.

 

이런 설계의 유연함이 Python이 가장 인간친화적인 언어 중 하나가 된 이유가 아닌가 생각합니다.

 

참고

Fluent Python, 2nd Edition [Book] (oreilly.com)

PEP 234 – Iterators | peps.python.org

Built-in Functions — Python 3.11.3 documentation

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday