2009/05/08 10:45
RL.C omputer
발아점 : 써니의 一生牛步行 : 정의와 선언의 차이
declare. and Define 뭐가 다를까.
내가 덧글로
라고 남겨두자 써니님께서
라고 적어주셨다.
참고삼아 geektoo님의 설명을 적어두면
써니님 글 본문에 '검색'을 추천하시기에 구글에 물어봤다.
그래서 찾은 본문이
혹은
다른 내용으로는
뭐 여전히 모르겠다.
SQL에서는 보통 변수를 선언할 때
이런식으로 선언하고 정의한 후 사용한다.
즉 내가 이해하고 있는 선언과 정의와 사용의 차이는.
일단 위에 기술한 써니님께 달아둔 덧글에는 이와 같은 의도로 쓴 것인데
실제로 의도가 전달이 잘 안된 것인지. 아니면 내가 뭔가 잘못 알고 있는 것인지
누군가가 정확하게 알려줄 수 있으면 좋겠다.
써니님께서는 geektoo님의 의견에 동의하시는 걸로 봐서는
두분의 '정의와 선언에 대한 차이에 대한 견해'가 일치하는 것인데
내가 이해한 geektoo님의 댓글은
내공이 부족해서인지는 모르겠지만
정확히 뭔가 와닿지가 않는다.
어떻게 보면 선언은 Property. 즉 특성을 기술하고,
정의는 Method. 즉 행동을 기술하는 것 같기도 하고.
다른 측으로 보면 선언은 class. 형식을 기술하고,
정의는 Instance. 즉 실체를 기술하는 것 같기도 하고.
다른 시점으로 보면 선언은 interface, 즉 형식을 기술하고,
정의는 구체화 클래스를 기술하는 것 같기도 하고..
(내가 덧글에 써 둔 짧은 소스는 이 의미로 써둔 것이다.)
위에서 인용한 C가 있는 홈페이지 부분,
혹은 행복한 내일을 위해 부분을 봐도 헷깔리기는 마찬가지인 것이
내가 알기로는 STATIC 타입을 취하는 언어들과
Dynamic 타입을 취하는 언어들은 그 바인딩 시점이 전혀 다르고,
(Dynamic 언어들은 거의 대부분 선언과 동시에 정의가 된다.)
Static 타입 언어들이라고 해도 절차형 언어와 함수형 언어는
바인딩 시점이 전혀 다르다.
그러니까 정확히 말하면 '컴파일러가 작동하는 방식'이 전혀 다르다.
바인딩 시점이라는 것이
'언제 값이 메모리에 Allocation. 즉 적제되는가'에 대한 내용이라면
이것의 내가 생각하는 답은 '컴파일러에 따라 다르다'는 것이다.
극단적으로 말하자면,
Ruby나 Python에서는 '선언'시에 데이터가 바인딩되지만,
Haskell에서는 Lazy Binding 때문에 '사용'시에 데이터가 바인딩된다.
가장 많이 사용되는 C언어 계열에서는 '정의'시에 데이터가 바인딩된다.
그러니까. 저 '메모리 적재 여부'로 정의와 선언을 구분하는 것은
말이 안된다고 생각한다.
써니님이 항상 강조하시듯이, '좀 더 기본'으로 돌아갈 필요가 있다고 생각하는데,
프로그래머들이 항상 생각하는 방식으로.
이견이 없는 '공리'를 먼저 정의해 두고 시작하고 싶은데
내가 못찾아서이겠지만
'특정 언어나 패러다임에 종속되지 않은 선언, 정의, 사용'에 대한 공리'
를 도저히 못찾겠다.
누구 좀 댓글이나 트랙백으로 도와주실 분 계신가요?
declare. and Define 뭐가 다를까.
내가 덧글로
int a; // 선언
a = 3 // 정의
-------------------
interface b { void Action(); } // 선언
class C extend b { pulic void Action(){print "하하" };} // 정의
---------------
뭐 대충 이런건가요? (아닌가;;;)
a = 3 // 정의
-------------------
interface b { void Action(); } // 선언
class C extend b { pulic void Action(){print "하하" };} // 정의
---------------
뭐 대충 이런건가요? (아닌가;;;)
라고 남겨두자 써니님께서
약간 혼동 하시는 듯 합니다.
위에 geektoo님의 설명을 잘 읽어 보시는 것을 권장합니다.
틈나면 제가 보충 설명을 올려두어야 겠군요.
위에 geektoo님의 설명을 잘 읽어 보시는 것을 권장합니다.
틈나면 제가 보충 설명을 올려두어야 겠군요.
라고 적어주셨다.
참고삼아 geektoo님의 설명을 적어두면
텍사스 전기톱 살인마 라는 녀석이 있습니다
=======================================
텍사스 전기톱 살인마
선언 :
1.가면쓰고.
2.덩치크고.
3.손에는 전기톱을 들고 있기
정의:
1.큰덩치에, 몸을 왔다갔다하며
2.외부충격에 의해 가면이 벗겨질수있으며
3.손에 든 전기톱에 시동을 걸어 마구잡이로 자르고, 썰고. 찍는다
===========================================================
이것이. 선언과 정의의 차이입니다
라고 되어 있다.=======================================
텍사스 전기톱 살인마
선언 :
1.가면쓰고.
2.덩치크고.
3.손에는 전기톱을 들고 있기
정의:
1.큰덩치에, 몸을 왔다갔다하며
2.외부충격에 의해 가면이 벗겨질수있으며
3.손에 든 전기톱에 시동을 걸어 마구잡이로 자르고, 썰고. 찍는다
===========================================================
이것이. 선언과 정의의 차이입니다
써니님 글 본문에 '검색'을 추천하시기에 구글에 물어봤다.
그래서 찾은 본문이
① 정의와 선언의 대상은 변수와 함수, 두 가지이다.
② 정의는 '만든다'의 의미를, 선언은 '알린다'의 의미를 지닌다.
③ 정의는 변수나 함수의 특징을 완전하게 지정해 주어야 하지만, 선언은 특성중 필요한 것만 골라서 지정하면 된다.
④ 정의는 저장장소를 메모리에 할당하지만, 선언은 변수나 함수의 특성을 컴파일러에게 알려주기만 한다. 그러므로 정의는 메모리 사용량을 증가시키지만 선언은 메모리 사용량과 전혀 관계없다.
⑤ 정의는 만드는 것이므로 프로그램 전체에 걸쳐 단 한번만 이루어지지만, 선언은 단지 알리는 것이므로 여러번 중복되어도 된다.
⑥ 정의는 선언을 겸할 수 있지만, 그 반대로 선언은 정의를 겸할 수 없다.
또, 자동변수의 경우 정의와 선언은 구별되지 않지만 외부변수나 함수의 경우에는 정의와 선언은 명확히 구별된다.
⑦ 6장에서의 '함수의 원형'은 컴파일러에게 알려주는 것이므로 선언이다.
출처 : C가 있는 홈페이지. 7. 기억부류혹은
선언은.. 컴파일러에게 어떤 대상의 이름을 알려주는 행위입니다. 영어로는 declaration 입니다.
정의는.. 컴파일러에게 어떤 대상의 실제 내용을 알려주는 행위입니다. 영어로는 definition입니다.
선언과 정의를 구분하는 한가지 기준은 memory address binding의 유무를 기준으로 구분합니다.
즉, 어떤 대상의 이름에 대해 그에 대응하는 메모리 상의 주소가 정해진다면 그것은 정의이며, 그렇지 않고 이름만 알려준다면 그것은 선언입니다.
출처 : 행복한 내일을 위해.
정의는.. 컴파일러에게 어떤 대상의 실제 내용을 알려주는 행위입니다. 영어로는 definition입니다.
선언과 정의를 구분하는 한가지 기준은 memory address binding의 유무를 기준으로 구분합니다.
즉, 어떤 대상의 이름에 대해 그에 대응하는 메모리 상의 주소가 정해진다면 그것은 정의이며, 그렇지 않고 이름만 알려준다면 그것은 선언입니다.
출처 : 행복한 내일을 위해.
다른 내용으로는
뭐 여전히 모르겠다.
SQL에서는 보통 변수를 선언할 때
declare @counter int; -- 선언
set @counter = 1; -- 세팅. 즉 정의.
select @counter -- 사용.
set @counter = 1; -- 세팅. 즉 정의.
select @counter -- 사용.
이런식으로 선언하고 정의한 후 사용한다.
즉 내가 이해하고 있는 선언과 정의와 사용의 차이는.
선언 : @counter라는 '변수'의 타입. 즉 무언가를 담기 위한 공간의 '형식'을 '알려준다'.
정의 : @counter라는 공간에 실제로 값을 주입한다.
사용 : @counter라는 공간이 실제로 무엇을 가리키고 있는가에 대해서 값을 가져온다.
정의 : @counter라는 공간에 실제로 값을 주입한다.
사용 : @counter라는 공간이 실제로 무엇을 가리키고 있는가에 대해서 값을 가져온다.
일단 위에 기술한 써니님께 달아둔 덧글에는 이와 같은 의도로 쓴 것인데
실제로 의도가 전달이 잘 안된 것인지. 아니면 내가 뭔가 잘못 알고 있는 것인지
누군가가 정확하게 알려줄 수 있으면 좋겠다.
써니님께서는 geektoo님의 의견에 동의하시는 걸로 봐서는
두분의 '정의와 선언에 대한 차이에 대한 견해'가 일치하는 것인데
내가 이해한 geektoo님의 댓글은
내공이 부족해서인지는 모르겠지만
정확히 뭔가 와닿지가 않는다.
어떻게 보면 선언은 Property. 즉 특성을 기술하고,
정의는 Method. 즉 행동을 기술하는 것 같기도 하고.
다른 측으로 보면 선언은 class. 형식을 기술하고,
정의는 Instance. 즉 실체를 기술하는 것 같기도 하고.
다른 시점으로 보면 선언은 interface, 즉 형식을 기술하고,
정의는 구체화 클래스를 기술하는 것 같기도 하고..
(내가 덧글에 써 둔 짧은 소스는 이 의미로 써둔 것이다.)
위에서 인용한 C가 있는 홈페이지 부분,
혹은 행복한 내일을 위해 부분을 봐도 헷깔리기는 마찬가지인 것이
내가 알기로는 STATIC 타입을 취하는 언어들과
Dynamic 타입을 취하는 언어들은 그 바인딩 시점이 전혀 다르고,
(Dynamic 언어들은 거의 대부분 선언과 동시에 정의가 된다.)
Static 타입 언어들이라고 해도 절차형 언어와 함수형 언어는
바인딩 시점이 전혀 다르다.
그러니까 정확히 말하면 '컴파일러가 작동하는 방식'이 전혀 다르다.
바인딩 시점이라는 것이
'언제 값이 메모리에 Allocation. 즉 적제되는가'에 대한 내용이라면
이것의 내가 생각하는 답은 '컴파일러에 따라 다르다'는 것이다.
극단적으로 말하자면,
Ruby나 Python에서는 '선언'시에 데이터가 바인딩되지만,
Haskell에서는 Lazy Binding 때문에 '사용'시에 데이터가 바인딩된다.
가장 많이 사용되는 C언어 계열에서는 '정의'시에 데이터가 바인딩된다.
그러니까. 저 '메모리 적재 여부'로 정의와 선언을 구분하는 것은
말이 안된다고 생각한다.
써니님이 항상 강조하시듯이, '좀 더 기본'으로 돌아갈 필요가 있다고 생각하는데,
프로그래머들이 항상 생각하는 방식으로.
이견이 없는 '공리'를 먼저 정의해 두고 시작하고 싶은데
내가 못찾아서이겠지만
'특정 언어나 패러다임에 종속되지 않은 선언, 정의, 사용'에 대한 공리'
를 도저히 못찾겠다.
누구 좀 댓글이나 트랙백으로 도와주실 분 계신가요?
2009.05.08 By RL.C

