데니스 리치가 C언어를 세상에 공개한 것이 1972년이니까 언어의 역사가 50년 정도 되었습니다. 반백년이나 지난 언어를 지금도 사용한다는 것이 믿기지가 않죠?
아직도 대학의 컴퓨터구조와 운영체제 교재에서는 C언어 문법의 예제를 사용하고 있습니다.
그만큼 C언어가 견고한 시스템인 것을 알 수 있습니다.
시간이 흘러 ANSI C가 C의 표준이 되었습니다. C의 버전이 많기 때문에 기준을 가지고 학습하는 것이 도움이 됩니다.
ANSI C 는 연도별로 번호를 붙이는데 2011년 개정한 C11을 염두해두고 학습하면 좋을 겁니다.
미국 국립 표준 협회(ANSI)와 국제 표준화 기구(ISO)가 출판한 C 프로그래밍 언어의 이후 표준
— ANSI C 위키피디아
종종 MS 비주얼스튜디오의 기본 세팅이 달라지는 경우가 있는데 이것들도 설정하는 방법이 있으나 입문자들에게는 복잡하기 때문에 권장하지 않습니다.
C11을 준수하는 GCC 컴파일러(GNU Compiler Collection)로 시작하는게 좋지만 이 또한 초보자들에게는 혼동스러울 수 있는 부분입니다.
이 포스팅에서는 초보자들이 MS 비주얼 스튜디오로 C언어를 시작하도록 추천합니다. GCC는 C언어에 좀더 익숙해질 때 별도로 설치해도 충분합니다.
앞서 C언어 설치 포스팅 에서 이야기한 것 처럼 기본적으로 C언어는 다른 언어와 비교해서 어렵습니다. 자칫 잘못하면 개발환경을 세팅하는데만 2-3시간이 날아가버리기도 합니다.
그래서 설치하는데 시간은 좀 걸리지만 처음에는 기본 세팅을 해주는 MS 비주얼스튜디오를 사용하는 것이 좋습니다.
C언어 문법 기초 알아보기
목차
예제코드를 통해 C언어 문법 기초를 알아보겠습니다.
#include <stdio.h> int main() { int myNumber; myNumber = 7; printf("기초문법을 설명합니다.\n"); printf("제가 선택한 숫자는 행운의 %d입니다.\n", myNumber); return 0; }
기초문법을 설명합니다. 제가 선택한 숫자는 행운의 7입니다.
예제 코드를 한 줄씩 알아보겠습니다. 여기에 있는 내용을 처음에 다 이해하지 못해도 상관없습니다. 짧은 코드지만 한 줄 한 줄의 정확한 내용을 파악하기 위해서는 뒤에 나오는 챕터를 학습해야 합니다.
앞쪽의 내용을 이해하지 못하면 뒤로 갈수록 쳐지기 쉽습니다.
- #include <stdio.h>
-> #include는 전처리기 지시자입니다.
표준입출력 printf 함수를 사용하기 위해 stdio.h 를 포함시킵니다.
.h 는 헤더파일 확장자입니다. - int main()
-> int main은 C프로그램 실행시 가장 먼저 호출되는 함수입니다. - int myNumber;
-> myNumber 라는 정수형 변수를 선언합니다. - myNumber = 7;
-> myNumber 변수에 7을 대입합니다. - printf(“기초문법을 설명합니다.\n”);
-> stdio.h 에 선언되어 있는 표준 출력 함수 printf 를 호출합니다.
” ” 따옴표 안의 제어 문자열을 출력합니다. - printf(“제가 선택한 숫자는 행운의 %d입니다.\n”, myNumber);
-> %d 는 출력 형식을 지정합니다.
myNumber를 %d (십진수) 형식으로 콘솔에 출력합니다. - return 0;
-> 프로그램이 정상 종료하면 시스템에 0을 반환합니다. - { } 중괄호
-> 중괄호는 영역을 구분합니다. main 함수의 영역도 { } 로 정해져있습니다.
C언어의 코드에는 위와 같은 요소들이 들어있습니다.
전처리기가 있고 main 함수가 나오며 변수를 선언하고 대입하고 함수를 호출해서 작업을 처리합니다. main 함수의 끝에 도달하면 return 문을 실행하여 시스템에게 결과값을 전달하고 종료합니다.
C언어 문장 형식 5가지
C언어의 코드를 살펴봤습니다. 이렇게 설명을 봐도 처음 보면 외계어 같이 들려서 무슨 말인지 알 수가 없습니다.
벌써부터 너무 걱정할 필요는 없습니다. C언어를 오래 가르친 선생님들은 C언어가 가장 배우기 쉬운 언어에 속한다고 말합니다. 순수 C언어에는 최신의 언어에서 배워야 하는 객체지향(OOP)이나 프레임워크, API같은 개념이 없기 때문입니다.
때문에 C언어를 학습할 때는 컴퓨터 구조와 알고리즘에 집중할 수 있다는 장점이 있습니다.
한편으로 처음에는 지루할 수 있습니다. C언어로 어떤 비주얼적 요소를 구현하고 결과물이 있는 코드를 작성하려면 타언어에 비해 조금 더 시간이 걸립니다.
하지만 그만큼 성취감이 높으니 지적인 도전을 즐기는 사람들에게는 재미있는 놀이입니다.
- 선언 (declare)
- 대입 (assignment)
- 함수 (function)
- 제어 (control)
- 널 (null)
C언어를 구성하는 요소들을 분해하면 위의 다섯가지 문장 형식이 나옵니다.
선언
대표적 선언문은 변수의 선언입니다.
int num; 은 num 이라는 식별자로 정수의 사용을 컴파일러에게 지시합니다.
대입
대입문은 할당한다는 말과 같습니다.
num = 7; 은 숫자 리터럴 7을 num 변수에게 대입하겠다. 즉 복사하겠다는 말입니다.
숫자 7을 리터럴(literal) 상수라고 합니다.
함수
함수를 호출하면 프로그램의 제어는 피호출 함수로 이동합니다.
스택메모리가 지역변수의 영역(scope)으로 변경되고 함수의 끝인 return 문장까지 수행되고 원래의 호출함수로 제어를 반환하며 종료합니다.
{ } 중괄호를 쳐놓은 곳은 지역으로 함수의 영역을 구분합니다.
제어
if 나 while 문 등을 사용하여 실행하는 명령어의 위치를 제어할 수 있습니다.
CPU는 프로그램 카운터(Program Counter – PC)에 따라 순차적으로 명령어를 실행하지만, 제어문을 사용하면 프로그램의 특정 코드 블록을 선택하거나 반복하는 등의 조작을 할 수 있습니다.
널
널은 별도의 행동을 하지 않는 경우 사용합니다.
앞으로 학습하는 C언어 문장들은 5개 형식중에 하나가 됩니다. 지금은 문장형식에 따라 프로그램안에서 속성이 달라진다 정도로 이해하면 충분합니다.
주석(comments)
주석은 유지보수와 커뮤니케이션 목적을 위해 소스코드에 기록한 내용을 의미합니다.
주석이라고 하니까 웬지 딱딱한데 영어로는 Comments 쉽게 말해 논평, 댓글 같은 것 입니다. 최초 코드의 작성자가 쓰고 유지보수하는 사람이 코드를 수정할 때 씁니다.
#include <stdio.h> int main() { // 한줄 주석입니다. printf("주석을 처리합니다.\n"); // 사이드 주석입니다. /* 여러줄 주석입니다 여러줄 주석입니다 */ return 0;
한줄 주석은 // 이며 // 의 뒤에 나온 것은 주석이됩니다. 앞쪽의 코드는 실행합니다.
여러줄 주석은 /* 주석 */ 의 형태입니다. 여러줄에 걸쳐서 주석을 처리합니다.
컴파일러는 주석을 무시하는데 C프로그램을 만들기 위해서 컴파일러가 알 필요가 없는 내용이기 때문입니다.
그렇긴 한데 미래의 코드를 유지보수하는 프로그램에서는 AI프로그램이 주석에 적혀있는 텍스트를 자연어 처리하여 활용할 가능성이 높습니다.
물론 현재 C의 컴파일러와는 상관이 없습니다.
변수이름 규칙 (Identifier rule)
컴퓨터로 소스코드를 작성하다 보면 이름공간(name space)이란 개념이 필요합니다.
프로그래머가 변수에게 이름을 지어줄 때 만약 C언어의 이름공간(name space)에서 예약해둔 이름과 같으면 사용할 수 없습니다.
C언어 컴파일러에는 변수의 이름을 짓기 위한 몇가지 규칙이 있습니다.
- 변수는 대문자, 소문자, 숫자, 밑줄(_)을 사용할 수 있다.
- 첫 문자에 숫자는 올 수 없다.
- 특수문자는 사용할 수 없다.
한 가지를 추가하면 변수의 이름은 가능한한 구체적인 의미를 나타내는 것이 좋습니다
myName -> ‘나의 이름’ 처럼 뜻이 명료할 수록 좋습니다
또한 Naming Convention – 이름 관습 이라는 코딩스타일이 있는데 이는 프로들의 협업에서 요구되는 일종의 규칙입니다. 이 부분은 너무 신경쓰지 않아도 됩니다. 처음에는 컴파일러의 규칙에 따르는 것에 집중합니다.
아래의 예는 컴파일러의 규칙을 지키지 않은 코드입니다. 이것들은 작동하지 않습니다.
#$number 3number number-3 ...
요약
예제를 통하여 C언어 문법 기초 살펴보는 것으로 시작합니다.
C언어의 5개의 문장 형식을 참고할 수 있습니다.
주석을 사용하는 방법과 변수 이름인 식별자를 짓는 규칙에 대하여 알아봤습니다.
외부참조
smoothie_coding/c_tut/basics at main · neokayken/smoothie_coding (github.com)
Learn C Programming C언어 문법 기초 (programiz.com)
C언어 문법 기초 | 통합개발환경 설치, 온라인 컴파일러