Python - input = input() 문제
C#(정확히는 Unity)로 개발에 입문하고, 줄곧 C 같은 정적 타입 언어만 사용하다가. 동적 타입인 파이썬을 사용할 일이 있어서 좀 쓰게 되었다.
쓰던 와중 파이썬이 런타임에서 자료형이 결정된다는 건 알고 있었지만..
input = input()
이것도 된다는걸;;; 알아버려 가지고, 정확히 이게 어떻게 돌아가는 건지 한번 정리해두기로 했다.
C#과 같은 것들은 정적타입 언어라, 컴파일단에 먼저 선언된 데이터 타입에 따라 메모리를 할당하고 식별자는 할당된 메모리를 가리키기 때문에. int타입 변수에 string과 같은 것들을 암시적으로 그냥 막 집어넣을 수 없다(정 하고 싶으면 casting을 통해, 컴파일러에게 메모리 손상이 있을 수도 있다는 거 알고 있고 어찌 되었건 난 변환을 해야겠다는 걸 알려야 한다).
즉 식별자는 선언되었을때의 타입밖에 데이터를 가질 수 없는 상태며, 이를 위반할 시 컴파일러가 컴파일 에러를 통해 사용자에게 알려준다.
반면 파이썬은 동적타입 언어이기 때문에, 식별자에는 지정된 타입의 메모리 주소가 아니라 인스턴스의 포인터가 담기게 된다. 즉 String을 가리키고 있는 변수에 함수를 할당하는 아래와 같은 일이 가능해진다.
print(dir(input))
print('\033[95m',type(print),'\033[0m')
input = input()
print(dir(input))
print('\033[95m',type(input),'\033[0m')
빌트인 함수 "input"에 = input() 으로 입력받은 string을 할당함으로써, 이제 input은 함수가 아니라 string을 가리키는 변수가 되어버리게 되며. 이걸 실제로 실행해보면
대충 이렇게 나온다. 즉 input에는 =input()때문에 'builtin_function_or_method'에서 'str'의 인스턴스를 가리키는 포인터가 되었다는 이야기다..
그리고 메모리에 있는 이 함수는 어디 가는게 아니기 때문에, 다른 변수에 담아서 호출할 수도 있다..
def objectIsObejct() :
print("Hello?")
objectIsObejct()
print(objectIsObejct)
newFunction = objectIsObejct
objectIsObejct = "Hello"
print(objectIsObejct)
newFunction()
js도 동적타입이니까, 똑같이 적용되는 이야기지만.. nodejs 같은걸 다룰 땐 명명법에 대한 설계까지 먼저 하고 들어가서 input = input()따위를 저지를 일이 없었는데.. python에서는 의식의 흐름대로(?) 짜니까 이런 일을 겪게 되는 것 같다. (그런 일이 있을지 모르겠지만) 만약에 큰 플젝을 다룰일이 생기면 타입 힌트를 좀 적극적으로 쓸 필요가 있을 듯..
'개발 조각글' 카테고리의 다른 글
Unity - Scriptable Object (0) | 2022.07.24 |
---|---|
Processing - Mac에서 Cam을 찾지 못할 때 (0) | 2022.07.23 |
Unity - 인스펙터 두개 띄워놓기 (0) | 2022.07.18 |
Python - TextToCsv (0) | 2022.07.17 |
Python - Torch 챗봇 테스트 (0) | 2022.06.12 |