부스트코스 CS50 2주차 C언어 기초 강의를 듣고 정리하려고 한다.
1주차에서 알려준 스크래치를 사용해서 간단한 프로그래밍을 해볼 수 있지만
텍스트 기반의 프로그래밍 언어를 통해 컴퓨터에게 동일한 일을 하게할 수 있다.
많은 프로그래밍 언어 중 하나인 C 언어에 대해서 알아보는 시간이었다.
C 언어
C 는 아주 오래되고 전통적인 순수 텍스트 기반의 언어이다.
C 와 같이 프로그래밍 언어는 구체적인 문법(Syntax)를 사용해서 프로그램을 작성해야 한다.
따라서, 문법을 정확하게 사용하지 않으면 에러가 발생한다.
강의에서는 C 에 대한 설명을 위해 스크래치에서 진행했던 실습을 통해 예를 든다.
"hello, world" 라는 문구를 출력한다.
스크래치 언어와 C 언어를 통해 비교해보자.
"초록색 깃발을 누르면" = int main(void) { }
스크래치와 C언어에서 둘 다 '시작한다' 라는 의미를 가지고 있다.
C 언어는 int main(void) { } 에서 { } 중괄호 사이에 원하는 코드를 작성한다.
say 블록 (hello, world) = printf("hello, world\n");
화면에 문자를 출력해주는 역할을 한다.
C 언어에서 사용하는 printf 라는 문법은 문자를 출력하려면 쌍따옴표(" ")로 문자를 감싸주어야한다.
그리고 C언어에서는 세미콜론(;) 을 통해 문장의 끝을 표시해준다. 마침표와 같은 역할을 해준다.
문장 마지막에 \n 이라는 문구가 들어가있는데 줄바꿈 기능을 해주는 특수문자라고 생각하면 된다.
(강의의 예제에서는 \n 특수문자가 들어가있지 않다.)
특수문자에 대해 나중에 배우게 되겠지만
자주 사용하는 특수문자에 대해 추가적으로 정리해보았다.
\n = 줄바꿈 기능
\t = Tab 기능
\\ = \ 문구 출력
\' = '(작은따옴표) 출력
\" = "(큰따옴표) 출력
작은따옴표와 큰따옴표의 경우 printf 에서 출력할 때 문자를 감싸주는 용도로 인식하기 때문에
화면에 출력할 때에는 특수문자를 사용해서 출력해줄 수 있다.
마지막으로 스크래치에서는 사용하지 않았지만
C언어에서는 #include <stdio.h> 라는 한 줄이 적혀있다.
강의에서는 지금 크게 중요하지 않기 때문에 간단하게 설명하고 넘어갔지만 궁금해서 찾아보았다.
C언어에서 #include 는 "~를 포함해라" 라는 뜻을 가지고 있다.
간단하게 하면 파일을 불러오기 위한 역할을 한다고 생각하면 된다.
따라서 "stdio.h" 라는 이름의 파일을 찾아서 printf 함수에 접근할 수 있도록 해준다.
더 자세히 알아보자.
#include 는 전처리기(preprocessor) 라고 부른다.
전처리기는 컴파일하기 전에 컴파일에 필요한 부분을 미리 준비한다고 생각하면 된다.
또한 치환 역할을 하기도 하고 디버깅에 도움을 주며 헤더파일의 중복 포함 방지 역할을 해준다.
C언어로 작성한 프로그램을 컴파일러를 통해 기계어로 번역해준다.
C언어(source code) → 컴파일러(compiler) → 기계어(machine code)
이러한 과정을 컴파일(Compile) 이라고 한다.
컴파일러가 컴파일 하는 과정에서 여러 필요한 부분들을 우리가 지정해주어야 한다.
그래서 필요한 부분을 지정해 줄 때 '#' 으로 작성된 전처리기를 통해 컴파일 전에 처리하라는 의미다.
"stdio.h" 헤더파일은 standard input output 으로 입력과 출력에 관련된 함수를 가지고 있다.
C언어 파일을 작성한 후 저장할 때 "파일이름.c" 로 저장해야한다.
한글 파일은 .hwp, 엑셀 파일은 .xlsx 등 확장자를 통해 어떤 파일인지 알려준다.
따라서 C언어는 .c 를 통해 C언어로 작성된 파일이라는 것을 알 수 있다.
컴파일러
위에서 잠깐 컴파일러에 대한 내용이 나왔다. 다시 정리해보자.
우리가 직접 작성한 코드 = "소스 코드"
컴퓨터가 이해할 수 있는 코드 = "머신 코드"
그럼 "소스코드"를 컴퓨터가 이해할 수 있는 "머신 코드"로 변환하려면
컴파일이란 작업을 거쳐야한다.
이 때, 이런 작업을 해주는 프로그램이 바로 컴파일러다.
C언어로 작성된 소스 코드를 만들어보자.
# hello.c
#include <stdio.h>
int main(void) {
printf("hello, world\n");
}
위와 같이 hello.c 라는 파일을 작성해보았다.
터미널 창의 명령 프롬프트에서 우리가 원하는 명령어를 입력하고 실행시킬 수 있다.
clang 이라는 컴파일러를 통해 hello.c 파일을 컴파일할 수 있다.
컴파일러에는 많은 종류가 있고 make 와 같이 익숙한 컴파일러도 찾아볼 수 있다.
$ clang hello.c
그럼 hello.c 파일이 컴파일 과정을 통해 a.out 이라는 이름의 파일이 만들어지는 것을 확인할 수 있다.
컴파일된 hello.c 파일의 결과는 다음과 같이 확인할 수 있다.
$ ./a.out
a.out 파일 앞에 ./ 를 붙이는 이유는 리눅스 운영체제에서는 실행하고자 하는 파일의 경로를 입력해주어야한다.
전체 경로를 표시해주는 절대경로와 현재 작업 디렉토리 위치에서 파일의 위치를 나타내주는 상대경로가 있다.
./ 는 현재 작업 디렉토리 라는 상대경로를 나타내주는 의미다.
따라서 ./a.out 은 현재 작업 디렉토리에 있는 a.out 이란 파일을 실행시키라는 뜻이다.
만약 a.out 파일이 /home/jaynam 위치에 있다면 절대경로를 통해 /home/jaynam/a.out 으로 실행시킬 수 있다.
그리고 컴파일러를 통해 컴파일된 파일의 이름은 어떻게 바꿀까?
clang 이란 명령어에는 옵션과 전달인자를 통해 추가 기능을 수행할 수 있다.
따라서 -o 라는 옵션과 원하는 파일이름을 전달인자로 받아 실행할 수 있다.
$ clang -o hello hello.c
이렇게 컴파일을 하게 되면 hello 라는 컴파일된 파일을 확인할 수 있다.
마지막으로 예전에 학교에서 c언어에 대해서는 아무것도 모른 채 따라하기 바빴던 것 같다.
이번 강의를 통해 C언어를 작성하고 컴파일러를 통해 실행되는 과정까지 정리해보았는데
그냥 지나친 부분이 많았던 것 같다. 😂
이번 기회에 지나쳤던 부분에 대해서 자세하게 짚고 넘어갈 수 있었던 것 같다. 😆
- 참고 사이트 -
www.boostcourse.org/cs112/lecture/119004
'스터디&교육 > 부스트코스 CS50 2기' 카테고리의 다른 글
부스트코스(Boostcourse) CS50 2주차 심화 과정 💎 생각해보기 (0) | 2021.01.19 |
---|---|
부스트코스(Boostcourse) CS50 2주차 C언어 - 문자열 (1) | 2021.01.15 |
부스트코스(Boostcourse) CS50 1주차 심화 과정 💎 생각해보기 (0) | 2021.01.13 |
부스트코스(Boostcourse) CS50 1주차 스크래치 기초 및 심화 정리 (0) | 2021.01.10 |
부스트코스(Boostcourse) CS50 1주차 컴퓨팅 사고 - 알고리즘 (0) | 2021.01.08 |