끄적끄적

2학년 1학기 (2021) - 회고록 및 강의 후기

퐁키조아 2022. 1. 13. 23:08
기계항공공학부에서 컴퓨터공학부로 전과하게 된 나에게 2021년은 터닝 포인트의 해였다. 올해 봄에 입대를 할 예정인데, 그 전에 나의 2021년은 어땠는지 정리하고 각 과목들별로 어떤 것들을 공부했는지 기록하기 위하여 이 글을 남긴다.


컴퓨터공학부로 전과하고 나서 많은 걱정이 있었는데, 그 중에서도 과연 전공과목들을 제대로 공부할 수 있을지가 제일 큰 걱정이였다. 결과적으로 학점은 잘 나오긴 했지만, 1학년때와는 비교도 안되게 많은 공부를 했던 것 같다. 팀플이 총 3개가 동시에 진행되었는데, 내가 모두 조장을 맡아서 각 과목별로 회의 일정을 짜고 시간을 조정하는게 쉽진 않았다. 그래도 지나고 보니 생각보다 알차게 보낸 것 같아서 뿌듯하다.

 

C프로그래밍 (1학년 지교)

컴퓨터공학부 1학년이 가장 처음으로 듣게 되는 코딩과목이다. 나는 1학년 2학기에 컴퓨터프로그래밍1 과목에서 C언어를 미리 배웠기 때문에 사실 재수강하는 기분으로 듣게 되었다.

  • 중간고사 이전: 간략한 컴퓨터 개론과 프로그래밍의 개념을 배우고, 이후 C언어의 기초에 해당하는 변수, 자료형, 연산자, 조건문, 반복문 등을 배운다. 중간고사는 1부 객관식/단답식 문제와 2부 코딩 문제로 나뉘었다. 이 교수님 과목들은 전부 오픈북 시험인데, 중요 내용들만 요약해서 출력해두면 어렵지 않게 문제를 풀 수 있다.
  • 중간고사 이후: 중간고사 이전 범위에 누적하여 C언어 내용을 배운다. 함수와 재귀함수, 배열과 문자열, 배열과 포인터, 구조체, 포인터의 활용, 동적할당과 연결 리스트 등을 배운다. 기말고사는 전부 코딩 문제였는데 수업 시간에 했던 실습 내용을 바탕으로 문제가 나왔다.
  • 과제: 매주 랩실습, 큰 과제 2개, 팀프로젝트 과제 1개가 있었다. 랩실습은 조금 귀찮았지만 코딩을 처음 접해보는 학생들에게는 연습하기 좋은 과제였을 것 같다. 큰 과제들은 약 3~4시간이 소요되어 의외로 생각할게 많았던 과제였다. 과제1은 수식을 이용하여 계산하는 것, 과제2는 조건문, 반복문, 함수, 타이머, 다중 소스 프로그램을 연습하는 것이 목표였다.
  • 팀프로젝트: 타자 게임을 만드는 것이 큰 주제였고, 배열과 포인터를 이용하는 것이 목표였다. 우리 팀이 선택한 주제는 "코딩 용어 대결"이였다. 각 캐릭터마다 다음 단어 미리보기 / 자동 입력 / 쉬운 단어 출제 / 오답 보호 등의 능력이 있어 선택할 수 있고 레벨을 선택하여 단어 집합을 고를 수 있게 하였다. 다른 학생들의 성적도 랜덤으로 생성되어 마지막에는 본인의 점수에 대한 성적표도 출력하게 하였다.

 

확률과통계 (2학년 지교)

이 교수님은 수업을 들을 땐 정말 고통스럽고.. 이걸 왜 해야하나 싶지만 돌이켜보면 남는 것이 정말 많은 수업이다. 커리큘럼, 과제, 프로젝트, 시험 모두 과목의 취지에 잘 맞도록 구성하셔서 배울 수 있는 것이 많다.

  • 중간고사 이전: 확률 모델, 조건부 확률과 베이즈 법칙, 독립, 순열과 조합 등 고등학교 확통에서 배운 기초적인 내용들을 간단하게 복습한다. 이후 본격적으로 이산적 개념의 통계 (DRV, PMF, joint PMF, Conditional PMF, Independent DRV)와 연속적 개념의 통계 (CRV, PDF, joint PDF, CDF, NRV) 를 배운다. 중간고사는 PS에서 연습했던 문제들을 바탕으로 출제하셨다. 1번 문제에 항상 내시는 OX 퀴즈는 개념을 정말 구체적으로 물으시기 때문에 강의자료에 필기했던 것들을 잘 참고해서 연결해야 한다. 사소한 계산 실수로는 점수를 많이 깎지 않으시고 과정 중심으로 채점하신다.
  • 중간고사 이후: 중간고사 이전 범위에 누적하여 진짜 통계스러운 것들을 공부하였다. 첫번째 테마는 공분산과 상관계수, 중심극한정리, 가우시안 분포 / 두번째 테마는 추론: 베이지안 추론, MAP, LMS, ML / 세번째 테마는 (인공지능 맛보기) 선형 회귀와 가설 검증이다. 첫번째 테마는 쉬웠지만 두번째와 세번째 테마 내용이 이해가 잘 안가서 정말 고통스러웠다. 기말고사는 대부분 쉬운 내용과 과제 내용 위주로 출제하셨지만, 공부를 안했으면 아예 손도 못댈만한 문제들이였다. 심지어 어떤 문제는 예고도 없이 PS 과제에 업로드했던 엑셀 파일을 이용해서 데이터를 분석하게 출제되었다.
  • 과제: 총 6번의 PS (Problem Set) 과제와 2개의 프로젝트가 있었다. PS과제는 매번 반은 쉬운 문제, 반은 어려운 문제로 구성됐는데 난이도가 꽤 있어서 모두 푸는데는 4~7시간 정도 소요되었다.
  • 프로젝트: emprical PMF 구하기, emprical CDF 구하기가 있었는데 모두 C언어로만 제한되었다. 둘다 난수를 여러개 발생시켜서 데이터를 엑셀로 분석하면 되서 프로그래밍 자체는 어렵지는 않았지만, CDF는 문제 자체에 대한 이해가 요구되었기에 공부를 할수록 많은 것이 보이는 프로젝트였다.

 

객체지향프로그래밍 (2학년 전선)

그린조아 교수님은 수업 내용이 너무 알차다. 온라인 강의인데도 매주 4~5시간 분량의 강의를 새로 찍어주셨고, C++의 기초를 다질 수 있도록 엄청난 양의 랩 실습과 과제를 통해서 떠먹여주셨다. 실제로 이 수업을 듣고 방학부터 2학기까지 알고리즘 문제와 프로젝트를 모두 C++을 통해서 진행하게 되었다.

  • 중간고사 이전: C++의 기본 입출력, 배열과 동적할당, 스마트 포인터, 객체 지향의 기초 - 생성자, 복사 생성자, 이동 생성자, 소멸자, 클래스 멤버들, 연산자 오버로딩, 대입 연산자 등을 배운다. (특히, 클래스에 동적 할당 메모리를 사용한 경우를 자세히 배운다.) 중간고사는 대입 연산자 오버로딩, 객체 배열, 복사 이동 생성자 중심으로 출제가 되었다. C++은 내용 자체는 쉬운데 항상 어디선가 메모리 누수가 나서.. 평소에도 디버깅으로 확인하는 습관이 중요하다.
  • 중간고사 이후: 첫번째 테마는 객체 지향의 심화 - 상속과 포함관계, 추상 클래스와 다형성 등 부모와 자식 클래스 간의 관계를 중심으로 배운다. 두번째 테마는 템플릿, STL 컨테이너, STL 알고리즘, 람다함수, 파일 입출력과 예외 처리 등을 배운다. 기말고사는 객체의 다형성을 구현하는 것과 벡터를 이용하여 저장하고 알고리즘을 응용하는 문제가 출제되었다. 이 교수님은 정렬하는 알고리즘을 매번 출제하셨기 때문에 연산자 오버로딩을 통해 어떤 요소에 대해 정렬할지 정해두는 것을 연습해두는게 좋다.
  • 과제: 매주 랩실습 + 5번의 큰 과제 + 지뢰찾기 프로젝트가 있었다. 매주 있는 랩 실습은 수업 내용 바탕으로 응용해서 푸는 문제기 때문에 30분 ~ 1시간 안에 끝난다. 랩실습은 점수도 후하게 주신다. 큰 과제는 영화관 프로그램, 티켓 프로그램 만들기였는데 영화관 만드는 과제가 수업 초반에 나와서 정말 힘들었다. 3중 포인터를 이용하여 3차원 배열을 동적할당하고 관리해야 했는데 총 15시간 가량 소요되었다. 그 이후 과제들은 대부분 3 ~ 5시간 이내로 끝낼 수 있는 비교적 간단한 과제들이였다.
  • 프로젝트: 수업 13주차에 지뢰찾기 프로젝트가 나왔다. 생각보다 로직이 간단해서 위에서 언급한 영화관 과제보다도 빨리 끝낼 수 있었다. 레벨 조절, 8방향 연속 자동 펼침, 저장하기와 이어하기, 리플레이 기능 등을 구현했는데 지금까지 했던 과제들보다 훨씬 재미있게 수행할 수 있었다.

 

웹프로그래밍 (2학년 전선)

  • 중간고사 이전: HTML, CSS (태그, 선택자, 속성) 를 이용하여 웹 레이아웃에 대해 배우고, JavaScript의 기초를 배운다. 중간고사는 수업시간에 배운 실습들이 조합되어서 출제되었는데 한글 설명을 영어와 태그로 바꿀 줄만 알면 될 정도로 쉽게 나왔다. 자바스크립트 문제는 수업시간에 했던 내용이 거의 그대로 나왔다.
  • 중간고사 이후: 첫번째 테마로 자바스크립트를 이용한 이벤트 처리와 캔버스, jQuery 등을 배웠다. 이 내용들을 바탕으로 팀 프로젝트 과제를 6주간 진행했었다. 두 번째 테마는 웹 서버 (node.js), Ajax, Json, RSS 활용, 웹 보안 기초 등을 배웠다. 기초만 맛본 정도라서 다른 곳에서 이 내용들을 바로 적용할 수 있을 정도로 배우진 않았다. 기말고사는 이벤트 처리를 해서 DOM의 구성을 바꾸는 문제, 웹 서버를 통해 RSS 컨텐츠를 출력하기 + 아코디언 예제가 합쳐진 문제가 나왔다. 실습 문제와 거의 동일하게 나와서 빠르게 푼 친구는 80분 중 40분만에 다 풀었다고 한다.
  • 과제: 매주 랩실습 + 1번의 개인 프로젝트 + 1번의 팀 프로젝트가 나왔다. 매주 나오는 랩 실습은 C프로그래밍이나 객체지향프로그래밍보다 난이도가 더 높았다. 생각해야 할게 많았고, 시간이 오래 걸린적도 있었다. 실습 코드는 깐깐하게 채점하신 편이라 숫자 하나 잘못된 곳만 있어도 감점이 꽤 컸던 편이였다. 개수는 평균적으로 주마다 1~3개 정도 나왔다.
  • 개인 프로젝트: HTML, CSS만을 이용해서 나만의 블로그를 만드는 과제였다. 탭바를 응용한 웹 레이아웃을 구성하고, 나를 소개하는 블로그를 만드는 프로젝트였는데 나는 디자인에 신경을 많이 쓴 편이라 대략 35시간 정도 소요되었다. 웹 페이지를 구성하는 것도 오래 걸렸지만, 20문 20답이나 기행문 쓰기 등 내용을 작성하는데도 시간이 꽤 걸렸다.
  • 팀 프로젝트: 자바스크립트와 캔버스를 이용해서 벽돌깨기 게임을 구현하는 과제였다. 우리 조는 톰과 제리 컨셉으로, 톰이 치즈벽돌을 쌓은 제리를 쫓는 방식으로 만들었다. 다른 조들과 다르게 우리는 가로로 캔버스를 만들었다. 치즈의 종류에 따라 맞춰야 하는 수가 달랐고, 다른 치즈들을 모두 제거할 수 있는 푸른 곰팡이 치즈 벽돌도 만들었다. 이 게임을 만드는데는 거의 50~60시간 정도 소요되었지만, 만드는 과정과 결과가 모두 만족스러워서 재밌었던 프로젝트였다.

 

자료구조 (2학년 전선)

  • 중간고사 이전: JAVA를 이용하여 알고리즘의 시간복잡도, 재귀, 스택과 큐, 리스트와 반복자, 트리와 이진트리를 배웠다. 각 자료구조들이 어떤 식으로 작동하고 구현하는 방법 등을 배웠다. 시험 문제는 스택과 트리를 이용하여 최소 최대 비용 / 최소 최대 교차로로 방문하는 문제가 출제되었다. 나는 JAVA를 배우지 않은 상태라 걱정을 많이 했지만, 평균이 워낙 낮아서 공부한것만 풀어도 충분히 좋은 점수가 나왔다. (평균 20점)
  • 중간고사 이후: 우선순위 큐, 힙, 해쉬맵, BST (AVL, (2,4), Red-black 트리), 정렬, 그래프 등을 배웠다. 내용 자체가 많이 어려워서 이해하기가 쉽지 않았다. 시험 문제는 타겟 트리 내에서 서브 트리를 찾는 문제가 출제되었다. 아예 손을 놓은 친구들이 많았는지 평균이 4점, 6점이 나왔다. BST 구현만 했어도 점수가 잘 나왔을 것 같다.
  • 과제: 매주 과제가 있었다. 난이도가 그리 높지는 않지만 아무런 가이드나 피드백이 없어서 처음 JAVA를 하는 사람에게는 좀 벅찰 수 있는 과제였다. 실제로 2학기에 배운 JAVA 수업 과제들과 비슷한 난이도였다고 생각한다.

 

전공기초프로젝트1 (2학년 전선)

  • 중간고사 이전: 주제 선정, 기획서 작성, 구현까지 모두 우리가 알아서 하는 프로젝트 과목이다. 나는 전과해서 왔기 때문에 컴퓨터공학부 사람들을 아무도 몰라서 무작정 팀을 만들고 누군가 들어오기를 기다렸다. 우리가 정한 주제는 공유 캘린더였고, C언어로 구현하기로 하였다. 중간고사가 끝난 뒤 다음날부터 약 3일간 40~50시간에 걸쳐서 프로그램 구현에 성공하였다.
  • 중간고사 이후: 교수님이 4주차까지 강의를 올리시고 그 다음부터는 잠수를 타셨다. 그래서 사실 중간고사 이후에는 무슨 내용을 하는지 몰라서 조원들끼리 간단히 오류만 수정하고 끝냈다. 기말 발표도 생략하고 중간까지의 프로젝트만 가지고 채점하셨다.