본문 바로가기
Development/CS

[CS50] 제 2강 - C언어

by _KHK 2021. 12. 18.

CS50 2강에서는 C언어 기초를 배운다.

코딩에 사용되는 언어는 여러 가지가 있지만 C언어를 가장 기초적으로 알려준다.

 

1강에서 배운 알고리즘 기초를 어떻게 컴퓨터가 인간의 언어를 받아들이고 해석하는지 알려준다.

 

소스 코드 ->  번역을 수행하는 알고리즘 프로그램 = 컴파일러  -> 머신 코드 (2진법)

 

인간이 작성하는 소스코드는 컴파일러라는 프로그램이 기계어로서 최종적으로는 2진법 문장으로 변환시켜준다.

"clang" 은 코드를 컴파일하는 프로그램의 이름이다. 어셈블리어를 출력하지만 어쨌든 머신 코드이다.

 

강의 중간중간 교수님은 학생들에게 질문이 있냐고 묻는데 

#include <stdio.h>

 

int main (void)

{

    printf("hello world");

}

코드가 이렇게 작성되어있었고, 질문 중 하나가 두 번째 줄은 왜 비어있냐는 질문이었다.

사실 개발을 어느 정도 알고 있는 상태에서 보기에는 별거 아닌 질문이지만 교수님은 항상 good question! 하면서 답변해준다. 정말 CS에 입문하는 아주 기초적인 부분부터 시작하고 아무것도 모르는 학생들이 수업을 듣고 있다는 걸 알 수 있었다. 그렇게 정말 너무나도 쉽게 설명해주고 있으며 분명 내가 들어도 쉬운 강의 속에서 몰랐던 아주 자그마한 기초를 조금씩 얻어가고 있다.

#include <stdio.h>

C언어에서 표준, 기본적으로 제공하는 함수들을 담고 있는 head이다. 

 

문자열

학생들은 문자열 타입 string에 대해 처음 배우게 되고 " = " 기호가 코드에서 어떤 의미로 동작하는지 알게 된다. 

" = " 기호는 지정한다라는 의미라고 설명해주고 있다.

C언어는 변수를 출력할 때 형식 지정자를 붙여준다. % 를 적고 그 뒤에 어떤 형식인지 알려주어야 한다.

 

기본적으로

%s는 string형 문자열,

%i는 int형 정수,

%f 는 float형 실수,

%c 는 char형 문장이 아닌 하나의 문자를  출력한다.

 

printf("my name is %s" , 변수) ; 

이렇게 해주어야 출력해야 하는 문장 안에 있는 %s가 문자열임을 알고 변수에 저장된 문자열을 출력할 수 있다.

 

 

#include <cs50.h>

하버드에서 직접 제공하는 cs50 강의를 위해 만들어진 헤더이다.

get_string 함수를 사용할 수 있고, 문자열이 아닌 다른 숫자 형태라던가, 특수한 에러를 예외 시키고 문자열만 받을 수 있게 해주는 함수다.

 

처음 컴파일을 할 때 clang을 알려주고 이 해더가 붙은 채로 터미널에서 clang 명령어를 입력하지만 에러가 난다.

이유는 이 해더가 무엇인지 알 수 없기 때문이다. 이 해더가 어떤 파일인지 링크해주어야 하는데

명령어로 clang -o hello hello.c -lcs50 하고 마지막에 lcs50을 붙인다. 이것은 link + cs50 옵션을 붙인 것이다.

cs50.h라는 헤더를 링크하라는 뜻이고 이 명령어를 실행시키면 컴파일러는 해더를 읽어올 수 있고 정상 컴파일이 된다.

 

그 이후 이 과정을 자동으로 처리해 줄 수 있는 make 명령어를 배운다.

이 과정을 기초적으로 알고 나서 make를 배운다는 것임을 나도 처음으로 알게 되었다.

 

 

자료형, 형식 지정자, 연산자

이후 강의에서는 자료형에 대해서 배운다.

char , long, float, double 

%

&& , || ....

 

흥미로웠던 점은 y2k , 보잉 787에서 다룬 자료형에 관한 에러인데 아주 옛날 보잉 787기 비행기에서 어떤 시스템을 개발할 때 int자료형이 차지하는 메모리 공간을 넘어서는 시간이 280일 정도라고 했다. 이 시간을 넘어서면 비행기의 중요한 시스템은 에러를 예고하고 있었고, 그것은 큰 사고로 이어질 수 있었다. 그래서 이 문제를 해결하기 위해 보잉 787기는 280일이 되기 전에 시스템을 재부팅하는 것으로 문제 해결을 했다고 한다. 더 큰 자료형을 쓴다고 문제가 해결되는 것은 아니지만 개발 과정에서 더 큰 자료형을 사용했다면 560일마다 재부팅했을 수도 있고, 혹은 시스템 중간 특정 시간이 되면 변수를 초기화해주는 과정을 추가했다면 문제가 해결되었을 것이다. 이것이 말하는 것은 변수 하나하나의 자료형에 할당된 메모리를 관리하는 것이 중요하다는 것이다.

 

이 문제로 가장 최근이라고 생각나는 사건은 싸이의 유튜브의 조회수가 2,147,483,647를 넘어서면 -(마이너스)가 붙는 에러가 생긴 것인데 조회수라는 변수는 int 자료형으로 만들어졌고, int자료형은 32비트 즉 4바이트까지 담을 수 있다.

이 32비트는 -2,147,483,647 ~ +2,147,483,647까지

모든 변수를 double로 변경하게 되면 64비트를 기본적으로 사용하게 되는데 하나의 영상으로 보면 32비트만 늘어난 것이지만 수천만의 영상에 32비트를 추가하게 되면 얼마나 많은 양의 메모리를 차지하게 될지 모른다. 그래서 32비트를 초과하는 숫자에 다시 int형을 붙이는 것으로 해결한 것으로 생각된다.

 

 

자료형에 할당된 메모리 관리가 중요하고, 메모리는 무한하지 않아 생기는 오류임을 잊으면 안 된다.

 

 

 

 


 

대학 강의에서 C언어로서 개발이란 것을 처음 접했을 때 해더라던가, make라던가 컴파일의 뜻이라던가 정확히 뭘 의미하는지 모르고 지나친 채 코드를 작성하기 시작했던 것 같다.  c언어가 컴파일 언어고 파이썬이 interpreter 언어라는 것을 알고 이해하고 있는 채로 다시 이런 CS 기초 수업을 듣게 되니까 확실하게 가장 기본적인 부분을 꼼꼼하게 메우고 있는 느낌이 든다. 

 

 

 

 

 

'Development > CS' 카테고리의 다른 글

[CS50] 5강 메모리  (0) 2021.12.23
[CS50] 제 4강 알고리즘  (0) 2021.12.20
[CS50] 제 3-2강 배열  (0) 2021.12.20
[CS50] 제 3-1강 배열  (0) 2021.12.19
[CS50] 제 1강 - 컴퓨팅 사고  (0) 2021.12.16

댓글