티스토리 뷰
Python은 정적 타입 시스템이 없는 인터프리터 언어입니다.
그리고 주류 언어들과 비슷하게 개체 지향(객체 지향, object-oriented) 언어입니다.
그래서 Python에서는 모든 것은 개체입니다.
C#, Java와 같은 개체 지향 언어에서도 개체를 중요하게 생각하고,
프로그램의 디자인의 기본 단위를 개체로 둡니다.
Python의 오브젝트와 C#, Java의 오브젝트는 무엇이 다른 걸까요?
len()
vs. Length
만약 C#(혹은 Java)에서 콜렉션의 길이를 구하려면 어떻게 해야할까요?
C#이라면 클래스에서 Length
나 Count
같은 속성(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)
'컴퓨터' 카테고리의 다른 글
[임베디드 OS 개발 프로젝트] 개발 환경 설정 오류 해결 (1) | 2023.06.16 |
---|---|
Python WSGI vs. ASGI (3) | 2023.05.09 |
프림 알고리즘 (Prim's Algorithm, Minimum Spanning Tree) (4) | 2023.05.08 |
JSON 역직렬화 성능 최적화 기법 탐구 1 (1) | 2023.05.06 |
KAIST CS348 정보보호개론: mini-RSA 구현 최적화 과정 (1) | 2023.05.01 |
- Total
- Today
- Yesterday