본문 바로가기

Programming/파이썬 빠르게 배우기

변수 선언 없다.

반응형

C나 Java에 익숙한 사람일수록 가장 당황스러운 것이..... 변수선언 없이 사용하는 것!!

 

이래도 되나? 하는 생각이 들고, 이러면 문제 있지 않을까? 하면서도... 익숙해지면 괜찮습니다. ^^

a = 2
b = 3.5
c = a + b
print(c)

 

C나 Java 였으면 앞에 이런 선언이 필요하죠. (C/Java 고수들은, 자꾸 이러고 싶어 집니다. )

int a;
float b, c;

파이썬에서는 대입되는 값에 따라 변수형이 결정되고, 쭈욱 사용되다가 다시 다른 타입의 값이 대입되면 다시 변수 타입이 바뀝니다.  따라서, 파이썬이라고 해서 변수의 타입이 없는 건 아닙니다. bool, int, float, complex, str 등의 기본 타입이 있습니다. 처음 변수가 만들어질 때 타입이 선언되는 것이 아니고, 변수에 어떤 데이터가 들어갈 때, 변수 타입이 정해지는 것일 뿐

 

제가 생각하는 파이썬 언어의 가장 큰 특징은 `간결함` 입니다. 다른 말로는 `게으른 프로그래머를 위한 프로그램`  
프로그래머가 변수 선언 따위는 안해도 되게 합니다. 컴파일러가 대신해주는 거죠 ^^


 

위 코드에서 a의 변수 타입은 int, b는 floate, c는 float입니다. 처음 대입되는 값이 그러한 형태이기 때문이죠.   

변수의 타입은 type 함수로 알 수 있습니다.

 

a = 2
b = 3.5
c = a + b
d = True

print("a:", type(a))
print("b:", type(b))
print("c:", type(c))
print("d:", type(d))

 

실행 결과는,

a: <class 'int'>
b: <class 'float'>
c: <class 'float'>
d: <class 'bool'>

 

여기서 a에 3.5를 대입하면 어떻게 될까요? 

a=3.5
print("a:", type(a))

답은 a: <class 'float'> 입니다. 그냥 float로 바뀌어 버립니다. 


C/Java로 좀 큰 규모의 프로그램을 짜본 고수라면, 이러한 `동적 타입 결정`이 편리하긴 하지만, 큰 규모의 프로그램에서는 문제를 일으킬 수 있고 디버깅을 어렵게 할 수 있다는 생각을 할 겁니다. 

 

맞는 말입니다.

 

큰 규모의 프로그램에서는 변수들의 타입을 결정해 놓는 것이 좋습니다. 동적으로 나중에 할당된다는 것은, 그 나중에 할당될 때의 상황이 반드시 내가 예상했던 타입의 값으로 돼야 하는 건데, 프로그램 짜다보면 내가 예측한 값이 아닌 경우가 많으니깐

 

예를 들어, str 타입을 함수의 파라미터로 받는 것으로 설계를 했고, 함수 내부에서 str.split()와 같은 문자열 전용 메서드를 사용하고 있는데, 정작 함수의 파라미터로 전해진게 다른 타입이라면?  

 

뭐 에러가 나긴 하겠지만, 이게 컴파일 타임이 아닌 동작 시켜봐야 아는 에러라서, 이 에러가 발생해봐야 문제를 알 수 있다는데 문제가 있는 겁니다.

 

해서, 파이썬 v3.6 부터는 타입 체크를 할 수 있는 방법을 제시했습니다.  

 

변수를 선언할 때 타입을 같이 적게 하고, Mypy라는 툴을 써서 타입이 맞게 사용되고 있는지 검사하게 하는 거죠.

 

a: int = 2

def headline(text: str, centered: bool = False) -> str:
	...
    

근데 이렇게 하더라도 Mypy로 돌려보기 전까지는 타입체킹이 안되고, 그리고 모든 코드를 이렇게 짜는 것도 쫌 그렇고...

 

여하튼, 파이썬으로 코딩할 때는, 변수의 타입이 입력되는 값에 의해 결정된다는 사실을 명심하고, 주의해서 코딩할 수밖에 없습니다. 

 

뭐, 사실 일반적인 프로그래밍에서는, 변수 선언없이 사용하는 편리함이 장차 있을 수 있는 디버깅 곤란함보다 더 매력적입니다.

 

-끝-

 

 

 

 

 

반응형

'Programming > 파이썬 빠르게 배우기' 카테고리의 다른 글

블록기호 없음. 들여쓰기가 중요  (0) 2020.05.11
for 구문이 좀 이상한데?  (0) 2020.05.10
if~else 있고, switch 없다.  (0) 2020.05.10
main이 어디 있나?  (0) 2020.05.10
이 글목록에 대해  (0) 2020.05.10