멘토지원
파트너스
현직자 클래스
멘토 찾기
Best 질문답변
개발자에게 ‘포인터’가 중요한 이유가 뭔가요?
네이버 · 검색시스템
약 5년 전
💬 멘티의 질문
멘토님, 안녕하세요. 전산 기초 공부를 하던 중 *포인터에 대해 궁금한 게 생겨서 질문드립니다.
 
제가 알고 있는 포인터의 개념은 마치 보물 지도처럼 보물을 숨겨둔 위치를 알려주는 것인데요. 원하는 데이터가 저장되어 있는 주소 값을 알려준다고 이해하고 있습니다. 즉 '포인터를 활용하여 메모리 공간을 연속적으로 할당하지 않아도 주소 값을 이용해서 데이터들을 연결시킬 수 있다' 정도입니다.
 
Ⓒalex knight

포인터가 굉장히 중요한 개념인 것 같고, 자바 같은 경우도 포인터를 기본 베이스로 하고 있다고 들었는데요. 포인터가 왜 중요한지 그리고 더 깊게 알기 위해서는 어떻게 해야 하는지 등이 궁금합니다.
 
질문 들어 주셔서 감사드리며, 답변 기다리겠습니다.
 


*포인터 : 포인터(pointer)는 프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간 주소를 가리키는 변수를 말한다. 포인터가 가리키는 값을 가져오는 것을 역참조라고 한다. 포인터는 어셈블리, C, C++, 파스칼 등 하위 레벨까지 제어할 수 있는 언어에서 주로 많이 쓰이며, 모듈라-2, 에이다와 같은 언어에서는 극히 제한적으로 사용되고, 자바, 에펠 등에서는 완전히 숨겨져 사용할 수 없다.

💬 이세린 멘토의 답변

멘티님, 안녕하세요. 반갑습니다. ‘프로그래밍의 기초’ 쪽 공부를 하고 계시군요. 포인터의 개념이 잘 이해되지 않기도 하고, 또 어렵기도 하죠? 말씀하신 것처럼 포인터는 모든 분들이 C 기반 프로그래밍을 배울 때 처음으로 마주치는 장벽인 것 같아요.
 
포인터가 무엇인지에 대해서는 인터넷에도 저보다 가르치는 능력이 뛰어나신 분들이 많으니 이는 생략하도록 하고요. 질문하신 것에 집중해서 1)왜 중요한지와 2)깊이 공부하기 위한 방법에 대해서 말씀드리겠습니다.
 
본격적으로 설명해 드리기 전에, 제 답변은 완전한 진리라기보다는 제가 바라보는 관점에서 중요한 것이라고만 봐주시면 좋을 것 같습니다. 제 답변이 멘티님이 이해하는 데 도움이 될 수 있기를 바랍니다.

Ⓒfabian grohs

포인터를 사용해 ‘소프트웨어 비용’을 줄일 수 있어요

그럼 첫 번째로 ‘포인터가 왜 중요한가’에 대해 말씀드릴게요. 결론부터 말씀드리면, 데이터를 조작하기 위해 개발자가 명시적 또는 프로그래밍 내부적으로 사용하는 개념이기 때문입니다. 이를 좀 더 설명하기 위해 우리가 프로그래밍을 통해 무엇을 하는지를 살펴볼게요.
 
우리는 프로그래밍을 통해서 입력 데이터를 원하는 출력 데이터로 변화시키려고 합니다. 결국 프로그래밍은 데이터를 조작하는 일과 직결되어 있어요. 프로그래밍 상에서 데이터를 조작하기 위해 데이터를 변수(Variable)에 저장하고, 프로그래밍 상에서 변수명을 작성합니다.
 
여기서 변수명은 메모리에 일부 공간을 가리키기 위해 지정한 이름이고, 포인터는 바로 변수 이름이 가리키는 그 메모리 주소를 저장하는 변수인 것입니다. 즉, 포인터 변수가 메모리 주소 데이터를 조작할 필요가 있을 때 사용해야 하는 변수이며 그렇기 때문에 이 개념을 알아야 하는 거죠.
 
여기까지는 아마 아는 내용일 수도 있는데요. 도대체 왜 메모리 저장소를 꼭 저장해야 하는지, 그게 언제 쓰이는지 물어보실 수도 있습니다. 그럴 땐 다른 값들을 저장하는 변수와 메모리 주소를 저장하는 포인터 변수와의 차이가 무엇일지 비교 분석을 해봐야 합니다.
 
가장 대표적으로 알려진 것은 이렇습니다. 포인터 변수는 메모리 주소를 가리키기 때문에 항상 저장해야 하는 값의 크기가 같고 그 주소에 바로 접근할 수 있는 특징이 있다는 거예요. 즉, '크기가 고정되어 있으며 접근 속도가 빠르다'라는 특징이 있는 거죠.
 
학생 때는 접할 수 있는 프로그래밍의 경험이 제한적이기도 하고, 소프트웨어의 비용 측면보다는 기능 측면의 중요성을 주로 배웁니다. 하지만 실무에서는 소프트웨어의 비용이 기능보다도 우선일 때가 많죠. 그만큼 중요한 개념입니다.
 
프로그램의 속도가 느리면 사용자가 떠나고, 프로그램의 연산이 무거우면 그만큼 서버를 늘려야 하니 비용이 발생합니다. 포인터를 사용하면 이런 부분을 크게 개선할 수 있으며 효율적인 연산이 가능해집니다.
그렇기 때문에 실제로 포인터의 개념을 알 때 더 빠른 솔루션을 제시할 수 있고요. 이것이 프로그래밍 언어를 통해 직/간접적으로 조작을 하는 이유라고 생각합니다.

Ⓒdrew coffman
 

자료를 여러 번 읽고, 실제로 개발해 보시길

그다음으로 깊이 공부하기 위한 방법에 대해 말씀드릴게요. 사실 포인터라는 개념을 아주 깊이 공부할 것까지는 없다고 생각합니다. 하지만 분명히 본인이 이해가 잘 되지 않는 개념을 이해하는 과정은 중요하고 또 꼭 필요하다고 생각해요.
 
이건 포인터뿐 아니라 어떤 개념이라도 잘 이해되지 않을 때 쓰면 좋은 방법인데요. 첫째, 해당 개념이 나온 교재를 7번 읽는다. 둘째, 인터넷이나 책을 통해 관련 자료를 찾아서 읽는다. 셋째, 이해가 되지 않아도 계속 찾고 읽어 본다. 넷째, 직접 사용해 본다.
 
직접 사용하는 방법에 관해 조금 더 설명해 드리면요. 포인터의 경우, C 계열의 언어로 이진 트리와 같은 단순하면서도 중요한 개념을 직접 개발해 봅니다. 그리고 Java로도 직접 개발해 보세요. 어떤 차이가 있고 포인터가 어떻게 쓰이며 왜 중요한지를 체득하실 수 있을 거예요.
 
또 교수님, 선배, 친구, 지인에게 많이 질문하시고요. 위에 말씀드린 방법들이 보다 효과적이려면 충분히 이해되지 않았더라도 새롭게 얻은 지식을 자신에게 편한 방식으로 정리해 두면 좋습니다.
 
하지만 갑자기 어떤 개념을 처음 접하면 관련 정보를 어떻게 찾아야 할지 모를 수도 있죠. 그래서 도움이 되고자 제가 찾은 자료들을 공유 드리도록 하겠습니다. 아래 링크를 참고해 주세요.
 
- 백준 알고리즘 게시판 : https://www.acmicpc.net/blog/view/32
- C 언어 코딩 도장 : https://dojang.io/mod/page/view.php?id=275
- 프로그래머 유튜버 포프TV : https://www.youtube.com/user/KimPopeTV/featured
 
제 답변이 도움이 되었기를 바랍니다. 즐거운 준비 과정이 되도록 응원할게요. 감사합니다.

이세린 멘토
네이버 · 검색시스템
IT개발/데이터
이미지 검색 팀에서 일하고 있습니다.
개발자
같은 직무를 다룬 글
IT개발/데이터
약 5년 전
인기 있는 글
연구/설계
약 5년 전
잇다의 멤버가 되어주세요 🚀
직무, 취업 콘텐츠를 담은   뉴스레터를 받아볼 수 있어요.
멘토에게 직접   질문할 수 있어요.
현직자 클래스를 무료로 수강할 수 있어요.