좍이 : 뉴비들은 봐라. 알려줄께 ㅇㅇ - 변수 선언 편

Posted by 겨울에
2011. 2. 20. 10:09 scrap/ HOHO
글쓴이 : 좍이


프겔에 잘난 척만 하는 뉴비들만 득실득실해서 이런 수준 높은 글에 관심을 가질 놈은 별로 없겠지만,

주말 아침에 스스로 공부해볼겸, 시부려본다.

괜히 아는 체 해서 똥만 싸지말고, 아는 것만 시부리자.

C언어에서 char에 문자가 저장된다고 배웠어도, 그건 진실이 아니다...

문자로 해석할 뿐이지.

제대로 아는거 아니면 뉴비한테 시부리지 말자.

세상에 똥이 가득찬다.


뭐, 잡설은 이만하고, 강의를 시작하도록 하겠다.



변수 선언에 대한 언어의 스펙은 크게 2가지 관점에서 2가지 종류의 견해가 있다.


1-1. 명시적으로 변수가 선언되어야만 한다

# 선언되지 않은 변수를 사용하면  컴파일러가 에러를 내는 언어. 대표적으로 C계열 언어, 등등등

1-2. 묵시적으로 변수가 선언될 수 있다

# 선언되지 않은 변수를 사용하면 컴파일러가 알아서 변수를 선언해주는 언어. python, rupy, ocaml 등등등


2-1. 정적 타입 체킹

# 컴파일 타임에 변수의 타입을 체크하는 언어. 변수타입과 사용방식이 상이하면 경고&에러를 낸다. 대표적으로 ocaml, 등등등

2-2. 동적 타입 체킹

# 런타임에 변수의 타입을 체크하는 언어. 인터프리터 언어들이 대개 이런데, 에러가 있으면 실행하다 죽곤 한다. python, rupy 등등등


프로그래밍 언어(이하 PL)의 세계에서 변수 선언을 어떻게 해야하는가는 

언제나 뜨거운 감자였다.

난 개인적으로 (1-2, 2-2)를 선호하지만, 어떤 타입 선언이 더 좋으냐?에 대해선

영원히 논의해도 답이 나올리가 없는 논제이기 때문에 넘어가도록 하겠다.

뭐, 제각기 장단점이 존재하기 마련이고 말이지.




자, 그럼 1번 관점에 대해 공부해보도록 하자.

1-1. 명시적 변수 선언. 즉 C언어 같이 변수를 꼭 선언해야하는 것의 장점은 컴파일러에게 꼭 사용해야할 변수를 알려줄 수 있다는 것이다.

선언하지 않고 사용하면, 이걸 사용자의 실수로 판단해서 컴파일러가 경고&에러를 내줄 수 있다는게 장점이지. 물론 100%는 아니다.

단점은 "귀찮다"라는 것이다.


1-2. 묵시적 변수 선언. 즉, python 같이 변수를 직접 선언하지 않아도 사용할 수 있는 것이지.

장점은 "편하다"라는 것이다.

단점은 거지 같은 사용자가 거지 같이 쓰면 거지 같이 된다는거지.

거지 같이 써도 컴파일러가 경고 & 에러를 내어줄 기준이 없으니까, 개념없는 놈이 쓰면 버그의 천국을 양산하게 된다.

하지만 대개 고치기 어려운 버그를 양산하진 않아. 어려운 버그는 이런 문법적 수준의 버그가 아니라, 논리적 버그니까.


명시적 변수 선언과 묵시적 변수 선언은 서로 대비되지.

"버그가 보다 적은" 프로그램을 짜는데는 얼핏 보기에 명시적 변수 선언이 유리해보이지.

하지만 꼭 그렇진 않아.

명시적 변수 선언에 비해서 묵시적 변수 선언은 그 단점을 해소할 강력한 방법들을 가지고 있거든.

변수 선언에 신경을 덜 씀으로써, 로직에 더 관심을 가져줄 수 있다는 관점도 있고.

그 방법은 2-1과 정적 분석기로 대표되는데...


그럼 2번 관점을 공부해보도록 하자.

2-1. 정적 타입 체킹. 간단히 생각하면, 프로그램을 실행하기 전에 "타입"을 검사하는거야.

int에 정수값이 들어갔는지, double에 실수값이 들어갔느지, 이런걸 검사하지.

"정적 타입"이라는 말은 타입이 고정되어 있다는 말이기도 해.

int로 선언된 타입을 double로는 사용할 수 없다는 뜻이지.


C언어 같은 경우엔 약한(weak) 타입 체킹에 해당해.

캐스팅이 가능하면 묵시적으로 캐스팅 해버리지.

경고는 낼지언정 오류를 내진 않아.

그리고 런타임에 오작동을 일으키지.


ocaml 같은 경우엔 강한(strong) 타입 체킹이라고들 하지.

묵시적인 캐스팅을 하지 않아.

변수가 처음 사용되었을 때, 타입이 정해지고,

이후론 타입의 변경이 허용되지 않지.



정적 타입 체킹의 장점은 역시 컴파일 타임에 미리 버그를 발견할 수 있다는거지.

단점은 유연성이 부족하다는 것 정도.

C계열 언어는 좀 어중간한데, 약간의 유연성을 첨부한 정적 타입 체킹이라고 생각하면 얼추 맞아.


2-2. 동적 타입 체킹. 실행 중에 타입을 체크하는 언어.

동적 타입은 타입이 런타임 중에도 바뀔 수 있어. 타입이 없는건 아니지만...

모든 변수를 void 포인터로 캐스팅해서 사용한다고나 할까?


이런 언어는 잘못 사용하면 아주 위험해.

정적 타입 체킹 언어에선 컴파일 타임에 가볍게 잡아주는 버그들이 실행중에 불쑥불쑥 튀어나와서

프로그램을 죽이곤 하지.

하지만 이건 프로그래머의 재량 문제이기도  하고,

자신을 제한하고, 정적 분석기 등을 도입하면 거의 해소할 수 있지.

동적 타입 체킹의 장점은 유연한 사고를 프로그래밍에 보다 강력하게 적용할 수 있다는거.

단점은 다이아몬드로 쓰면 다이아몬드가 나오지만, 똥으로 쓰면 똥이 나온다는거.




어떤 변수 선언 & 타입 체킹 방식을 선호하는가는 사람마다 다르고, 취존해야할 필요성이 있어.

------------ 이하는 내 개인적인 견해 ------------

하지만 C언어는 까고 가야겠다.

C언어는 명시적 변수 선언을 고수함에도 불구하고, 어설픈 묵시적 캐스팅을 허용함으로써

불편하면서도 버그 양산의 소지만 잔뜩 열어놓았지...

포인터야, 뭐, 기계 관점에서 훌륭한 도구이긴 하지만...

명시적 변수 선언을 고수할 거였으면, 묵시적 캐스팅도 허용 안 했으면, 상황이 훨씬 나았을텐데...


타입 체킹은 정적 분석기를 도입함으로써 대부분의 문제점을 잡아낼 수 있지만,

C언어의 묵시적 캐스팅으로 발생하는 메모리 버그 같은건,

어떤 도구로도 제대로 잡아낼 수가 없지.







댓글
-----------------------------------------------------------------------------------------

cyluss
다 맞는 얘긴데, ocaml에서 자동으로 바인딩을 만든다는 얘기는 사실이 아님.
2011.02.20 09:31
냐하
음? C 컴파일 옵션에 캐스팅관련 옵션이 있지 않나? 걍 경고만 뿌리고 말던가..|183.109.***.***
2011.02.20 09:34
복어맛미나리
OCaml 명시적으로 let으로 변수 선언해야 하지 않던가?|110.15.***.***
2011.02.20 09:42
좍이
그렇네... 타입은 묵시적, 선언은 명시적이네. ocaml|59.7.***.***
2011.02.20 09:45
ㅆㅂ
프갤 존나 ㅄ같에 http://codepad.org/NKW64W7b|121.182.***.***
2011.02.20 09:49
cyluss
assignment를 먼저 써야지 ㅂㅅ아..
 
-----------------------------------------------------------------------------------------




'scrap >  HOHO' 카테고리의 다른 글

어제한 삽질.. [ linux db 관련.. ]  (0) 2011.02.23