개발 공부/Python

[Python] map, int, str 등의 내장 함수는 클래스 타입인데 왜 "함수"라고 부를까?

kylekim2123 2021. 6. 14. 10:19

 

 

예전에 파이썬 수업을 들으면서 궁금했던 점이 있었고, 해당 내용에 대한 정보를 지금이나마 공유하려고 합니다.

 

파이썬에서 사용하는 int, str, float 등은 클래스라고 알려져 있습니다.
그런데 파이썬 공식문서에서는 이들을 내장 함수라고 분류를 했는데요.
왜 내장 클래스가 아니라 내장 "함수" 라고 하는걸까요?

 

 

 

링크: 왜 파이썬에서 Map과 Filter가 실제로는 함수가 아닌가?

저는 이 외국 블로그를 참고했는데, 여기에 보면 map이나 filter같은 파이썬 내장함수는 사실 함수가 아니라 클래스라고 합니다.

map and filter aren’t really functions.

They are all actually classes, and when we “call” these functions, we’re actually calling these classes’ constructors.

 

내장함수라고 알고있던 int, str, float, map..등등은 사실 함수가 아니라 함수처럼 call(호출)할 수 있는 클래스였습니다.

이렇게 함수처럼 call할 수 있는 것들을 callable이라고 부르고, 파이썬에서는 함수와 클래스는 모두 callable하다고 합니다.

 

 

 

링크: 그것은 클래스인가 함수인가? 그것은 callable이다!

이것도 참고한 외국 블로그인데요. 여기는 다양한 예시들을 보여주면서 callable에 대해 설명하는 글입니다.

파이썬 기초 문법만 알고 있는 사람도 이해할 수 있도록 정말 쉽게 풀어써놓은 것이 인상적인데요.

여기 나온 예시들을 좀 가져와 봤습니다.

>>> zip
<class 'zip'> # zip은 클래스이다.

>>> len
<built-in function len> # len은 클래스가 아니라 함수이다.

>>> int
<class 'int'> # int는 클래스이다.

 

이처럼 내장 함수라고 해서 무조건 다 클래스는 아닌 것 같아요.

실제로 type(len) 과 같은 형식으로 입력했을 때 <class 'builtin_function_or_method'>라고 나오는 걸 보아하니, 내장 함수 중에서는 클래스인 것도 있고 정말로 함수인 것도 섞여있는 것 같습니다.

 

그런데 클래스 이름은 파스칼 표기법이라는 걸 쓰니까 People, Animal, Dog 이런식으로 대문자가 먼저 나와야 하는데

int, str, float 은 모두 소문자인데 왜 함수랑 헷갈리게, 클래스 이름을 소문자로 했을까요?

 

 

이것도 궁금해서 한 번 찾아봤는데요.

 

 

 

링크: 파이썬에서 리스트는 함수인가? 클래스인가?

이거는 stackoverflow 라는 질문 사이트의 글입니다. 답변 중에 이런 말이 있더라구요.

a few built-in types are named as functions, mainly for historical reasons.

And there are cases where it makes sense to not follow the naming conventions

제가 영어 해석을 잘 한건지는 모르겠지만;; (이 부분은 정확하지 않을 수 있습니다.)

"몇몇 내장 타입들이 역사적인 이유로 인해 마치 함수처럼 이름이 지어졌다.
그래서 네이밍 컨벤션(명명규칙)을 따르지 않는 것이 더 합당한 경우인 것이다."

 

결국은 int, str, float, map 등의 클래스들은 함수처럼 이름 짓는 것이 더 편하거나 아니면 이전부터 내려오던 이유가 따로 있다라고 보는 편이라고 생각이됩니다.

 

 

 

링크: Python2와 Python3의 map은 다르다

이거는 네이버 블로그입니다. 여기서 말을 인용하자면

파이썬2의 map은 함수(function)로써 리스트를 반환한다. 반면에 파이썬3의 map은 클래스(class)로써 map object를 반환한다.

 

파이썬이 2 버전일때 map은 함수였다고 하네요. 그리고 3 버전으로 넘어오면서 map이 클래스가 되었다고 합니다.

그래서 아마도 이건 제 추측인데, 이런 이유가 위에서 말한 역사적인 이유인 것이고 소문자로 작성되던 것이 관습처럼 굳어진게 아닌가 싶습니다.

 

 

 

정리하자면

  • 내장 함수라고 부르는 것들 중 int, str, float, map 등의 몇몇 개는 함수가 아니라 사실 따지고 보면 클래스이다.
  • 이들이 클래스 임에도 함수처럼 쓸 수 있는 것은, 파이썬은 함수와 클래스가 모두 callable 하기 때문이다.
  • 클래스는 파스칼 표기법으로 쓰는데, int, str, float, map 등이 소문자인 이유는 아마 관습이거나 그게 더 편하기 때문이 아닐까 싶다.

 

 

혹시라도 내용 중 잘못된 정보가 있거나 보완이 필요한 부분은 댓글로 남겨주시면 정말 감사드리겠습니다 :)