포인터는 주소값을 담는 변수이다. C언어 강의중에서 가장 먼저 포기하는 사람이 나오는 지점이 바로 '포인터'를 배울 때다. 왜 포기하냐고 물으면 포인터라는 개념이 잘 와닿지가 않는다고 한다. 또는 개념은 어떤 느낌인지 잘 알겠는데, 실제로 사용하려니 헷갈리는 사람이 많다고 한다.
개념이 와닿지 않아요.
개념이 잘 와닿지 않는 이유는 컴퓨터의 기본 원리를 이해하지 못하고 있기 때문인데, Deep하게 파고 들지 않더라도, 충분히 이해할 수 있는데도 불구하고 포기하는 사람이 많다. 포인터에서 자주나오는 용어인 메모리(Memory)와 주소(Address)라는 용어가 잘 이해가지 않는다면 아래 설명을 천천히 머릿속으로 떠올려보자.
나는 수학공부를 하고 싶다. 수학공부를 하기 위해 책장에 꽂혀있는 '수학의 정석' 책을 꺼내서 책상위에 펼쳐야 한다.
이걸 다시 컴퓨터의 원리로 대입해 보자.
나는 파워포인트 프로그램을 실행하고 싶다. 파워포인트를 실행하기 위해서는 하드디스크에 저장된 파워포인트 프로그램을 꺼내서, 메모리에 올려놓아야 한다.
대충 무슨 느낌인지 알겠는가? 당신이 바탕화면에 있는 파워포인트를 실행시키면, 컴퓨터는 알아서 하드디스크에 저장된 파워포인트 프로그램을 꺼내서 메모리라고 불리는 공간에 불러온다. 메모리에 불러오고나서야 컴퓨터는 모니터에 파워포인트 화면을 띄워준다.
메모리라는 공간은 아까 비유했듯이 책상과 똑같다. 책장에 아무리 수많은 책들이 꽂혀있어도, 내가 책을 보기위해서는 책상위에 올려놔야한다. 여기서 책상이 엄청 크다면 어떻게 될까? 책상이 운동장만하다고 상상해보자. (나는 제자리에서 책상 끝과 끝을 볼수있는 능력을 가지고 있다고 가정하자)
책상이 운동장만하니, 수많은 책들을 펼쳐놓고 나는 제자리에서 살펴볼 수 있다. 이런 경우를 메모리의 공간이 크다 라고 말한다. 만약 운동장 만한 책상에 책 한권만 펼쳐놨다면, 메모리의 공간이 넉넉하다 라고 말할 수 있을 것이다. 운동장만한 책상에 책들을 빼곡히 펼쳐놔서 더이상 펼쳐놓을 곳이 없다면 메모리의 공간이 부족하다 라고 말할 수 있을것이다.
메모리의 공간이 부족하다. 어디서 많이 들어보지 않았나? 메모리 정리, RAM 최적화 등등 휴대폰과 컴퓨터를 빠르게 하기 위해 한번쯤은 실행해봤던 기능들에서 봤던 문장들이다. 즉 프로그램을 실행시키면 일정 공간의 메모리를 사용하게 된다. 여러 프로그램을 동시에 사용한다면 그만큼 메모리의 공간이 비좁아질 것이다. 메모리는 21세기에 스마트폰과 컴퓨터를 사용한다면, TV, 세탁기, 전자레인지, 밥솥, 디지털시계 등... 회로가 탑재된 전자기기를 사용한다면 당연히 사용되고 있는 필수 부품이라고 볼 수 있다.
실제 메모리 공간은 위 사진처럼 책상을 칸막이 쳐서 나눠놓은 형태로 구성되어 있다. 독서실에 0번자리, 1번자리, 2번자리... 나눠놓은 것처럼 메모리도 0번지, 1번지, 2번지... 이렇게 나눠놓는다. 효율성을 위해 나눠놓은 것이다.
자 이제 C언어를 통해 이해해보자. int a = 10; 이라는 문장은 a라는 변수에 10을 저장한다는 의미다. 이 a라는 변수는 메모리 공간 특정 영역에 저장이 된다. 편의상 0번지에 저장된다고 생각해보자. int* ptr = &a; 라는 문장은 a라는 변수의 주소값을 ptr이라는 변수에 저장한다는 의미다. 즉 int* ptr = 0번지; 라는 문장과 똑같다. ptr이라는 변수에는 10이라는 정수가 아닌 0번지라는 주소값이 저장되어있다.
우리는 이제 a라는 변수와 ptr이라는 변수를 사용해 똑같이 0번지에 있는 10이라는 정수값을 다룰 수 있게(handle) 되었다. 아니 그냥 변수를 사용하는거랑 다름없는데 굳이 이렇게 사용하는 이유가 뭐야? 라고 물을 수 있다. 그 이유는 C언어를 더 공부하다보면 함수를 통해 변수를 조작하는 경우가 반드시 생길 것이며, 그때 call by value와 call by address의 차이를 깨우치며 필요성을 느낄 것이다. 또한 포인터는 동적할당에도 유용하게 쓰이며, 일반적인 컴퓨터공학과 2학년에 배우는 자료구조 과목에서 마르고 닳도록 사용할 것이다. 한마디로 정의하자면 "포인터는 유용하니깐!" 쓰이는 것이다.
'정보기술 > C \ C++' 카테고리의 다른 글
[C] 포인터가 헷갈리는 이유! ! 별표(*)가 문제다. (0) | 2021.01.09 |
---|---|
Ubuntu C/C++) Command g++ not found 해결법 (0) | 2021.01.06 |
Visual Studio Community 2015 / Visual Studio Code 다운로드 방법 (0) | 2016.11.28 |
Dev C++ 다운로드 및 설치 , 초기 실행법 (1) | 2016.11.22 |