[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
이곳의 영감을 받아 작성되었습니다. 감사합니다.
'Computer Science' 카테고리의 다른 글
[C언어] 배열 기초개념과 포인터로 배열 참조하기 (0) | 2022.07.01 |
---|---|
[C언어] 다중포인터 구현해보기 (0) | 2022.06.29 |
[C언어] 포인터 기본 개념 알아보기 (0) | 2022.06.27 |
[C언어] C언어의 메모리 관리 (0) | 2022.06.27 |
운영체제 32비트와 64비트의 차이점 (0) | 2022.06.27 |
댓글