•  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

C언어

최근 수정 시각 : 2023-04-14 20:14:35 | 조회수 : 13

C 언어란 AT&T 벨 연구소에서 만든 B언어를 개량한 언어로 1972년 켄 톰슨과 데니스 리치가 벨 연구소에서 일할 당시 새로 개발된 유닉스 운영 체제에서 사용하기 위해 개발한 프로그래밍 언어이다. 절차 지향적으로 주로 쓰인다. 켄 톰슨은 BCPL언어를 필요에 맞추어 개조해서 "B"언어(언어를 개발한 벨 연구소의 B를 따서)라 명명했고, 데니스 리치가 이것을 개선하여 C언어가 탄생했다.

목차

1. 기본 문법
2. 자료형
3. 예시
4. 관련 언어
5. 영상

1. 기본 문법

다음과 같이 변수를 정의한다.

type_name var_name;

변수는 기본적으로 정적할당방식을 사용하고 자료형을 반드시 기재해주어야 한다.

예를 들어,

int num;


이라 정의하면 32비트 정수형 변수 num이 메모리에 할당된다.

함수를 선언 후 정의하는 것은 다음과 같다.

return_type_name func_name(param_types param_names)
{
    /* function body */
}


단순히 함수를 선언만 하려면

return_type_name func_name(param_types param_names);


라고 치면 된다. 단, main( ) 함수는 자체적으로 선언된 함수이므로 반드시 정의만 허용된다.

함수의 정의와 선언에 대한 예는 다음과 같다.

void run();

void run()
{
    printf("Running...rn");
}

float sqrt(float x)
{
    /* input the code to get square root */
    return r;
}

2. 자료형

기본 자료형은 아래와 같다.
정수형
자료형크기
char1 byte
short2 byte
int4 byte
long4 byte
long long8 byte

실수형
자료형크기
float4 byte
double8 byte
long double8 byte 이상


자료형 별 크기는 컴파일러마다 차이를 보인다. 참고로 연산자 sizeof는 변수나 상수, 자료형의 메모리 크기를 계산해서 반환하는데, 이를 이용하면 자료형의 바이트 크기를 확인할 수 있다.(1) unsigned를 정수 자료형의 앞에 첨가하면 0 이상의 값만 표시되며, 그 범위가 두 배로 늘어난다. 예를 들어 unsigned int라고 입력한다.

C 언어는 아스키 코드를 사용해 문자를 표현한다. 따라서 변수에 원하는 문자의 아스키 코드를 넣고 %c로 출력하면 지정된 문자가 나타난다.(2)

상수는 literal(리터럴) 상수와 symbolic(심볼릭) 상수가 있으며, 자료형을 근거로 표현된다. 변수와는 다르게 초기화 후 재정의가 불가능하다. 리터럴 상수는 이름이 없는 상수이며, 여러 자료형을 기반하여 상수를 표현할 수 있다. 아래는 여러 자료형의 상수를 표현할 수 있도록 정의된 접미사들이다. 이 접미사들은 대소문자를 구별하지 않는다.
접미사자료형예시
Uunsigned intunsigned int a = 2036U
Llonglong a = 1359L
ULunsigned longunsigned long a = 4321UL
LLlong longlong long a = 3423LL
ULLunsigned long longunsigned long long a = 6842ULL


심볼릭 상수는 이름을 가진 상수이다. 매크로 상수와 const 키의 두 가지 표현법이 존재한다.

3. 예시

다음 간단한 코드가 무엇을 의미하는지 생각해 보자.

#include <stdio.h>

int main(void)
{
    int num;
    printf("10진수 정수를 입력하세요.n");
    scanf("%d",&num);
    printf("16진수로 표현하면 %x입니다.n", num);
    return 0;
}


먼저 첫 줄부터 살펴보자. 첫 줄은

#include <stdio.h>


라고 쓰여 있다. C 계열 언어(C, C++, Java, C#) 전반에 걸쳐 #키워드 구문은 전처리기(preprocessor)에게 특정 명령을 내리는 구문이다. #include는 해당 소스 파일을 인클루드(3)하라는 명령이다. 표준 C 언어 규약으로 꺾쇠괄호(<>) 안에 파일명이 있다면 정해진 인클루드 디렉터리(include directory)에서 그 파일을 찾아 인클루드하고, 따옴표("") 안에 파일명이 있다면 로컬 디렉터리(local directory)에서 그 파일을 찾아 인클루드한다. 여기서는 표준 C 헤더인 stdio.h(std = standard, io = Input/Output)를 인클루드하라는 것이다.

세번째 줄에

int main(void)


라고 나와 있다. 매개변수가 있어야 할 곳에 void 키워드가 있는데, 이는 매개변수가 없음을 명시적으로 드러내는 것이다.(4) 반환값은 32비트 정수형인데 이는 표준 C 언어의 규약이다. 반환값은 일반적으로 0인 경우 정상 종료, -1인 경우 비정상 종료를 의미한다.

이제 main( ) 함수 내부의 본문이다. 처음에 나온 문장은

int num;


인데 이것은 앞에서 다루었으므로 설명을 생략한다. 그 다음은

printf("10진수 정수를 입력하세요.n");


이라 나와 있다. printf( ) 함수는 매개변수로 받은 내용을 출력한다. 여기서 n은 라인 피드(line feed, LF)라고 부르는데, 출력문이 다음 줄로 넘어가도록 지시한다. Windows에서는 키보드의 엔터 키를 누르면 라인 피드와 캐리지 리턴(carrige return, CR; r)이 같이 입력되는 반면, Mac OS에서는 엔터 키를 누르면
라인 피드만 입력된다.(5) 다음으로

scanf("%d", &num);


가 나오는데, 이때 중요한 점은 num이 아니라 &num이 매개변수에 입력된다는 것이다. 이러한 이유는 scanf( ) 함수는 입력되는 숫자를 10진수로 인식하여(%d, d = decimal) num에 입력해야 하는데 num의 주소를 모르므로 num의 주소를 받는 것이다. 이러면 num에 제대로 입력된다. 그 다음 다시

printf("16진수로 표현하면 %x입니다.n", num);


이 나온다. %x는 16진수(heXadecimal)을 의미한다. 보통 프로그래머들은 16진수 표현에서 0x129A23과 같은 표현을 좋아하므로 %#x를 써서 앞에 0x가 붙도록 지시한다. 여기서 %d, %x와 같은 것들을 서식문자라 부르는데, 이에 대해 간단히 정리하면 다음과 같다.

/*
    %c : 단일 문자. Character
    %s : 문자열. String
    %d : 10진수 32비트 정수. Decimal
    %ld : 10진수 64비트 정수. Long Decimal
    %lld : 
    %o : 8진수 32비트 정수. Octal (보통 프로그래머들은 일부러 %#o를 써서 숫자 앞에 0이 붙도록 한다.)
    %x, %X : 16진수 32비트 정수. heXadecimal (보통 프로그래머들은 일부러 %#x를 써서 숫자 앞에 0x가 붙도록 한다.)
    %u : 10진수 32비트 '부호가 없는' 정수. Unsigned decimal
    %f : 32비트 단일 정밀도 실수. Float
    %lf : 64비트 복수 정밀도 실수. Long Float
    %e, %E : 지수 표기법. Exp (%E도 같은 표현. 단, 출력시 e냐 E냐의 차이일 뿐이다.)
    %g, %G : 소수점 이하의 자릿수에 따라 %f와 %e/%E 중 자동 선택.
    %p : 포인터가 가리키는 변수의 주소.
    %% : 퍼센트 표현.
*/


/*
    %3d : 3자리 칸을 만들어 오른쪽 정렬로 숫자 출력.
    %03d : 3자리 칸을 만들어 오른쪽 정렬로 숫자 출력. 비어 있는 곳은 0으로 채움.
    %-3d : 3자리 칸을 만들어 왼쪽 정렬로 숫자 출력.
    %+3d : 3자리 칸을 만들어 오른쪽 정렬로 숫자 출력. 이때 부호 표기.
*/


마지막으로

return 0;


가 나오는데, 이는 main( ) 함수를 호출한 상위함수에 0을 반환한다. 이는 정상적인 종료를 의미하며, 상위함수는 리소스를 정리하고 OS에 종료 신호를 보내 OS가 종료시키도록 한다.

4. 관련 언어

C언어는 직접적으로 혹은 간접적으로 이후의 언어들에 영향을 주었다. C# 언어, D 언어, Go, JAVA, 자바스크립트, Perl, PHP, Python 등이 있는데, 각각에 따라 영향을 받은 정도는 크게 다르다.

C++ 언어와 Objective-C는 C의 확장적 언어라고 볼 수 있는데, 객체지향 언어로서 이용된다. Python의 expression들은 C와 자바와 유사점을 가지며, 파이썬 코드를 C언어로 컴파일하는 Cython을 이용할 수도 있다.

5. 영상



(1) 예를 들면 printf("%d", sizeof(자료형))
(2) 예시로, int asc2=65 이후 printf("%c", asc2)를 입력한다.
(3) #include는 컴파일 이전에 전처리기가 #include 구문이 있는 자리에 해당 파일을 복사한다는 의미이다.
(4) 아무것도 없으면 암시적으로 없음을 알린다고 한다.
(5) 캐리지 리턴을 입력하려면 리턴 키를 눌러야 한다.