/********************************************************************
정의,선언,할당 3단계(define , declear, allocation )
글쓴이: 신대용
시작 : 2005 5월 5일 11시
끝 : 2005 5월 7일 3시 51분
*******************************************************************/
오늘 이야기 할 것은 씨언어라기보다는 프로그래밍을 하기위해서, 프로그래밍 개념을 잡기 위한 거니깐 잘들어야 해여^^
이 개념이 잘 잡혀 있으면 , variable(변수), function(함수), object(객체)에 대한 것을 공부할 때 좀더 편하게 대할 수 있어요^^
정의가 가장중요한데요 프로그래밍이란게 이것저것 정의 하는 것이기도 하고 처음에 프로그래밍 공부하시는 분들이 문법(Syntax)이 왜 존재 하는지도 잘모르시는데 그 해답도 된답니다. 선언과 할당은 변수와 객체공부하는대 도움이 될꺼예요^^
1.정의
컴퓨터는 바보 라고 했죠? 아는게 전혀 없답니다. 갓난 아기와 같아요^^
그런데 갑자기 아기한테 "안방으로 기어가서 엄마 향수좀 가져다 줄래?"말하면 -_- 쌩뚱맞져?
아기는 안방이 뭔지도 모르고, 향수가 뭔지도 모르고 가지고 오는게 뭔지도 모르고 지가 기어다니는지 뛰어다니는지도 모르고 아는건 오직 엄마 ^^
아빠한테도 "엄마" ^^ 아빠라고 부르는게 얼마나 기쁘면 TV광고로도 나오겠어요 ㅎㅎ
그런데 컴퓨터도 마찬가지랍니다. 다른 컴퓨터랑 통신을 어떻게 할지도 모르고 자기 몸에(본체에) 뭐가 붙어있는지도 모르고, printf가 뭔지도 모르고^^
그래서 윈도우도 설치하는거고 드라이버(지금은 몰라도돼요)도 설치하고 #include<stdio.h>라고 써주는거랍니다. ^^
우리는 인식하지 못하지만 상당히 많은 것이 그리고 엄청나게 세세하게 정해져 있답니다.
참의 반대는 거짓이다, A는 65라는 값으로 저장할 것이다, + 는 덧셈을 하는 것이다, / 는 나누기를 한다. 이런 것에서부터
간단히는 말할 수 없는, 한가지를 정의하기위해서 수백,수천페이지에 달하는 양으로 정의 되어있는것도 있습니다.
이런것들이 무궁무진하게 있죠, 아....겁먹지 마세요 나중에 이야기 하겠지만 hierarchy(계층)하게 컴퓨터는 만들어져서 몰라도 0.1g의 문제도 없어요^^
지금까지 그래왔던것처럼 앞으로도 그럴꺼고요^^
1.1 정의란?
음 이런이야기를 하는 이유는 "정의"라는 것을 설명하기 전에 간단한 예를 봤던거예요
그럼 정의라는 단어가 무얼 말하는걸까 볼까요?
정의(定義) , 어떤 개념의 내용이나 용어의 뜻을 다른 것과 구별할 수 있도록 명확히 한정하는 일, 또는 그 개념이나 뜻.
이라네요^^ 쉽게보자면 "나는 귀엽다" 라고 정하는거죠 ^^, 말이 안된다고요?(당연한데-_-;) 물론 말이 안되겠지만 정의라는 것은 신이 말하는것과 같습니다.
그렇다고 하면 그런거죠(쳇), "전지현은 안이쁘다", 물론 말 안돼죠!!! 그런데 그렇다고 하면 그런 겁니다ㅜㅜ
컴퓨터앞에선 프로그래머가 신이죠? 그럼 컴퓨터는 그것에 따르는겁니다^^ "왜?" 라는 반문은 절대로 있을순 없습니다.
앞으로 여러분이 컴퓨터를 공부하게 될 때 "왜?"라는 의구심을 가지고 공부하게 될텐데요 이렇게 "정의" 된것에 대해서는 "아~ 그렇구나" 라는생각과함께
"앞으로는 이렇게만 하자"라는 생각을 가지고 있으시면 쓸데없는 고민은 안하셔도 됩니다. (물론 1+1=2 라는 것처럼.... 이것을 증명하는 것은 어렵죠^^)
정의는 마음대로 할 수 있고 일단 정의 되면 그에 따라야만 한다.
1.2 정의의 예
그럼 정의라는게 컴퓨터를 사용하는입장에서 어떻게 알 수 있을까요?
가장 원초적으로 CPU마다 다르게 어떤 일을 어떻게 할것인지가 "정의"되어있습니다. 그래서 INTEL,AMD CPU에서 돌아가는 프로그램을 MAC에서 돌리면 안돌아갑니다.
그리고 윈도우와 리눅스도 다르게 정의 되어있어서 윈도우용 프로그램이 리눅스에서 안돌아갑니다^^
프로그래밍 상황에서도 볼까요?
#include <stdio.h>라는 것은 왜 쓸까요?
그 이유는? printf를 쓰기 위해서? 맞아요^^ #include라는 건 다른 파일을 자기 소스에 붙여넣으라는 건데 stdio.h파일에는 입력과 출력에 관련된 함수들이 정의되어(만들어져)(2009년 5월 10일 수정) 선언되어 있답니다^^(정의는 다른곳에 되어 있습니다. 이는 Linking과정을 보시면 알 수 있습니다.)(함수가 아직 뭔지 모르신다면 그냥 "명령" 이라고 생각하고 읽으셔도 되요^^)
프로그래밍이라는 것이 이런저런 것들을 정의 해 나가는 거랍니다.^^
int a; 이런것도 (type) (variable name) 이런식으로 사용할 변수를 선언 한다라고 정의 되어 있어서 할 수 있는거예요 물론 int도 정의 되어있죠^^
정의라는건 죽어도 그대로 해야하는거니깐 inta; 이런식으로 하면 안되는거에요^^
함수를 만드는것도 정의라고 보면 좋아요. 함수의 형식역시 정의 되어있는데
(return type) (function name)(parameter list){
contents//2009년 3월 24일 수정
statements
}
이대로 해야해요^^ 이 형식대로 여러분만의 함수를 정의 해야 한답니다^^
2.선언
int a;
이런 것이 선언 이랍니다. 정의 되어 있는 것을 사용하겠다고 말 그대로 "선언"하는 거죠. 일반 변수들을 선언 할 때 자동적으로 운영체제에서 메모리를 할당해준답니다. 많은 경우에 선언과 할당이 동시에 일어난답니다.
중요한건 정의가 선언 보다 먼저 올 수 없어요. int 라는게 정의 되어있어야지만 int 형변수 a를 만들 수 있는 것이랍니다^^물론 할당도 정의,선언 보다 먼저 나올 수 없죠^^
define하고 declear하고 헷갈리실수 있어요 그런데 반드시 구분할 수 있으셔야해요^^
//2009년 3월 24일 주석
여기서 말하는 define은 #define의 전처리가 아닙니다. 정의를 말하는 것 입니다.
3.할당
할당이라는건 또 무슨 소리일까요? 할당이라는건 영어로 allocation인데요, 메모리에서 우리가 사용할 양을 정하는거예요. 운영체제인 XP나 리눅스 같은녀석한테
"야! 나 10메가만 줘", "야 나 abc라는 변수 int 로 만들꺼니깐 메모리줘"이렇게 말하는거죠 필요한 만큼만 달라고해야지 그이상달라고 하면 낭비랍니다.
3.1 메모리는 비쌌다.
예전에 스폰지(KBS에서 하는 TV프로그램)에서 본건데요 예전에 누군가가 이런말을 했답니다
"미래의 가정용 컴퓨터는 640KB(킬로바이트) 면 충분할 것이다"
누굴까요? ㅎㅎ 빌게이츠랍니다-_- 희대의 사기꾼인 ㅎㅎ(컴퓨터 공부하면 할 수록 빌게이츠가 싫어질꺼예요 ㅎㅎ)
640KB면 요즘 나오는 500만화소 디카로 찍은 사진 한 장보다도 작은 용량이죠 ㅎㅎ
예전에는 메모리의가격이 매우 매우 비쌌어요 물론 지금도 그렇답니다. 지금은 별로 안한다고요?
메모리에도 종류가 많아요, 빠른 메모리 일수록 비싸답니다. CPU에 붙어있는 메모리는 정말 비싸요(이 이야기는 나중에^^)
지금의 컴퓨터는 1+2를 한다고 하면 1하고 2를 메모리에 반듯이 넣어야 한답니다. 컴퓨터로 사진을 본다면 그 사진도 메모리로 가야하고, 음악도 마찬가지라서 음악을 듣는다면 그 음악이 메모리에 들어가요, 게임도 마찬가지고요^^ 모든 작업은 메모리와 시피유로 가서 처리된답니다^^
그런데 옛날에는 메모리의 가격이 비싸서 컴퓨터에 메모리를 많이 실을 수 없었어요 그로인해 많은 문제도 일어났죠
640KB메모리를 가진 컴퓨터에서 1MB짜리 책을 볼려면 어떻게 해야할까요? 혹은 자신이 만든 프로그램이 1MB의 메모리를 사용한다면?
그래서 메모리를 아주 조금사용하면서 해야할 작업을 빠르게 완수하는 프로그램을 작성하는 것이 중요했어요(옛날에 컴퓨터는 작업용으로 주로쓰였죠^^ 비싸서)
지금처럼 메모리가 많을 때는 뭐가 문제냐고요? 메모리가 많아짐에따라 할 수 있는것도 많아졌고 사람들이 원하는것도 메모리를 더 많이 쓰게 되었거든요
요즘 한창 인기있는 게임들이 필요로 하는 메모리는 수십 메가에서 수백메가 까지해요 저같은 경우 평상시 컴퓨터를 할때 음악을 켜놓고 익스플로러를 10개 정도 실행시켜 놓고 바탕화면은 좋아하는 자우림이나 스타들 사진으로 하고 메모장 1,2개 켜놓고 메신저도 켜놓고 그밖에 여러 프로그램을 켜놔요 더욱이 게임할 때 이런 프로그램은 끄지도 않고 하죠^^
또 핸드폰이나 PDA등에서는 적게는 1M미만 많아도 256메가 정도밖에 안해서 문제랍니다.
3.2 할당의 예1
전 결코 여려분의 머리속에 자그마한 짜증을 만들어드리고 싶지는 않아요 ㅎ
간단한것만 살펴보자고요^^
또 등장하는
int a;
선언문 이죠? 나 int 만큼의 메모리를 a라는 이름으로 쓸래! 라고 말하는거예요^^선언문하면 메모리에 4만큼이 할당된답니다. 아 재미있는건요 우리들이 지금 많이 쓰고 있는 컴퓨터는 32bit컴퓨터거든요? 32bit가 4바이트예요 그래서 4바이트 짜리인 int를 처리하는 속도가 제일 빠르답니다. 이제곧 64비트 컴퓨터가 대중화되면 8바이트가 제일 빠르겠죠? 그 때는 int가 8바이트예요 옛날 16비트 컴퓨터때는 int가 16비트 였답니다^^
이렇게 선언과 할당이 동시에도 일어나지만
동적할당이라는 부분에가면 정의, 선언 , 할당이 단계별로 이루어진답니다.^^
그 부분은 나중에 ^^
