본문 바로가기
Programming Languages/C and C++

[Q&A/C++] 포인터(Pointer)란 무엇인가요?

by Henry Cho 2020. 3. 14.

포인터(Pointer)란 무엇인가요?


 



 

포인터란 무엇인가요?

Pointer라는 사전적 의미를 찾아보면 지표, 지점 등을 의미합니다. C++은 영어를 바탕으로 만들어진 프로그래밍 언어이다 보니 C++에서 포인터의 역할도 실제 포인터의 의미를 내포하고 있습니다.

포인터(Pointer)는 값(Value)이 저장되어 있는 지점을 나타내 주는 역할을 합니다. 그렇기 때문에 해당 값의 위치를 표시하는 기준인 주소(Address)라는 것도 존재하는 것이죠.  쉽게 말해서 한마디로 포인터는 "네가 찾는 값은 여기 주소에 있어"하고 알려주는 기능을 합니다.

예를 들어 아래의 코드는 값을 결괏값으로 나타내는 코드입니다.

<예제 코드#01>

#include <iostream>
using namespace std;

int main()
{
    cout << "Who is HOO C++ Programming" << endl << endl;

    int val1=13, val2=26, val3=39, val4=52;

    cout << "첫번째 값은 " << val1 << "입니다.\n";
    cout << "두번째 값은 " << val2 << "입니다.\n";
    cout << "두번째 값은 " << val3 << "입니다.\n";
    cout << "두번째 값은 " << val4 << "입니다.\n";

    return 0;
}

int 타입의 va1부터 va4까지 나와있는 걸 알 수 있습니다. cout을 통해 값이 출력되는 것도 확인이 됩니다. 이 코드를 이해하기 쉽게 추상적인 그림으로 표현을 해보자면,

그림#01: <예제코드#01>을 시각적으로 표현한 그림

이처럼 표현할 수가 있습니다. 포인터를 공부하다 보면 이해를 돕기 위해서 위와 같은 그림이 자주 나오지만 실제로 포인터가 저렇게 생긴 건 아니니 오해하지 않으시길 바랍니다. 왜냐하면 저도 처음 포인터를 배울 때 하도 특정 값이 들어가 있는 박스 형태로 알려주다 보니 더 헷갈리더군요.

Anyway, 포인터를 이해하기 쉽게 표현하기 위해 시각적으로 표현하자면 저런 박스 형태에 값이 나눠져 들어가 있는 걸 확인할 수 있습니다. 13이라는 값이 있는 박스는 val1에 해당하며, 26은 val2, 39는 val3, 52는 val4에 해당합니다. 포인터를 사용하지 않고 박스 안에 있는 값을 변경하기 위해서는 val1과 같이 변수명을 알고 있어야 변경이 가능합니다. 하지만 포인터를 사용할 경우 변수명을 모르거나 변수 자체에서 변경하지 않더라도 값을 변경할 수 있습니다. 그게 바로 주소입니다.

<예제 코드#02>

#include <iostream>
using namespace std;

int main()
{
    cout << "Who is HOO C++ Programming" << endl << endl;

    int val1=13, val2=26, val3=39, val4=52;

    cout << "첫번째 값은 " << &val1 << "입니다.\n";
    cout << "두번째 값은 " << &val2 << "입니다.\n";
    cout << "두번째 값은 " << &val3 << "입니다.\n";
    cout << "두번째 값은 " << &val4 << "입니다.\n";

    return 0;
}

위의 <예제 코드#02> 코드를 살펴보면 출력되는 값은 변수의 값이 아니라 전혀 듣도 보도 못한 값이 출력되어지는 걸 확인할 수 있습니다. &val1이라고 나타나 있는 저 코드는 val1의 주소 값을 의미합니다.

한마디로 <예제 코드#01>에서는 변수의 값을 출력했다면 <예제 코드#02>에서는 값을 저장하고 있는 주소 값을 출력하고 있습니다.  <예제 코드#02>의 주소를 그림 형태로 표현해보자면, 아래 그림과 같이 나타낼 수 있습니다.

그림#01: <예제코드#02>을 시각적으로 표현한 그림

여기서 유의할 점은 주소 값은 출력할때마다 바뀐다는 사실입니다. 13의 주소값인 00EFF900이 항상 13의 주소값이 아니라 출력할때마다 주소값은 변경됩니다. 따라서 포인터를 사용할 때 주소 값으로 변수를 찾는 것이 아니라 &, *을 통해 포인터를 사용합니다.

 

포인터를 왜 사용하나요?

포인터를 사용하는 가장 큰 이유는 효율입니다. 하나의 프로그램을 만들더라도 다양한 방법으로 프로그램을 만들 수 있습니다. 어떤 언어를 사용하느냐에 따라서도 달라지지만 같은 언어를 사용하더라도 어떤 방법으로 코드를 짜냐(=작성하느냐)에 따라서 달라집니다.

사실상 포인터를 모르더라도 누구나 프로그램을 만들 수 있습니다. 하지만 어떻게 코드를 작성하느냐에 따라서 해당 코드가 얼마나 효율적인지가 달라집니다. 예를 들어 같은 결괏값을 도출하더라도 C++에서 recursion과 iterator 중에서 어떤 걸 사용할 건지에 따라서 걸리는 시간은 달라집니다. 결괏값을 도출하기 위해서 컴파일 과정이 하루 동안 걸릴 일이 10분 만에 끝날 수도 있습니다.

따라서 포인터가 프로그램을 효율적으로 작동시키는 것의 기본이자 시작이라고 할 수 있는 것입니다. 개인적으로 포인터는 알고리즘을 배우는 시작점이라고 생각합니다. 포인터를 사용함으로써 프로그램의 작동시간을 줄일 수 있고 필요한 작업만 처리할 수 있기 때문에 이 점에서 효율적이라고 볼 수 있습니다. 

두 번째로는 개발자가 편리하다는 것입니다. 프로그래밍 언어는 개발자를 위해 개발된 언어입니다. 개발자가 보다 더 쉽고 빠르게 프로그램을 개발할 수 있는 환경을 제공해서 다양한 프로그램을 효율적으로 개발하고 관리할 수 있게 만든 것이 바로 프로그래밍 언어인 셈이죠. 포인터를 사용하면 프로그램 개발 오류를 찾아내는데 쉬울 뿐 아니라 프로그램 유지 관리 면에서도 필요한 부분만 수정하면 전체 코드가 변경되니 포인터를 익숙하게 다룰 줄 알면 심신이 건강해질 수 있습니다.

또한 제일 중요한 점은 포인터를 모르면 프로그래밍 개발을 못한다는 것입니다. "형 방금 전에는 포인터 몰라도 프로그래밍 개발할 수 있다고 했잖아"라고 할 수 있지만 현실적으로 불가능하다는 것입니다. 물론 혼자 프로그램을 만들고 포인터를 사용하지 않고 개발할 수는 있습니다. 하지만 현실적으로 프로그래머는 다른 사람들과 같이 프로그램을 개발하고 관리합니다. 다들 포인터를 사용하는데 본인만 포인터를 사용할 줄 모른다면 말 다한 셈이죠. 결국은 포인터 배워야 한다는 것입니다.


 

<예제 코드#01> 결과

그림#03: <예제코드#01> 결과

<예제 코드#02> 결과

그림#04: <예제코드#02> 결과


포인터 관련 글

 

[C++ Example#03] 포인터 예제코드

포인터 예제코드 #include using namespace std; int main() { cout << "Who is HOO C++ Programming" << endl << endl; double val1, val2; double* pointer; cout << "첫번째 값을 입력해주세요."; c..

whoishoo.tistory.com

 

728x90

댓글