brunch

You can make anything
by writing

C.S.Lewis

by JS Jun 14. 2024

1학기, 아이고 종강이야

끝맺지도 못한 서울 이야기와 이제서야 곱씹어보는 1학기 이야기

# 2024. 06. 13.


  돌아오기까지 오래도 걸렸습니다. 호기롭게 시작한 브런치스토리에 고작 다섯 개의 게시물을 올린 채 이렇게까지 잠수를 타 버릴 줄이야. (사실 이럴 줄 알긴 했습니다. 작심삼일의 아이콘이 전데요 뭐...) 마지막 글을 올린 날짜가 개강한 지 하루가 지난 시점이더라고요. 학기 중 일정이 고되긴 했나 봅니다. 그러나 이것도 사실 이번 학기에 들은 학점만 따지고 보면 남들보다 빡빡한 학점도 아니었습니다. 전공 세 개에 교양 하나, 기초필수 하나 해서 15학점. 각 과목에서 나오는 과제와 시험공부, 그 이후의 휴식 시간까지 합쳐 브런치 쓸 시간 없이 하루가 딱 들어맞은 것을 보면 어느정도 저에게 맞는 공부 양을 찾은 것 같다는 생각이 들기는 합니다. 그렇다면 그간 어떻게 살았는지, 뭘 배웠는지 한번 되돌아 보겠습니다.



1. 객체지향프로그래밍 (CSED232) - 프로그래밍과 문제해결, 속칭 '프밍'의 상위 버전!


  개인적으로는 정말 재미있게 들었던 과목입니다. 우선 교수님이 재미있으셨습니다. 평시 수업 때는 다른 강의와 다름없이 강의식 수업을 이어나가시지만, 가끔씩 귀여우신 모먼트가 있었습니다. 필기를 하려고 마우스로 열심히 그림을 그리시는데 오류 때문에 이곳저곳으로 선이 튀어나가 으아악 소리를 내실 때나, 아니면  수업 중간에 환기하고자 가끔 딴 소리를 하실 때가 그렇습니다. 특히 기억에 남는 발언이 있는데, '요즘 밤 많이 새나요?' 하고 물으시고 말씀을 이어가시더니 '학부생 때는 원래 밤 새는거에요~' 라시며 악랄한 웃음을 지어보이신 때가 있습니다. 앞자리에 앉았던 저도 덩달아 충격과 씁쓸함의 웃음을 지어보였던 기억이 있습니다만, 저렇게 농담하시는 교수님이 소소하게 웃겼습니다.


Overload하지 않은 Operator를 잘못 사용하면 이렇게 무지막지한 경고 문구를 띄우기도 하더라.


  배우는 내용이나 과제도 꽤 즐겁게 했던 기억이 있습니다. 기본적으로 이 과목은 C++ 언어의 기본 문법과 STL(Standard Template Library) 등을 다루었습니다. 작년까지만 해도 1학년 때 배우는 프로그래밍과 문제해결 과목에서 C언어를 다룬 바가 있어서, C언어의 상위호환 버전인 C++의 기초적인 내용은 다루지 않았었는데 이제 C언어 대신 Python을 1학년 때 가르치는 탓에 올해는 C++의 기초부터 교수님께서 다루어 주셨습니다. 강의를 듣다 보니 어릴 적 C언어를 얕게나마 배워보면서 접했던 여러 문법들을 다시 보게 되니 듣는 데에 큰 지장이 없었을 뿐더러 어릴 때에 이해하지 못했던 문법들을 이제 깨치게 되면서 배우는 재미도 쏠쏠했습니다. 특히나 어릴 때는 외계어 덩어리같이 보였던 여러 키워드들, 이를테면 const, static, friend, virtual, struct, class 등이 이제는 와닿게 되니 코드 이해도도 올라가고 실제 다양한 헤더파일들도 어떻게 구성되어있는지 조금이나마 이해할 수 있게 되어서 신기했습니다.


  특히나 과제가 후술할 데이터구조 수업과는 다르게 프로그래밍과 문제해결 과목에서 나오는 것과 같이 게임 만들기, 암호 해독하기와 같은 꽤 재미난 주제들로 던져주셔서 즐겁게 해결할 만했습니다. 실제로 그만큼 과제 성적도 잘 나온 편이기도 하고요. (Goose Goose Duck 게임 만들기 때 뭘 잘못했는지 10점 까인 것과, 제출 시간이 11시 59분 '00초'까지인 줄 모르고 보고서에 쓸데없이 공을 들이다 늦게 제출해 20% 감점 당한 것을 제외하면 말입니다...)


혹시나 후배님들이 이 글을 본다면, 물론 그러지 않겠지만 보고서에 쓰잘떼기 없는 공은 들이지 마시기 바랍니다...

2. 데이터구조 (CSED233) - 처음 맛보는 컴퓨터과학, 충격과 공포의 과제 난이도


  사실 '자료구조'라는 말은 들어봤었는데, '데이터 구조'라는 말로 쓰니까 전혀 다르게 느껴지더라고요. 그래서 이게 자료구조를 다루는 과목인지는 뒤늦게 깨달았습니다. 프로그래밍과 문제해결 때도 몇 번 다루었던 List, Stack, Queue부터 시작해서 시간 복잡도, Tree, Sorting, Hashing, Graph, 그리고 String까지 배워볼 수 있었습니다. 각각의 데이터 구조들을 볼 때마다 발상들이 다 천재적이라고 느꼈는데, 알고리즘의 시간 복잡도를 줄이고, 데이터를 더 빠르게 삽입하고, 삭제하고, 찾기 위해서 고안한 갖은 방법들이 꽤 신기했습니다. 그런데 문제는 이렇게 고안된 여러 알고리즘들을 과제에서 직접 구현해야 했다는 점이었습니다. 특히 인상깊었던 것이 AVL Tree인데, AVL Tree의 Rotation에 대해서 배우자마자 들었던 생각은 '저걸 어떻게 구현해야 하지...?' 였습니다. 아니나 다를까 이를 구현하는 과제가 나왔고 그 과제의 점수는 처참했던 것으로 기억합니다.


  사실 저 AVL Tree를 구현하는 것뿐만 아니라 대다수의 자료 구조를 구현하는 데에 애를 좀 먹었습니다. 한창 객체지향 프로그래밍 과목에서 C++을 처음부터 배우는 와중에 C++로 작성된 스켈레톤 코드를 보고 과제 내용들을 구현해야 하다 보니, 첫 번째 과제와 두 번째 과제를 받아들었을 때에는 스켈레톤 코드를 먼저 해석하는 데에 시간을 들일 수밖에 없었습니다. 그렇게 느린 속도로 코드를 짜다 보면 어느새 제출 기한이 다 되어 있었고, 그래서 많은 Testcase로 실험해 보지 못했던 것이 주요한 패착이 아니었나 싶습니다. 이에 더해 코딩 경험이 부족했던 것도 한몫을 했습니다. 일례를 들자면 다음과 같습니다. Linked List나 Tree 등을 구현할 때 보통 포인터를 사용해서 Node를 만들고, 이 Node들을 연결해서 이와 같은 자료구조들을 만들게 됩니다. Node를 서로 잇다보면 마지막 Node는 Null을 가리키기 마련인데, 만일 이 Null에 접근하여 어떤 메서드를 실행하도록 코드를 짜버리면 프로그램이 오류 메시지도 없이 뻗어버리게 됩니다. 저는 이걸 모르고 엉뚱한 Node에 실수로 접근했다가 프로그램이 뻗어버리자 어디가 원인인지 찾지 못해서 한참을 헤메곤 했습니다. 이것 외에도 디버깅할 때의 미숙함과, CLion이라는 개발 환경의 어색함이 어우러져 과제 성적이 엉망이 되어버리기도 했습니다.


  그래도 시험은 평이하게 나온 편이라 중간 · 기말 성적이 크게 망하지는 않았습니다. 다만 기말고사 때에 생각지도 못하게 Dijkstra's Algorithm과 Prim's Algorithm 등을 증명하는 문제가 나와 적잖이 당황하기는 했습니다. (물론 제대로 공부 안해서 풀지도 못했습니다. 깔깔) 다행히도 수강생들 대부분이 잘 못풀었는지 평균 정도로 성적이 나오긴 하더라고요. 하여간 여러모로 쉽지 않은 과목이었습니다.


나를 충격과 공포로 몰아넣었던 AVL Tree의 Rotation 예제. Node들을 새로 연결하는 개념으로 접근하면 되지만 'Rotation' 자체에 너무 매몰되었던 것 같다.

3. 디지털시스템설계 (CSED273) - 시험 문제가 왜 안 풀릴까? 파이널 프로젝트의 매콤한 추억


  이 과목은 저랑 잘 맞는 과목은 아니었던 것 같습니다. 분명 로드가 엄청 많았던 건 아닌 것 같은데 종강에 가까워지니 제일 골치 아픈 과목이 되어 있었고, 이상하게 시험만 보면 점수가 나락을 가 있었습니다. 개념이 어려웠던 것도 아니고, 과제를 그렇게 못 풀었던 것도 아니었는데 말입니다. 우선 이 과목은 제목 그대로 디지털 시스템에 대해 다루는 과목입니다. 이진수의 연산부터 논리 식과 논리 식의 단순화, 각종 논리 게이트, 이 논리 게이트를 이용하여 만든 Decoder나 Multiplexer, Adder와 Multiplier 등에 대해서 배웁니다. CPU를 구성하는 ALU도 여기서 디자인해볼 수 있습니다. 더불어 단순히 하나의 입력에 대해 하나의 정해진 출력만을 뱉는 Combinational Logic에서 나아가, 이전 상황에 따라 같은 입력이라도 다른 출력을 뱉을 수 있는 Sequential Logic에 대해서도 다루며, 이 Sequential Logic의 근간이 되는 Latch와 Flip-Flop에 대해서도 배웁니다. 마지막으로 Sequential Logic의 State Transition Diagram을 그리고, 이들 State를 간소화하는 방법을 배우면 이제 실제 자판기와 같은 디지털 시스템을 직접 설계할 수 있게 됩니다.


프로포절 자료. 강 건너기 게임으로 유명한 요 녀석을 구현하기로 했다.


  디지털 시스템 설계의 꽃이라 하면 단연 파이널 프로젝트라고 있겠습니다. 과목이 4학점인 데에는 이 프로젝트가 한몫을 하죠. 기말고사를 치르기 2주 전 즈음부터 주제를 선정하고 프로포절을 제출해야 합니다. 저는 이맘때가 객체* 어싸인*과 디시설* 랩* 과제가 동시에 주어졌던 터라 굉장히 정신없었던 기억이 있습니다. 다행히 팀메이트가 주제를 번뜩이는 걸로 잘 가져와줘서 프로포절 보고서 제출은 무난하게 했습니다. 그러나 문제는 이걸 실제로 구현하는 것이죠. 프로포절에 대한 피드백이 들어왔는데, 웬걸 조교님께서 우리가 그린 State Machine의 State들은 이런 식으로 구분할 수 없다고 하시는 겁니다. 도무지 이해가 가질 않아서 따로 미팅을 했는데도 뚜렷하게 감이 잡히지 않아서 그냥... 거의 원본 그대로 제출하고 말았습니다.


  그렇다면 이제 랩 시간동안 배운 Verilog로 코드를 먼저 짜야 합니다. 그런데, 열심히 짰음에도 불구하고 돌아가질 않습니다. 당최 원인이 뭔지 코드를 들여다보길 수십 번, 조교님께 조언도 구해보고, 코드를 다시 짜보기도 하고, 테스트벤치를 수십 개를 만들어 각 코드를 테스트해보기도 한 끝에 Delay Flip-Flop의 Clock에 사용자의 Input을 연결하여 사용자에 의해 동작하게끔 바꾸면서 드디어 코드 구현에 성공하게 됩니다. 코드를 다 짜니 브레드보드에 선을 연결하고 게임 모형으로 만드는 데까지는 얼마 걸리지 않았습니다.


하필 짐 빼는 날이 프로젝트 기간이랑 겹치게 됐다. 이날 심지어 비가 와서 멘탈 터짐 2배 이벤트.

  

  참 절묘했던 것이 최종 구현까지 완료하고 조교님께 데모*까지 완료한 때가 토요일 밤이었는데, 이 날이 기숙사에서 짐 빼는 날이었던지라 팀메는 오늘 밤 KTX를 타지 못하면 포항에서 노숙을 해야 하는 상황이었던 것입니다. 저는 사실 오늘 밤 새는 건 거의 확정이겠구나 싶어 체념하고 있던 상태였는데, 팀메의 집념 덕분에 일찍 구현을 끝내고 종강을 맞이할 수 있었습니다. (실제로도 팀메가 고생을 몇 배로 했습니다. 시험 끝나고 멘탈이 터져 실습실에서 멍때리고 있던 저와 달리 팀메는 뭐라도 계속 시도해보고 있었거든요. 이 자리를 빌어서 다시 한 번 수고했다고 말하고 싶네요.)


  위에서 대강 알 수 있듯 이 파이널 프로젝트는 시험이 끝나고도 포항에 남아서 끝내고 가야 할 수도 있는 과제입니다. 새내기들이나 다른 동기들은 시험이 끝나자마자 총알같이 집으로 향하는 데 반해, 디시설 수강생들은 심하면 며칠씩 포항에 잡혀 파이널 프로젝트에 매달려야 할 수도 있다는 것입니다. 이 부담감은 종강이 다가올 수록 생각보다 크게 체감돼서 유리 멘탈인 저에게는 정신 건강에 아주 좋지 않았습니다. 나중에 이 과목을 들으려는 후배가 있으면 꼭 참고했으면 좋겠습니다.


파이널 프로젝트 결과물과 실습실 현판. 고생깨나 했다.

*객체 : 객체지향프로그래밍 과목의 줄임말.

*어싸인 : 컴공과에서 프로그래밍 과제를 아울러 이르는 말.

*디시설 : 디지털시스템설계 과목의 줄임말.

*랩 : 수업에서 배운 내용을 하드웨어 설계 언어인 Verilog를 통해 실제로 구현해보는 실습 시간.

*데모 : Demonstration의 발음을 줄인 말. 파이널 프로젝트 완성물을 조교에게 시연하는 것을 말함.


종강 후 하늘은 참 맑고 예뻤다. 사진이 내 심정을 대변해주는 것 같아 잘 나온 사진 두 장 올려본다.


  어쨌든 종강했습니다. 적은 학점에 비해 종강 즈음에 멘탈이 많이 갈려 좀 당혹스러웠는데, 그래도 다행인 점은 이들 과목에서 배운 내용들이 날아가지 않고 머릿속에 잘 남아있다는 것입니다. 1학년 때 물리, 미적 배웠던 것들은 다 증발하고 없어졌는데, 확실히 전공 과목이었던 데다가 배우는게 꽤 재미있었다 보니 단순히 1회성의 배움으로 그치지 않은 것 같습니다. 이제 저는 여름학기를 앞두고 있습니다. 애플 디벨로퍼 아카데미에서 열리는 'iOS 앱 개발 프로세스 기초'라는 특강 과목을 들을 예정입니다. iOS 환경에서 개발해보는 경험이 흔치 않은 만큼 이 과목에서도 최대한 많은 것들을 경험해 보아야겠다는 다짐을 해봅니다. 더불어 포스텍-카이스트 학생대제전 준비위원회, 줄여서 포준위 활동도 앞두고 있으니 이에 대한 업데이트도 꾸준히 해봐야겠습니다.


  미처 마무리하지 못한 서울 이야기들은 브런치스토리에 쓰기 보다는 인스타그램에 사진 여러 장 올리는 형태로 갈음할 생각입니다. 사실 한남역 이야기를 써보니 저는 사진 자랑이 주로 하고 싶은데 브런치 특성상 무슨 말이라도 덧붙여야 하니 사진에 관련된 얘기들을 쥐어 짜내야 하더라고요. 이제는 4개월 넘게 지난 이야기이니 저때 무슨 생각을 했는지, 어떤 일화가 있었는지 잘 기억나지 않기도 하고, 사진 자랑이 목적이면 인스타를 쓰는 게 맞다는 판단 하에 이렇게 결정해 보았습니다. 사진 계정 하나 파서 따로 자랑해보겠습니다.


  다른 대학교 친구들은 이제 기말고사 기간일텐데, 저처럼 멘탈 터지지 마시고, 잠 조금씩 주무시면서 마지막까지 화이팅하길 바라겠습니다. 다음 글로 찾아뵐게요!

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari