"마법은 없다💫" POCU C 언매니지드 프로그래밍(COMP 2200) 후기
소개
"프로그래밍 입문(COMP1500)" 부터 이번 "언매니지드 프로그래밍(COMP 2200)" 까지 총 3과목을 진행하면서 가장 많이 배웠고 재밌었던 과목이다. 이전 과목들은 생략하더라도 이 과목만큼은 필수적이라고 생각한다. 하지만 처음 프로그래밍을 접하는 사람이 이 과목으로 시작하기에는 무리가 있다. 어느 정도 프로그래밍을 해봤지만 실제 내부적으로 어떻게 작동하는지에 대해 궁금한 사람들에게 도움이 될 과목이다.
C는 그런 언어니까
C 언어는 언어 자체적으로나 함수에서 해주는 안전 장치들이 없어서 위험하다. 하지만 그 얘기는 불필요한 확인을 하지 않기 때문에 프로그래머의 실력에 따라 다른 퍼포먼스를 가질 수 있다.
POCU는 과목 초반에 함수 호출에 따른 스택 메모리의 변화를 어셈블리 코드로 확인해 보는 강의가 있다.(개인적으로 가장 재밌었던 강의다) 그 강의를 통해 함수 호출 시 스택 메모리에 대한 변화와 데이터가 어떻게 메모리에 올라가고 함수 반환 시 어떤 일들이 일어나는지 알 수 있었다. 또 어셈블리 코드 확인 하는 방법을 알려주는데 그걸로 개인적으로 애매하게 알고 있던 것들을 명쾌하게 만드는데 많은 도움이 됐다. 이를 통해 다른 언어들에서 마법처럼 작동하는 기능들이 내부적으로 어떻게 작동하는지 생각하는 습관을 기르기 좋은 언어인 것 같다.
POCU C 과목을 수료한 지금 "C 강좌를 내부적으로 일어나는 일들에 대한 설명 없이 제대로 가르칠 수 있을까?"라는 생각이 든다. 이번 과목에서 배운 것들은 컴퓨터 공학에 관한 기반을 만들어 줬다.
마법사에게 마법이란
이번 과목에서 가장 크게 배운 부분을 꼽으라 하면 "어떤 기능(함수, 키워드 등등)이 내부적으로 어떻게 작동하는지에 대해 생각해 볼 수 있는 능력"이라 말하고 싶다. 이건 글자 그대로의 효과 보다 놀라웠다. 어떤 함수가 더 이상 마법처럼 보이지 않는다는 것은 사용법과 주의할 점을 따로 암기하지 않아도 사용할 수 있게 해 줬다.
더 이상 마법이 아닌 것들 중 가장 흥미로웠던 것은 "가변 인자 함수" 였다. C는 함수 오버로딩을 지원하지 하지 않는 언어다. 그럼에도 매개변수의 타입과 개수가 정해지지 않은 함수(printf, scanf)가 작동할 수 있는 걸까?
함수 호출 시 인자들이 스택 메모리에 어떻게 올라가는지 알고 있다면 가변 인자 함수에 대해 쉽게 이해할 수 있다. 또 컴파일 과정을 안다면 가변인자 함수 안에서 사용되는 va_~ 매크로 함수들이 왜 매크로 함수인지도 알 수 있다.
다른 언어를 사용할 때 의문이었던 인자로 전달해줬던 '값'은 왜 바뀌지 않았고, '배열' 안에 값들은 왜 바뀌었는지에 대해 명쾌하게 답을 얻을 수 있었다. 이번 과목으로부터 컴퓨터공학에 관한 지식이 얼마나 중요한지에 대해 몸소 느끼게 되었다.
전에는 얘기할 수 없었던 마법 같이 작동하던 부분에 대해 얘기 할 수 있어서 포프님도 아마 시원함을 느끼지 않았을까 싶다.
마법사에게 마법은 더 이상 마법이 아닐지도?
언매니지드에 관하여
C는 대표적인 언매니지드 언어 중 하나다. 이 과목에서는 언매니지드 언어를 사용하면서 발생할 수 있는 문제인 메모리 누수를 막기 위해 지켜야 하는 규칙들을 엄격히(?) 가르친다. 실습을 통해 그런 규칙들을 지키는 훈련을 여러 번 해 볼 수 있었다. 이 훈련들이 꼭 언매니지드 언어뿐만 아니라 다른 언어를 사용하는 데 있어서도 큰 도움이 된다고 생각된다.
이전 과목들에서는 실습/과제를 Visual Studio로 진행했지만 이번 과목에서는 메모장으로 한다(강제는 아니다). 처음에는 디버깅이 상당히 어려웠지만 하다 보니 이렇게 시킨 이유를 알게 되었다. 이유는 포인터와 같이 곧바로 눈에 보이는 개념이 아닌 것들을 훈련하는 데에 있어 좋았던 것 같다. 물론 나는 중간고사까지만 메모장으로 했었다. 그 후에는 "Sublime Text"라는 텍스트 편집기를 사용했다. 만약 본인이 도저히 메모장으로는 못 하겠다면 텍스트 편집기를 추천한다. Visual Studio 사용은 최대한 안 하는 게 훨씬 도움이 많이 된다.
난이도
이번 과목의 실습/과제의 난이도는 개인적으로 이전 과목 "COMP1000 공학용 수학" 보다 쉽게 느껴졌다. "동적 메모리", "자료구조" 등등 처음 접할 수 있는 내용이다 보니 그랬던 것 같다. 하지만 시험은 쉽지 않았다. 쉽지 않았지만 여태 까지 여러 번 POCU의 시험을 보면서 느낀 건 POCU는 정말 시험 문제를 잘 만든다. 개념에 대해 입체적으로 생각해 봐야 하는 문제들이 많다. 그런 문제들을 풀기 위해서는 실습/과제 외에도 배운 개념을 가지고 혼자서 여러 가지 실험해보는 방법이 가장 좋은 것 같다.
내가 했던 방법을 소개하자면 포인터는 결국 많이 사용해 보는 게 좋은 것 같다. 나는 가장 헷갈렸던 연결리스트를 거의 2주 동안 매일 하루에 한 번씩 구현해 보면서 감을 익혔고 그 결과 포인터에 관해 머릿속으로 나만의 그림을 그릴 수 있게 됐다. 그 부분이 시험 그리고 포인터에 관해 이해하는데 도움이 많이 됐다.
마치며
마법처럼 보일 뿐 결국 마법은 없다. 마법으로 보이지 않는 눈은 더 많은 걸 쉽게 보이게 해 줬다. 만약 프로그래밍에 있어 실력이 늘지 않는 것 같거나, 확신이 없는 사람에게 이 과목을 적극 추천한다.