수많은 학생들에게 포인터는 넘사벽을 선사했고, 프로그래밍을 중도 포기시켰다.
보통 포인터는 C교재 중반부 챕터에 들어가 있다. Stephen Prata의 저서 C기초 플러스에서도 1000페이지가 조금 넘는데 450페이지에 들어가 있다. 이른바 마의 구간인 것이다.
*C기초 플러스 : 훌륭한 교재다.
포인터 챕터를 건너뛰고 C언어를 배운다는 것은 사실상 불가능하다.
그건 객체지향을 건너뛰고 자바를 배울 수 없는 것과 같다.
사실 포인터나 객체지향이나 둘다 컴퓨터의 근본적인 질문들로 볼 수 있다.
다행히 지금은 컴퓨터 언어의 선택이 풍부해지고 IDE가 발달하여 C를 선택하지 않아도 되는 시대가 되었다. 그러나 C를 배워야 하는 사람들에게는 여전히 의문인 것도 사실이다.
왜 그런지 생각을 해봤다. 왜 아는 사람은 더 알게 되고, 모르는 사람은 모르게 되는 빈익빈부익부 현상이 일어난 것일까?
IT세계의 일반인 관점에서 바라보면 답은 없다. 그냥 잘하면 되는 것이다. 못한 사람이 능력부족이다. 하지만 그런 설명으로는 대중적인 공감을 갖기는 어렵다. C에 대한 과거의 해묵은 사고방식을 지금 개선해봐도 큰 의미는 없겠지만 의문을 해소하는 것은 좋은 것이다. 요즘은 유튜브 시대다. 빨래 잘하는 법, 고장난 문 수리하는 법 까지 손가락 몇개 움직여서 다 알 수 있다. 당연히 C언어의 pointer 에 대한 의문에도 많은 사람들이 친절하게 답을 내줬다.
포인터 챕터를 못 넘어가는 것은 컴퓨터 구조의 이해력 부족 때문이라 볼 수 있다. 사실 컴퓨터 구조는 매우 추상적인 세계다. 실제로 트랜지스터에 전기가 저장되는 것을 눈으로 본 사람은 없을 것이다. 과학자들이 연구와 실험을 통해 그 과정을 간접적으로 경험했겠지만 실제 전하 하나하나가 직접 눈에 보이지는 않는다.
마찬가지로 컴퓨터의 전원을 키면 조금 후 모니터에 운영체제 화면이 나온다. 메모리와 CPU가 어떻게 동작하는지 알 수는 없지만 사람들은 PC의 작동을 경험한다. 경험을 했으면 이해를 해야 하는데 본체를 열어보면 알 수 없는 기계 부품들이 사각형의 보드에 복잡하게 꽂혀있다. 알고 싶지도 않고 그냥 닫아 버린다. 작동만 잘되면 되는데 뭘.
C언어를 즐기려면 컴퓨터 구조에 대해서 좀 더 이해가 필요하다. 물론 이런 일에 보통의 재미는 없다.
NERD 의 영역 핵노잼임 요즘은 NERD가 인싸인 시대다
당연히 강요같은 것은 필요없다. 하지만 알고 싶은데 지금 좀 모르겠다. 그러면 생각해 볼 문제다. 다른 사람은 다 알고 나만 모르는 문제라면 나의 문제지만, 대다수가 모르는데 나도 모르면 이건 개선의 여지가 있다.
포인터를 알기 위해서는 크게 봤을 때 CPU와 메모리의 작동 방법을 이해하면 된다. 아주 자세히 이해하는게 아니라 컴퓨터 개론 정도의 수준에서 충분하다. 이러한 내용은 웹사이트와 유튜브에서 찾을 수 있다. 최근에 유튜브에서 자료를 찾으며 엄청나게 놀란 것들은 이러한 내용들은 정말로 뛰어나다는 것이었다. 웬만한 대학교의 강의보다 뛰어난 자료가 많다. 다만, 좋은 자료의 대부분은 영어다.
약간 미안한 마음이 들지만 이 블로그는 영어의 중요성을 매번 강조한다
IT기술의 자료는 대부분 영어로 쓰여져 있다
CPU 작동 원리. 매우 그래픽한 설명이다. 영어를 몰라도 영상만이라도 보면 느낌이 온다
컴퓨터 구조의 기본 모델은 알면 소프트웨어와 프로그래밍에 대한 이해가 깊어 진다.
테드강의 메모리는 어떻게 일하는가 (한글 자막, 좀 많이 쉽게 설명하는게 TED 특징이다)
*또하나의 방법은 어셈블리어다. 어셈블리어는 CPU의 손과 발을 직접 조작하는 법을 배울 수 있다. 레지스터에 값을 저장하고 누산하는 것. 프로그램의 실행코드 위치를 파악하고 메모리의 주소를 가져와서 값을 저장하는 법 등 기계어의 거의 모든 것을 알 수 있다.
어셈블리어를 배워야하는 이유? (어그로?)
최근에도 어셈블리어를 하는 프로그래머들이 많이 있다. 자기만 아는데 그치지 않고 지식을 전달하고 권장하는 모습이 좋다. 지식은 나누기 위해 배우는 것이다. 지식이 전달되고 세상이 발전하여 다시 나에게 이로움을 가져다 준다.
어셈블리어 같은 것으로 구독자를 늘릴려면 유튜브에 어그로를 끌어야한다
물론 어셈블리어는 가장 재미없는 언어일수도 있다. 반전은 그렇게 어렵지 않다. 컴퓨터 구조를 알면 오히려 C언어 보다 쉬울 것이다. 가장 원초적인 컴퓨터의 CPU를 다루기 때문에 복잡하지 않다.
어셈블리어가 뭔지 알면 C의 포인터의 개념은 이미 알고 있는 것이다. 어셈블리어가 더 하위언어기 때문에 당연히 기계의 동작을 더 잘 알 수 있다.
포인터를 배우기 전에 준비할 것 여러 챕터를 배워야 겠지만 가장 중요한 것은 컴퓨터 구조에 대한 이해라고 말할 수 있겠다. 구조를 모르면 아무리 이야기 해도 무슨 말인지 모른다. 왜 그렇게 데이타를 저장하는 건지? 주소같은 것을 가져와야 하는건지. 그냥 변수를 쓰면 되는데?
물론 최근의 프로그래밍 환경은 많이 달라졌다. 웹의 프론트엔드와 백엔드가 분리되고 UX 디자이너가 있고, 규모가 있는 기업들은 더욱더 서비스 중심으로 전환하고 있다. Don't reinvent the wheel 이란 말이 어느 때 보다 중요해지고 있다. Framework를 다루는 능력. 서비스를 안정적으로 관리할 서버 관리자. 고객의 불만사항을 타이임에 맞춰 처리해야 하는 CS부서 까지 일은 계속 분화되고 늘어간다. 세상의 변화에는 등돌린채 C언어의 포인터나 조작하고 있는 것은 시대 착오적 발상일지 모른다.
그러나 기술은 진화해야 하고 과거의 유산을 바탕으로 이루어져 있다. 그 다음 세상을 만들지는 못할지언정 구경이라도 하려면 거인의 어깨에 오를 수 밖에 없다. 거인이라고 표현한 건 몸집이 크니까 어깨에 오르는 것도 힘들일이라 여겼던거 아닌가. C언어 포인터를 배우는 것은 어깨에 오르기 위해서라고 할 수 있다. 데니스 리치와 C에 공헌한 모든 프로그래머들의 유산이다.
class NextProgrammer extends PointerClass -> override 오류