※본 포스터와 앞으로 올라오게 될 포스터는 뒷사람이 배운 것들을 바탕으로 복습 겸 작성하는 것이기 때문에 정확하지 않을 수 있습니다.
※C언어 참고 교재: 쉽게 풀어쓴 C언어 Express 개정판(생능 출판, 천인국 지음)
※C++ 참고 교재: 명품 C++ Programming(생능 출판, 황기태 지음)
프로그래밍이란, 컴퓨터가 처리할 일련의 작업을 묘사하는 것을 의미한다. 이때 사용하는 것을 프로그래밍 언어라고 하며, 여러 종류가 있다.
이때, 컴퓨터는 0과 1로 이루어진 이진수 밖에 이해하지 못하는데, 우리는 이것을 기계어라고 부른다. 그러나 기계어는 사람이 사용하기에 매우 불편한 언어이므로, C/C++, C#, JAVA 등 여러 고급 언어를 사용한다. 사용된 고급 언어는 컴파일러라 부르는 시스템 프로그램에 의해 기계어로 변환되어 컴퓨터에서 실행한다. 확장자는 다음과 같다.
고급 언어: *.c, *.cpp, *.h
기계어: *.obj
*.c는 C언어의 소스 파일 확장자이고, *.cpp는 C++의 소스 파일 확장자이다.
*.h는 헤더 파일의 확장자이다.
기계어를 컴퓨터가 실행할 수 있는 파일로 생성하는 행위는 링크라고 하며 링크를 수행하는 프로그램을 링커라고 한다.
일반적으로 컴파일과 링크 과정을 줄여 "컴파일 한다", "빌드한다"라고 한다.
컴파일하는 모드 중에 디버그(Debug)와 릴리즈(Release)가 있다.
디버그의 bug는 말 그대로 벌레를 의미하며, 프로그램의 오류를 벌레에 비유하며, 이를 잡는 행위로 디버깅(Debugging)이라고 한다. 오류를 잡기 위해 각종 정보를 포함해 컴파일을 하며, 따라서 생성파일이 크고 속도상 최적화가 배제된다.
릴리즈는 디버깅을 전부 마치고 난 후 배포용을 만들 때 사용된다. 실행파일에 필요한 정보만 포함해서 컴파일하며, 따라서 실행파일이 작고 속도 최적화가 가능하다.
C언어는 AT&T의 벨연구소에서 만들어졌다. C언어의 특징은 다음과 같다.
- 간결하다.
- 효율적이다.
- 저수준&고수준의 프로그래밍이 가능하다.
- 이식성이 뛰어나다.
C++은 C언어의 개선형이라고 보면 된다. 컴퓨터의 속도가 빨라짐에 따라 소프트웨어의 크기도 커졌고, C언어로 덩치 큰 소프트웨어를 개발할 때 프로그램 코드 관리에 어려움을 겪게되었다. 이런 어려움을 개선하기 위해 마찬가지로 벨연구소에서 C언어에 객체 지향 특성 및 여러 기능을 추가한 것이 C++이다.
따라서 C++은 C언어의 모든 기능을 가지고 있고, 재사용이 가능하며, C언어로 작성된 프로그램도 C++ 프로그램에서 링크하여 사용할 수 있다.
본 게시물에선 C언어를 먼저 중심적으로 다룰 예정이며, 환경은 비주얼 스튜디오 2019을 사용한다.
아래는 C언어의 예시 코드이다. F5를 눌러 실행하며, Ctrl + F5를 눌러 실행을 해도 되지만 이 경우 디버그를 실행하지 않고 진행하기 때문에 별로 추천하지 않는다.
// 이것은 주석이다. 원래는 C++에서 사용이 가능했으나,
// 비주얼 스튜디오의 특성상 C에서도 사용이 가능하다.
// 주석은 일종의 설명문으로 컴파일에는 영향을 주지 않는다.
/*
주석을 여러줄 사용할 때, 위 방법처럼 사용해도 되지만
지금처럼 사용하는 것이 더 간편하다.
*/
#include <stdio.h>
int main(void)
{ // 함수의 시작
// 함수의 몸체
printf("Hello, World!");
return 0;
} // 함수의 끝
#으로 시작하는 문장은 전처리기 지시자이다. 전처리기는 컴파일을 하기 전에 사전 작업을 하는 컴파일러의 일부분이다. #include는 말 그대로 파일을 '포함'시키는 것이다. 특정한 파일을 현재의 소스 코드에 첨부 시켜 하나의 파일처럼 다룬다. 이러한 파일들을 헤더 파일이라고 하며, 헤더 파일은 컴파일러가 필요로 하는 정보를 가지고 있다.
예시에서 사용된 #include <stdio.h>는 입출력 함수에 대한 정보를 가지고 있는 헤더 파일을 포함시킨다는 뜻이다. stdio.h은 Standard Input Output Header의 약자로, C언어의 대부분에서 사용될 헤더 파일이다.
void main(void)는 main()이라는 함수를 정의하는 문장이다. 함수는 특정한 작업을 수행하기 위해 작성된 독립적인 코드이다. 함수를 조금 더 쉽게 표현하자면 아래 이미지와 같다.
y = x + 1처럼 x의 값이 정해지면 y의 값도 자동으로 정해진다. 프로그래밍에서의 함수도 이와 같다. 정해진 식이 주어지고, 원하는 값을 집어 넣으면 그에 맞는 결과물이 나온다. 우리는 이런 함수를 직접 만들거나, 이미 만들어진 것을 사용할 예정이다.
그중 예시 코드에서 사용된 main()은 좀 더 특별한데, main()은 C프로그래밍에서 가장 처음으로 실행되는 함수이다. 즉, 아무리 여러 함수를 만들어도 main()이 가장 먼저 실행되며, 반드시 프로그래밍 내에 main()는 있어야 한다.
함수를 선언한 뒤에는 그 시작점과 끝점을 설정해야하는데, 우리는 이것을 중괄호({})로 표현한다. 중괄호 안에 쓰인 문장은 함수의 몸체로, 함수가 실행되어야 같이 동작할 수 있다.
main() 앞에 붙은 int는 main()의 출력 타입이 정수형이라는 뜻이다. 이러한 데이터 타입에 대해서는 추후에 다룰 예정이므로 지금은 넘기겠다.
printf("Hello, World!"); 은 printf()를 호출하여 모니터 화면에 Hello, World!를 출력한다는 문장이다. printf()는 stdio.h에 포함되어 있는 함수이다. 또한 문장이 끝나면 세미콜론(;)을 붙여주는데, 이는 문장이 끝났음을 의미한다.
return은 함수가 작업을 끝내고 작업의 결과를 반환할 때 사용된다. return 0; 이 시행되면 main()은 작업을 끝내고 외부로 0값을 반환한다. 여기서 외부는 프로그램을 실행시킨 윈도우와 같은 운영체제를 가리킨다. 보통 0의 값은 프로그램이 정상적으로 종료했음을 의미한다.