게임 기획 제련소
article thumbnail

포인터(Pointer) : 가리키는 것 또는 가리키는 사람

포인터는 C언어의 꽃(🌷)이자, C언어를 처음 공부하는 학생들에게 발목을 잡는 파트이기도 하다. 나 또한 처음 배울 때 많이 헤맸다..😅

그래서 포인터를 배우면서, 사용하면서 도대체 '포인터는 왜 쓰는 거야?? 그냥 값을 사용하면 되지, 왜 주소를 이용해서 사용하는 걸까?🤬'라는 생각을 하게 했다. 여러 가지 글을 읽어보아도 명확하게 해답을 찾지 못했고, 내가 공부한 것을 토대로 '포인터와 컴퓨터 구조의 관계'라는 제목으로 포스팅을 하게 되었다.(사실 기본이론적인...)

(혹시나 저의 글에 오류가 있다거나 참고하면 좋을 사이트 및 동영상이 있다면 공유 부탁드립니다. 감사합니다.)

 

 

포인터???🤔

포인터는 영문으로 'Pointer'이며, 한국어로 번역 시 '가리키는 것', '가리키는 사람' 정도로 해석이 된다.

또한, 포인터는 간단하게 '변수'라고 알고 있으면 편하다.. 그렇다면, '일반적인 변수와 무슨 차이냐!'라고 생각할 수 있다.  일반 변수는 정말 일반적인 값을 저장하는 변수이고, 포인터 변수는 메모리 주소를 저장한다. 모든 변수는 포인터 타입의 변수를 선언할 수 있지만, int 변수의 주소는 반드시 int 타입의 포인터에 저장을 해주어야 한다는 것.

또한, 포인터는 자기 스스로 아무런 일도 못한다는 점도 인지할 필요가 있다. 반드시 다른 변수의 메모리 주소를 가지고 있어야 일을 할 수 있으니.. 그래서 그 메모리 주소로 찾아가 값을 제어할 수 있다.

 

 

 

메모리 주소🏠

포인터가 무엇인지 대략 설명하면서 포인터 변수는 메모리 주소를 저장한다고 했다. 그럼, 메모리 주소는 뭘까? '메모리 주소(memory address)는 메모리 위치에 대한 식별자로, 컴퓨터 프로그램이나 하드웨어 장치가 데이터를 저장하고 나중에 이를 가져오는 장소이며, 일반적으로 이는 이진 형태의 숫자로 되어 있다'라고 명시되어있다. 그렇다면, 우리는 메모리 주소를 포인터처럼 구분 지으며 사용할 수도, 안 할 수도 있을까?? 정답은 우리가 컴퓨터로 하는 모든 작업은 내부적으로 메모리의 주소를 사용하고 있다.

 

 

 

CPU와 메모리(주소버스)

포인터를 설명하면서 CPU와 메모리에 대한 이야기를 하지 않을 수 없을 것 같다. 

CPU(중앙처리장치)는 입력장치로부터 변환된 데이터를 처리하는 것으로 사람의 신경망에 해당이 되고 유일하게 연산처리를 하는 부분이라고 보면 된다.

컴퓨터 시스템의 기억장치인 메모리는 컴퓨터가 다루는 모든 데이터를 저장해 두는 것으로 사람의 뇌에 해당한다.

 

그렇다면, CPU와 메모리는 어떻게 데이터를 주고받을까??? 위 그림은 CPU와 메모리가 데이터를 주고받는 과정을 나타낸 그림이다.

 

CPU가 특정 데이터를 메모리에 요청할 때, CPU는 메모리에 해당 데이터가 위치한 주소를 주소 버스를 통해서 보내준다. 그러면 메모리가 데이터를 찾아 CPU가 요청한 데이터를 데이터 버스를 통해 보내준다. 

저장을 할 때도 마찬가지이다! CPU가 데이터를 저장하고 싶은 위치의 주소를 먼저 보내고 해당 위치에 저장을 하는 것. 

즉, CPU가 메모리와 데이터를 주고받을 때는 주소(포인터)를 사용한다. 그래서 컴퓨터가 내부적으로 이렇게 동작하고 있기 때문에 우리가 C언어에서 사용하는 '포인터 변수'에 대한 근본적인 개념도 여기서 왔다고 보면 된다.

 

 

 

포인터의 장점❓❓

위에서 포인터의 개념을 알았다. 그러면, 포인터는 어떤 장점이 있을까? 포인터의 특징은 주소를 저장하고 있는 변수이니, 해당 데이터가 어떤 위치에 있던지 간에 주소를 가지고 있으면 바로 데이터를 찾아서 값을 제어할 수 있다. 아마 포인터의 장점이라고 묻는다면 모두 '포인터의 효율성'을 언급할 것 같다. 

하지만, 포인터는 어떤 주소든 가리킬 수 있는 변수이니 주소를 잘못 넣었을 때 프로그래머가 소유하지 않은 메모리를 쓸 수 있기 때문에 예상하지 못한 버그가 발생할 수 있다는 점 또한 유의하여야 한다.

 

포인터를 처음 이해할 때 주소를 가지고 값을 제어하는 것이 어떤 의미 인지 컴퓨터 구조적인 측면에서 포스팅을 해보았다. 포인터를 사용 및 이해할 때 컴퓨터의 동작 방식을 이해하고 나면, 왜 주소 값을 통해 데이터를 조작할 수 있는지 이해가 어느 정도 될 것 같다.

 

 

참고 사이트

홍정모교수님 YouTube

포프TV

주소버스, encyclopedia2.thefreedictionary.com/address+bus

IT기술노트, wikidocs.net/65521

'🧠프로그래밍 > C++' 카테고리의 다른 글

BitOperator  (0) 2023.03.02
C++의 Bit  (0) 2023.03.01
개체? 객체?  (0) 2023.03.01
레퍼런스  (0) 2022.10.28
포인터 이해하기  (0) 2022.10.27
profile

게임 기획 제련소

@악마반장

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!