꽃미남 교수님께 배우는 C언어(pocu Comp2200) 후기
comp2200??
꽃미남(?) 포프님께 C언어를 배우는 과목이다.
과목이라고 표현한 것은 Comp2200을 듣기 위하서는 선수 과목들을 배우고 들어야 하기 때문이다.
(선수과목이 필수는 아니지만 풀코스를 수강한 학생으로써 선수과목은 사실상 필수라고 말하고 싶다.)
C언어의 핵심
핵심은 아래 3가지라고 생각한다.
- 포인터
- 메모리 관리 (할당/해제)
- 직관성
재직 중인 회사에서 주로 Java를 사용하기에 Java와 C언어를 간단하게 비교하면서 핵심들이 다른 언어에 어떤 식으로 녹아났고 그 가치에 대해서 보려고 한다.
포인터
“포인터를 모르는 개발자는 프로그래머가 아니다.” 라고 감히 말할 수 있을 정도로 포인터는 중요하다.
Pointer에 단어 뜻에서 알 수 있든 포인터는 무엇인가를 가리키는 것이고 그 무엇이 바로 메모리(RAM)이다.
즉, 포인터는 메모리 주소를 보관하는 변수이다.
왜 그렇게 강조하느냐 라고 물어본다면 코드의 숨은 의미를 알 수 있기 때문이다.
String
// Java
String iamString = new String("Hello String");
// C
char* iamString = malloc(sizeof(char) * 16); // 메모리 할당
strcpy(iamString, "Hello String");
iamString[15] = '\n';
Java에서 String을 생성하는 코드를 C형식으로 작성해 보았다.
malloc()은 힙 메모리에서 char형 크기 * 16 만큼을 할당하는 함수이고
strcpy()는 문자 하나하나를 복사해서 변수에 넣어주는 함수이다.
그럼 Java는 new 키워드는 사실 내부적으로 C의 malloc(메모리 할당) 같은 일을 하고
java의 iamString이라는 변수는 포인터 변수라는 것을 추측 할 수 있다.
function
java에서는 참조형 변수에 == 연산자는 주소값 비교이다.
// java
public static void main(String[] args) {
String imString = new String("Hello String");
System.out.println(imString == eco(imString)); // true
}
public static String eco(String msg) {
return msg;
}
// C
char* eco(char* msg)
{
return msg;
}
int main(void)
{
char* iamString = malloc(sizeof(char) * 16); // 메모리 할당
strcpy(iamString, "Hello String");
iamString[15] = '\n';
printf("%d\n", iamString == eco(iamString)); // 1(true)
free(iamString); // 메모리 해제
return 0;
}
java와 C 모두 컴파일 언어이고 둘 다 함수를 호출하게되면 stack 메모리에 함수가 쌓이게 된다.
그런데 여기서 문제가 컴파일 과정중에 함수의 크기가 결정 된다는 것이다.
그럼 String과 같이 크기가 정해져 있지 않은 것들을 어떻게 매개변수로 받고 반환 값으로 돌려줄까?
바로 포인터가 그 해답이다. 포인터는 아까 설명했듯이 주소를 저장하는 변수라고 했다.
주소의 크기는 고정되어 있으니 컴파일 과정에서 함수의 크기를 결정 할 수 있게 된다.
직관성
C언어는 하드웨어랑 가깝다 보니 어떤 식으로 작동을 하는지 코드를 보는 것만으로도 어셈블리어 레벨까지 어떻게 작동할지 명확하게 보인다.
// java
String sumString = "ABCD" + "EFG";
java 코드를 봤을 때 어떤식으로 어셈블리어가 작성될지 감이 안잡힌다.
// c
int i;
char* sumString = malloc(sizeof(char) * 9); /* 메모리 할당 */
static char* s1 = "ABCD";
static char* s2 = "EFG";
for (i = 0; i < 4; i++) {
sumString[i] = s1[i];
}
for (i = 0; i < 4; i++) {
sumString[4 + i] = s2[i];
}
sumString[8] = '\n';
free(sumString); /* 메모리 해제 */
java 한줄에 내부적으로는 이렇게 돌아간다..
간단하게 java와 C언어를 비교해봤다.
위의 내용은 사실 java 말고도 C언어 계통의 언어라면 전부 비슷하게 동작한다고 생각하면 된다.
(C, C++, C#, Java, …)
POCU Academy를 선택한 이유
C를 배워야하는 이유에 대해서 설득이 되었길 바란다.
책이나, 다른 인터넷 강의가 아니라 포큐아카데미의 풀코스를 들어야 하는 이유는 한번에 제대로 끝낼 수 있기 때문이다.
어떤 것을 공부할 때 한번에 임계치 넘기는 게 중요하다고 생각한다.
일단 기본적으로 혼자 공부하게 되면 임계치를 설정하는 것도 넘기는 것도 비효율적이고 매우 힘들다.
하지만 포큐 아카데미에서는 임계치를 넘기는 경험을 할 수 있고 그것으로 인해 C에 대한 자신감을 가질 수 있다.
포큐만의 방식이 뭔지 설명하겠다.
핵심에서 벗어난 것은 빠르게 넘어간다.
선수과목을 필수라고 했던 이유는 선수과목에서 다뤘던 내용하고 비슷한 내용이 나오면 “선수 과목에서 XXX와 동일합니다 모르겠다면 복습하세요"라고 말하고 3초 만에 넘어간다.
(문법도 비슷함으로 1주일만에 넘어간다.)
중복 내용을 빨리 넘어감에도 강의 시간이 38시간이나 되는데 중복되는 내용까지 넣으면 얼마나 길어질지…
선수과목을 들음으로써 강의시간에는 C에 관해 중요한 내용만 집중적으로 다룰 수 있다.
실습/과제 그리고 멱살 잡고 싶은 빌드봇
포큐 아카데미는 15주 교육과정으로 시험기간을 제외하고 매주 실습, 3주에 한번 과제가 나온다. (총 실습 11개, 과제 4개)
강제로 문제를 푸는 것 만으로도 프로그래밍 공부에 도움이 된다.
저는 포큐를 듣기전에 사실 C언어 책을 두권정도 봤었다. (그 유명한 열혈, 독하게 시작하는 C언어)
그래서 C언어 과목을 건너 뛸까? 생각도 했지만 그랬으면 큰일 날뻔 했다.
책으로 미리 공부하기는 했어도 실질적으로 메모리구조, 포인터 누수, 할당/해제등을 고민하면서 코딩하지를 못했다.
하지만 포큐에서는 실습과 과제를 통해 고민을 하면서 코딩을 하도록 강제하고 그것들을 빌드봇이라는 것을 통해
제대로 했는지 확인을 해준다. 여기서 제대로는 코딩스타일까지 포함해서 테스트 코드랑 메모리 누수까지 다 체크해준다.
개인적으로는 사람이 봐주는 것보다 빌드봇이 봐주는게 훨씬 좋았다.
기계와의 커뮤니케이션은 사람과 다르게 감정적으로 스트레스를 주는 것이 훨씬 적었다.
(사람에게 하면 다시 봐달라는 미안함과 나에게만 깐깐하게 보는게 아닌가 하는 의심등등…)
(웃는 얼굴에 독설을 날리는…)
편하게 질문 할 수도 편하게 답변할 수도 있는 환경, 정보 공유
풀코스를 들으면 같이 수강하는 학생들과 같은 slack방에 들어가게 된다.
Slack방에서는 철저하게 익명으로 돌아가며 어떤 질문이라도 편하게 물어볼 수 있다.
그리고 편하게 답변을 달 수 있다.
편하게 달 수 있다고 해서 구글 검색하면 나오는 내용 같은걸 물어보면 팩폭을 맞을 수 있으니 주의하시길…
잘못된 정보가 담긴 답변을 되어도 다른 분들이 정정해주신다.
그리고 은근히 따봉 맛이…
(따봉 좋아요)
완전한 익명과 포큐님에게 듣고 싶다. Office hour
slack에 질문하면 빠르게 답변을 얻을 수 있지만 닉네임이 뜨는 것마저 부끄럽다면 완전한 익명으로 질문을 할 수 있다. 질문에 youtube에 영상을 찍어주시기도 하고 slack에 아래와 같이 올려주시기도 한다. 여기도 당연히 구글 검색하면 나오는 답은 안해주신다.
난이도
수강 난이도에 대해서 이야기 안 할 수가 없다.
일단 나는 Pass를 하지 못했다. 시험에서 몇 문제만 더 맞췄더라면 하는 것도 있지만
시험문제 난이도는 너무나도 괴랄 했다.
괴랄한 것에 대해서 불만은 없다. 알고 들어간 것이고 괴랄하다는 것을 아는 만큼 더 열심히 하게 됐으니 말이다.
(82.75점ㅠㅠ 중간고사 2문제만…ㅠ)
결론
COMP2200 과정을 들으면서 중간에 포기하고 싶은 적도 몇 번 있었다.
정말 빌드봇과 새벽 3~4시까지 시름하며 그냥 97점으로 만족할까? 하며 스스로를 유혹한 적도 있다.
하지만 정말 만족한다. 나중에 다시 PASS를 받기 위해 재수강을 할 것이며 포큐만의 방식이 얼마나 효율적인지
다시 느낄 수 있었다.
괴로운 만큼 실력으로 보상받는 경험을 모두들 해봤으면 좋겠다.
(포큐 너무 유명해져서 수강신청이 전쟁이 되는건 아니겠지… ㅠ)