다음은 변수들의 야그입니다... 변수들이 포인터한테 심통이 났네요~ㅎㅎㅎ
번수1 : 야! 너 포인터라는 녀석 봤어?
변수2 : 움.
변수1 : 갸도 우리랑 같은 변수자나?
변수2 : 어. 맞어. 포인터도 변수지.
(여러분!! 포인터는 변수다. 아주 아주 중요한 개념입니다. 꼭 기억하세요. 포인터도 그저 변수일 뿐입니다.)
<?xml:namespace prefix = o />
변수1 : 그럼 그 녀석이 뭐길래 C 언어에서는 그렇게 귀빈 대접을 받아?
변수2 : 우리보다 기능이 많잖아.
변수1 : 무슨 기능?
변수2 : 프로그래머라고 다 같은 프로그래머가 아니잖아. C 언어만 잘하는 프로그래머도 있고, C++까지 할 줄 아는 프로그래머도 있잖아.
변수1 : 그럼 포인터만 있어도 되겠네. 우린 조용히 사라져 주자.
변수2 : 아냐. 포인터와 우리가 다 변수이긴 하지만, 포인터가 우리의 기능을 대신 해주지는 않아.
변수1 : 포인터랑 우리의 차이점이 뭔데?
변수2 : 너 혹시 우리가 5를 저장하면, 5가 어디에 저장되어 있는지 아니?
변수1 : 하드 디스크에 저장되는 거 아냐?
변수2 : 아닌데.
변수1 : 그럼 컴퓨터에 저장되어 있겠지.
변수2 : 맞아. 컴퓨터에 저장돼.
변수1 : 5가 어디에 저장되는지는 왜 묻는데?
변수2 : 그걸 알아야 포인터라는 애를 이해할 수 있거든.
변수1 : 컴퓨터는 CPU, 메모리, 하드디스크, CD-ROM, 키보드, 모니터, ... 이런 애들로 되어 있잖아.
변수2 : 그렇지.
변수1 : 그럼 5가 어디에 저장되는데?
변수2 : 메모리에 저장되지.
변수1 : 아하. 메모리의 용량이 128이니 256이니 하는 것이 그것이구나. 그럼 우리는 지금 메모리에 있는 거네?
변수2 : 맞아. 너랑 나랑은 지금 메모리에 있지.
변수1 : 메모리의 어디에 있는데?
변수2 : 어... 아마도 중간쯤에 있는 것 같은데.
변수1 : 중간쯤 어디? 사람들처럼 번지수는 없어? 내가 아는 사람은 330번지에 살고 있는데.
변수2 : 그렇지.. 잠시만 확인해 보고,,, (컬러링 소리 들린다. 어딘가 전화를 거는 듯) 네.. 네.. (알았다는 듯이 대답한다) 아하.. 우리가 있는 컴퓨터는 256MB의 메모리를 갖고 있는데, 우린 지금 컴퓨터 메모리의 중간쯤에 있고, 너는 136314880 번지에 있고, 나는 136314884번지에 있다네.
변수1 : 뭔 번지가 그리 커? 도대체 우리가 사용할 수 있는 번지가 어떻게 되는거얌?
변수2 : 256MB의 메모리는 0번지부터 268435455번지까지 사용할 수 있어.
변수1 : 그럼 나는 항상 136314880번지에 있는 거야?
변수2 : 아니야. 누군가가 그 번지를 이미 사용하고 있으면, 너는 다른 번지를 써야 해.
변수1 : 그건 누가 결정하는데? 내 맘대로 번지를 결정할 수 없어?
변수2 : 그걸 결정하는 건 운영체제야. 운영체제는 너 뿐만 아니라, 실행되고 있는 모든 프로그램의 함수 및 변수의 메모리를 관리하고 있어. Windows 95/98/Me/2000/XP를 모두 운영체제라고 하지.
변수1 : 그런~거야? 진~짜야?
변수2 : 당연하지!!!
변수1 : 우린 이름이 있잖아. 나는 int i; 너는 int j;
변수2 : 그렇지.
변수1 : 그럼 i = 5; 그러면, 136314880번지에 5가 들어가 있겠네?
변수2 : 물론이지. 컴퓨터 뚜겅 열고 확인해 봐.. 5가 136314880번지에 들어가 있는지... ㅋㅋ
변수1 : 그럼 136314880 = 5; 라고 해야 되는 거 아냐? 그래야 136314880 번지에 5를 넣지.
변수2 : 옛날에는 그렇게 했어. 136314880 = 5; 라고.
변수1 : 그럼 지금은 왜 그렇게 안 해?
변수2 : 촌스럽기는. 옛날에는 0~100번지까지 밖에 없어서 번지를 외우기가 쉬웠어. 하지만 지금은 번지수가 너무 많아서 일일이 번지를 외우기가 힘들어. 그래서 번지 대신 변수라고 만들어서 사용하는 거야. 변수는 번지를 대신해서 사용되는 별명 정도 되겠네.
변수1 : 음~ 알겠다. 그럼 번지 대신 내가(i가) 사용되는 거네.
변수2 : 맞아. 너를 쓰면, 너가 번지를 대신하지. 컴파일러라는 거 있잖아. 혹시 알어?
변수1 : 알지.
변수2 : int i; 이렇게 선언하면, 컴파일러가 너를 어느 번지에 넣을 지 다 계산해 줘. 그러니까 그냥 변수명만 쓰면 돼.
변수1 : 음.. 알겠다. 난 그럼 번지 대신 쓰이고 있구나.
변수2 : 맞아. 번지를 외우기 힘드니까 너를 대신 쓰는 거야.
변수1 : 고마워~~~ 사당해(사랑해의 3살 버전)
다음 이야그는 옛날 옛적 호랑이가 담배 필 때 변수와 포인터의 사랑 야그입니다.
포인터님이 로그인하였습니다...
변수야 : 포인터야 나랑 사귀자.
포인터 : 싫어.
변수야 : 왜?
포인터 : 넌 너무 단순해. 나만큼 기능도 없고.
변수야 : 왜? 우리가 달라?
포인터 : 마이 달라... (포인터는 머리에 꾳(*) 을 꽂고 다니죠.. ㅋㅋ)
변수야 : 너도 변수잖아?
포인터 : 그렇지 난 변수지.
변수야 : 그런데 뭐가 많이 다른데?
포인터 : 변수이긴 하지만 너처럼 숫자 놀이를 하진 않아. 1 + 1은 2, 2 * 3은 6. 이런 건 너네 변수들이나 하는 거야.
변수야 : 너도 숫자 값을 저장하고, 나도 숫자 값을 저장하잖아. 근데 뭐가 달라?
포인터 : 너는 단순하게 숫자만 저장하잖아. 내가 저장하고 있는 건 숫자가 아니라, 너가 저장되어 있는 번지야. 메모리 번지. 너는 메모리 번지를 저장하지는 않잖아.
변수야 : 너는 그럼 우리처럼 단순 숫자를 저장하지는 않니?
포인터 : 할 수는 있는데, 그렇게 안 해. 그런 단순한 건 너와 같은 변수나 하는 거야.
변수야 : 메모리 번지는 왜 저장하는데?
포인터 : 만약 내가 너의 메모리 번지를 저장하고 있으면, 너의 값을 마음대로 조정할 수 있게 돼. 너의 번지에 가서 값을 바꿀 수도 있고. 너가 머하고 있는지 다 알 수 있어.
변수야 : 진짜야? 내가 값을 100으로 바꾸면 그걸 너가 안단 말야?
포인터 : 당연하지. 내가 너의 번지를 알아내면, 넌 끝이야. 내가 너를 마음대로 컨트롤 할 것이니까. 너는 나를 볼 수도 없고 만질 수도 없어. 그러니까 조심해.
변수야 : 야.. 너 무섭다... 남의 번지에 와서 값은 왜 바꾸고 난리야?
포인터 : 그러니까 내가 C 언어에서 최고급 대우지. 다들 나에 대해서 알려고 난리잖아. ㅋㅋㅋ
변수야 : 부럽다. 나도 너처럼 포인터 할래.
포인터 : 그래? 어렵지 않아. 별모양의 특수 모자 하나만 쓰면 너도 나처럼 돼. 나처럼 머리에 꽃 꽂아.. ㅋㅋ
변수야 : 어떻게?
포인터 : 궁금하지? 나중에 거하게 쏘면 알려주지. 인생 머 있어? 마셔. 인생 술이야. ㅋㅋㅋ
변수야 : 오케이. 언제 시간 나는데.. 날 잡아.. 내가 쏠께.
다음은 포인터가 변수를 겁주는 장면입니다.
변수야 : 나는 Jane입니다. 나는 int Jane = 100;에 의해 태어났습니다. 나는 지금 100을 저장하고 있습니다. 내가 저장되어 있는 번지는 30000번지 입니다.
포인터 : 나는 투명인간입니다. 나는 메모리의 어느 번지든 마음대로 돌아다닐 수 있습니다. 나의 이름은 pointer입니다. 어느 변수든 나한테 걸리면 갸의 생명은 거서 끝납니다.. 내가 값을 막 바꿔버릴꺼에염... ^^
변수야 : 야! pointer. 머하냐?
포인터 : 아무것도 안하는데.
변수야 : 심심하지 않아?
포인터 : 왜? 너네 번지에 놀러갈까?
변수야 : 아니.. 오지마.. 와서 내가 저장하고 있는 값을 마구 바꿔 놓을라구?
포인터 : 딱 한 번만 바꿀께.
변수야 : 안돼.. 오지마...
포인터 : 너가 오지 말랜다고 내가 못 갈 줄 알아?
변수야 : 내가 번지를 알려 주지 않으면 되잖아.
포인터 : 너가 번지를 알려 주지 않아도 다 아는 수가 있지.
변수야 : 어떻게? 내가 몇 번지에 있는지 보여?
포인터 : 어. 보여.
변수야 : 몇 번지에 있는데?
포인터 : 30000 번지에 있네.
변수야 : 그걸 어떻게 알았어?
포인터 : 너의 이름만 알면, 너가 있는 번지를 알아내는 것은 식은죽 먹기지... ㅋㅋ
변수야 : 내 이름만 알면 된다고?
포인터 : 어... 너의 이름만 알면 내가 마법 연산자를 써서 너의 번지를 알 수 있지.
변수야 : 마법 연산자? 그게 뭔데?
포인터 : 키보드에 보면 숫자 7이 있잖아... 그 위에 요렇게(&) 생긴 애가 바로 마법 연산자야.
변수야 : &를 캭 없애 버릴까부다.. ㅠ.ㅠ
포인터 : 그래? 그럼 C 언어도 없어지는 거야... C 언어는 &가 반드시 필요해.
변수야 : OTL. 어떻게 나의 번지를 구했는지 말해봐!
포인터 : ㅋㅋㅋ 너의 이름이 Jane이잖아. 너의 이름에 &를 갖다 대면 너의 번지가 보여.
변수야 : 어떻게?
포인터 : &Jane; 이라고 너의 이름에 마법 연산자 &를 갖다 대면 되지.
변수야 : 허무하다... 마법 연산자 하나에 나의 모든 기능을 넘겨 줘야 하다니. 그럼 다른 변수도 마법 연산자만 갖다 대면 모두 번지가 보여?
포인터 : 어 보여.
변수야 : 그럼 내 친구 친절한 금자씨 번지 보여?
포인터 : 금자란 이름은 한글이잖아. 촌스럽게. 우리 유학파는 영어만 써.
변수야 : 갸도 이름이 있어. Juliet. 갸 남친이 Romeo야. 삼촌은 Shakespeare랴.
포인터 : 수리 수리 마수리... 꿍따리 샤바라... 우쌰.. 우쌰... &Juliet....... ㅋㅋㅋ 어디에 있는지 번지를 알아냈어. 거기에 있었구만... 고마워.. Juliet이 뭐하고 있는지 구경가야겠다. 또 니 친구 이름 알려 줘.. 다 가보게..
변수야 : 싫어.. 이젠 이름을 안 알려 줄꺼야.. 이름만 알면 너가 다 가볼꺼 아냐.. 자꾸 그러면 삼촌한데 너 신고할꺼야.. 자꾸 남의 번지에 돌아다닌다고.
포인터 : 알았어.. 너한테 허락 맡고 할께...
이상 대화 내용을 정리해 보면, 변수가 두 개 있는데, 하나는 일반 변수이고 하나는 포인터 변수입니다. 포인터 변수는 아래와 같이 머리에 빨간꽃을 꽂아주면 태어납니다. 일반 변수를 포인터 변수로 선언하려면 변수명한테 꽃을 꽂아 주세요. 포인터라는 애는 태어날 때부터 머리에 꽃을 꽂고 있기 때문에 하는 행동도 이상한 행동만 합니다.
int Jane = 100;
int Juliet = 200;
int* pointer; // int* pointer;
포인터 변수 pointer는 다른 변수들의 번지를 저장하는 기능이 있으며, 다른 변수의 번지를 저장하기 위해서는 마법 연산자 &를 사용합니다. &연산자는 번지 지정 연산자라고 합니다.
일반 변수의 이름에 &를 갖다 대면, 그 변수의 번지가 나오므로, 다음과 같이 pointer에 Jane의 번지를 구해서 넣을 수 있습니다.
pointer = &Jane;
pointer는 이제 Jane의 메모리 번지를 갖고 있고, 언제든지 Jane의 메모리 번지에 접근해서 값을 바꾸거나.. 읽어 올 수 있습니다.
다음은 포인터가 Jane의 번지에 접근해서 값을 200으로 변경하고, Jane의 값을 읽어오는 것입니다.
변수2님이 로그인하였습니다...
변수야 : 내가 저장되어 있는 번지를 너가 알았으니까 이제 나의 번지에 접근할 수 있겠네?
포인터 : 어.
변수야 : 나의 번지에 어떻게 접근하는데?
포인터 : 또 다른 마법 연산자기 있지... ㅋㅋㅋ
변수야 : 마법 연산자가 또 있다고?
포인터 : 응... 우리는 그거 없으면 시체야... 아무 것도 못해.. 그거 없이는.
변수야 : 그게 뭔데?
포인터 : 응... 너가 곱셈할 때 사용하는 거 있잖아... 별모양(*)
변수야 : 그거 곱셈하라고 있는 거잖아?
포인터 : 어.. 너한테는 그렇겠지.. 나한테는 아냐.. C 언어를 만든 데니스리치 아저씨가 나한테는 다른 기능으로 쓸 수 있게 해 줬어.
변수야 : 그럼 너는 별(*)로 곱셈을 안 해?
포인터 : 난 그런거 몰라.. 곱셈 따위는.
변수야 : 그걸 어떻게 사용하는데?
포인터 : 별(*)을 나한테 갖다 대면 돼. 그럼 너가 저장되어 있는 번지에 갈 수 있지.
변수야 : *pointer 이렇게?
포인터 : 맞아.. 나의 이름에 살짝 갖다 대면 너의 번지로 날아가지~
변수야 : 너는 &랑 *랑 없으면 아무 것도 아니네...
포인터 : 너도 별(*) 없으면 곱셈 못하잖아.
변수야 : 그럼 나한테 200으로 넣어 봐.
포인터 : 간단하지.. 그거야.. 수리 수리... *pointer = 200; 확인해 봐.. 들어 갔는지.
변수야 : printf( "%d", Jane ); ... 헉... 내가 200으로 바뀌었네... 오 마이 가뜨~!!!
포인터 : ㅋㅋㅋ 내가 너 대신 너의 값을 확인해 볼까?
변수야 : 해봐.
포인터 : printf( "%d", *pointer ); .... ㅋㅋㅋ 살짝 갖다 대면.. 너의 번지에 가서 값을 꺼내오지.
변수야 : 그럼 너가 이제 내 대신 다 해라... 난 잘꼬얌...
포인터 : 알따.. 너가 쓰이는 곳을 다 *pointer라고 바꾸면 되겠네...
변수야 : 내 번지는 printf( "%d", &Jane ); 이야.. 너가 갖고 있는 값이 이거랑 같은지 확인해 봐.
포인터 : printf( "%d", pointer );... ㅋㅋ 맞아.. 너의 번지가. 내가 번지를 갖고 있는 변수잖아.
[프로그래밍] FileWriter 클래스 (0) | 2016.11.11 |
---|---|
[프로그래밍/개념] MFC, API 차이 (0) | 2016.11.03 |
[프로그래밍] 10. typedef (0) | 2016.10.07 |
[프로그래밍] 9. 조건부 컴파일 (0) | 2016.10.07 |
[프로그래밍] 8. Macro (0) | 2016.10.07 |