<div><span style="font-size:9pt;line-height:1.5;">헷갈리기 쉬운 레퍼런스와 포인터 각각의 개념과 그 둘의 관계에 대해 적어 봤습니다.</span></div> <div><br></div> <div>* 오해를 방지하기 위해 레퍼런스(reference)에 대해 미리 언급을 하자면 여기서의 레퍼런스는</div> <div>c++에서 포인터와 동시에 사용하는 그 Reference를 직접적으로 지칭하는게 아닙니다.</div> <div>이론적인 개념으로서의 더 추상적인 의미의 레퍼런스를 말하는 겁니다.</div> <div><br></div> <div><br></div> <div>- 레퍼런스란?</div> <div>영어 뜻 그대로 "참조"라는 뜻입니다.</div> <div>참조는 대상이 있어야 의미가 있기 때문에 레퍼런스에는 항상 참조하고 있는 대상이 있게 됩니다.</div> <div>즉 레퍼런스 자체는 무언가를 참조하고 있는 놈이고 그 참조를 따라가면 대상이 나오게 됩니다.</div> <div><br></div> <div><br></div> <div>- 레퍼런스의 개념이 필요한 이유?</div> <div>효율성 때문에 그렇습니다.</div> <div>예를들어 설명하자면</div> <div>학술서적이나 논문 제일 뒤에 보면 참고 문헌이 나옵니다.</div> <div>본문에서 쓰인 이론적 바탕이나 인용문이 있는 문헌들입니다.</div> <div>그 문헌들을 사용할때 문헌 내용을 통째로 들고와서 논문 뒤에 붙이게 된다면 배보다 배꼽이 더 큰 상황이 됩니다.</div> <div>수십장의 논문을 쓰는데 참고문헌만 수백장이 붙어버리게 되는 형국입니다.</div> <div>너무나 비효율적입니다.</div> <div>그래서 이런 서적들에서도 레퍼런스를 사용하게 됩니다.</div> <div>실제 참조하고 있는 대상을 들고있지않고 그 대상에 대한 참조(여기선 제목, 저자 등의 정보)만 가지고 있는게 더 효율적입니다.</div> <div>컴퓨터 세계로 옮겨와서 이해해보면</div> <div>내가 사용하고 싶은 자료를 매번 통째로 가져와서 작업을 하면 공간을 크게 차지하니 공간 효율성이 떨어지고</div> <div>매번 내가 있는 장소로 모든 내용을 다 옮겨와야 하니 시간 효율성도 떨어지게 됩니다.</div> <div>대신 레퍼런스를 이용해서 자료가 있는 장소로 가서 해당 내용을 사용하면 됩니다.</div> <div>자료가 있는 장소로가는(역참조, dereference) 비용이 들지만 그 내용을 그대로 다 가져오는 비용에 비하면 훨씬 적습니다.</div> <div><br></div> <div><br></div> <div>- 포인터란?</div> <div>포인터는 레퍼런스의 구현 방법 중 하나입니다.</div> <div>포인터는 대상을 참조할 때 대상의 시작 메모리 주소를 이용하게 됩니다.</div> <div>포인터를 역참조(c에서는 * 연산자)하면 메모리상의 해당 주소로 찾아가게 되어 포인터의 대상 자료를 이용할 수 있게 됩니다.</div> <div>이런 구현방법은 만들기 나름이라서 대상을 찾아갈 수만 있으면 어떠한 방법을 써도 상관이 없습니다.</div> <div>앞선 서적의 예를 다시 들면 </div> <div>보통 참고문헌이 사용하는 레퍼런스 방법은 제목, 저자, 발표한 학회 등의 정보를 적어 두는 겁니다.</div> <div>다른 방법으로 구현하자면 모든 책에 고유한 일련번호를 붙이고 참고문헌에는 그 인련번호만 써두어도 가능할 겁니다.</div> <div> <div>(더 정확히 이야기 하면 포인터는 개발자에게 직접 메모리에 접근할 수 있는 방법을 제공하는 수단입니다.</div> <div>그리고 레퍼런스 기능은 그 메모리 접근 능력을 이용해 개발자가 직접 수행하도록 일임하는 겁니다.</div> <div>요즘의 언어는 레퍼런스 기능을 언어가 대신 수행해 줍니다.)</div></div> <div><br></div> <div><br></div> <div>- 레퍼런스와 포인터의 관계</div> <div>포인터는 레퍼런스의 구현방법 중 하나이기 때문에</div> <div>포인터는 레퍼런스라고 할 수 있습니다.</div> <div>하지만 레퍼런스를 포인터라고 하면 곤란합니다.</div> <div><br></div> <div><br></div> <div>- 포인터가 없는 언어에서의 레퍼런스</div> <div>대표적으로 자바와 같은 언어가 포인터가 없습니다.</div> <div>또 웹에서 주로 사용하는 자바스크립트에도 포인터가 없습니다.</div> <div>물론 이런 언어에서도 레퍼런스를 사용합니다.</div> <div>그런데 자바나 자바스크립트 사용하면서 레퍼런스에 대해 고민해본적 있나요?</div> <div>없을 겁니다.</div> <div>요즘 언어들은 레퍼런스의 사용방법을 사용자에게 노출시키지 않습니다.</div> <div>그걸 개발자가 일일히 생각해서 사용하면 실수할 여지가 많고 코딩이 복잡해지기 때문입니다.</div> <div>대신 해당 내용은 언어의 구현부분에서 사용자 모르게 은밀하게 처리 됩니다.</div> <div><br></div> <div><br></div> <div>- 그럼 포인터는 필요 없나?</div> <div>포인터는 메모리 단위로 매우 낮은수준의 컨트롤을 가능하게 해줍니다.</div> <div>때문에 높은 수준의 자유도를 얻을 수 있습니다.</div> <div>그래서 아주 잘만 쓴다면 언어가 직접 컨트롤하는 레퍼런스보다 더 효율적인 프로그램을 작성할 수 있게 됩니다.</div> <div>또한 하드웨어를 직접 조작해야하는 프로그래밍에서는 직접 메모리를 조작해야 하는 일이 많기 때문에</div> <div>여전히 그리고 앞으로도 사용하게 될 겁니다.</div> <div><br></div> <div><br></div> <div>끝.</div>