본문 바로가기
Computer Science

[C언어] 포인터를 사용하는 진짜 쉬운 이유.

by DuncanKim 2022. 6. 29.
728x90

[C언어] 포인터를 사용하는 진짜 쉬운 이유.

 

포인터는 초급 개발자의 뇌를 심각하게 트레이닝 시킨다.

이중 삼중으로 들어가는 포인터에 메모리 구조를 상기시켜야 하고, 이게 어디들어가는지, 누구를 참조하는 지 참 복잡하고 헷갈릴 때가 많다.  현재 나 또한, 그 과정 어디엔가 있는 것 같다.

 

이번 포스팅에서는 이전까지 다루어왔던 메모리 구조, 포인터의 정의에서 나온 말들을 하나씩 디스크 조각모음을 하여 왜 우리가 포인터에 대해서 알고, 어떻게 활용해야 할 지를 이야기 해 볼 것이다.

 

 

C언어는 개발자가 원하는 대로 메모리를 관리할 수 있다고 누구든 이야기를 한다. 그런 이점을 활용해서 메모리를 아낄 수 있고, 효율적인 프로그램을 개발자가 만들 수 있다고 많은 사람들은 결론을 짓는다.

 

그렇다. 그렇기 때문에 '포인터'가 활용되는 것이다. 메모리를 '관리'할 수 있는 것, 그리고 '절약' 할 수 있는 것. 두 가지의 키워드가 포인터의 출발이라고 할 수 있겠다.

 

포인터는 어떤 변수의 주소를 '가리키는' 것이다. 그렇기 때문에 그를 활용해서 가리키고 있는 곳의 변수를 변경할 수도 있고, 새로운 매개변수로 전달도 가능하다.

 

변수를 만들게 되면, 메모리의 어느 한 공간을 차지하면서 그 곳에 값을 기록하게 된다. 

 

이제 쉬운 예를 들어보자.

 

 

100만 명이 살고 있는 인구에 대한 데이터가 있다고 치고, main 함수 안에 어떤 배열에 집어 넣어놨다고 치자.

 

int main(){
	int people[1000000]; // 4,000,000byte = 3,906kb = 약 3mb
    
}

 

저 배열에 사람들의 '나이' 데이터가 들어가있다고 생각하고, 새로운 함수를 main 함수 밖에다 만들면 다음과 같다.

 

 

int ageavr(int age[]){
	//... 사람들의 나이를 합산하는 중....//
}

int main(){
	int peopleage[1000000]; // 4,000,000byte = 3,906kb = 약 3mb
    ageavr(peopleage);
}

 

포인터를 쓰지 않을 때, 메모리는 어떻게 활용이 될까? C에서는 main 밖에 정의 되어있는 함수를 main에서 호출할 경우에, 호출된 함수에서는 main에 이미 적혀 있는 변수들이 있다면, 그것을 볼 수 없게 되어 있다(C계열 언어들은 그러하다). 그렇기 때문에 호출된 함수에 넘겨주어야 할 데이터가 있다면, 모든 데이터를 복사해서 그 함수로 넘겨 주어야 한다. 이 경우 위의 코드에서는 3mb가 더 쓰이게 되는 것이다.

 

만약 여기서 포인터를 쓰게 된다면, 저렴한 가격, 8바이트에 참조할 배열의 값들을 불러올 수 있게 되는 것이다.

 

포인터를 처음 배울 때는 변수 한 두 가지를 가지고 배우기 때문에, 그 필요성을 좀처럼 느끼지 못할 수 있다. 그렇지만, 그것보다 더 큰 변수를 함수끼리 주고 받는다고 했을 때, 어떤 것이 더 공간에 있어서 효율적일까 생각해보면 답은 하나다.

 

C에서는 포인터를 써야 겠구나...

 

그리고 이 포인터를 활용해서 c와 c++에서 linked list, binary search tree 등의 자료구조를 만들 수 있다. 

 

 

결론 : 포인터를 사용함으로써 복사본을 만들지 않고 주소만 알려줌으로 해서 용량 및 처리시간에 이득을 볼 수 있다. 메모리가 한정적이거나 처리시간이 중요한 시스템에서 사용할 경우 도움이 된다.

 

일반적으로 듣는 이유들.

- 메모리에 직접 접근이 가능하다.
- 구조화된 자료를 만들어서 효율적인 운영이 가능하다.
- Call by reference 방식의 이용이 가능하다.
- 배열, 구조체 등의 복잡한 자료 구조와 함수에 쉽게 접근할 수 있다.
- 메모리 동적 할당이 가능하다.

 

위의 다섯 가지 이유가 맞는 말이지만, 이 포스팅은 맞는 말까지 가는 것에 대한 설명이라고 생각하면 되겠다.

'직접 접근의 이유' / '효율적 운영의 동작 원리' / 'Call by reference' / '자료구조와 함수에 쉽게 접근해서 얻는 이점, 방법' 등등을 세부적으로 이해해야 포인터에 대해 완벽하게 이해했다고 할 수 있지 않을까(근데 아직 난 100%로는 이해 못했다.).

 

 

 

'관리'와 '절약'의 측면에서 출발한 포인터.

더 큰 곳에서 쓰일 때 어떤 효능을 발휘할 지를 생각해보면 왜 필요한 지 답을 알 수 있다.

 

 

 

 

 

이 글은 지나가다 우연히 알게된

https://okky.kr/article/541436 comment by DaYoon

이곳의 영감을 받아 작성되었습니다. 감사합니다.

 

728x90

댓글