본문 바로가기
C

[C] 프로그램 개발과정 / C언어란 / 기본 소스코드 분석

by Lizzie Oh 2022. 10. 21.

컴파일러 기반 언어들이라면 개발에 공통적으로 설계 - 원시코드 작성 - 컴파일 - 링크의 단계를 거친다. 

  • 설계 : 아이디어에 대해 구체적인 로직을 문서화하는 단계. 가장 중요하고, 오래 걸리는 단계이다
  • 원시코드 작성 : C언어로 코드 작성 ('원시'코드는 컴퓨터가 이해할 수 없는 고수준 언어로 작성한 코드) 
  • 컴파일: 원시코드를 컴퓨터가 이해할 수 있는 binary 코드로 변환하는 과정. 컴파일된 파일을 목적코드(object file) 이라고 한다.
  • 링크 : 컴파일 된 목적코드 파일들을 서로 연결하고, 필요한 라이브러리들을 연결하여 하나의 실행파일을 생성하는 단계 

컴퓨터는 예나 지금이나 이진수 기반의 기계어만 인식할 수 있었기에 초기 프로그래밍은 0과 1로 구성된 기계어로 이루어졌다. 이에 불편함을 느낀 사람들이 이를 좀 더 알아보기 쉽게 하기 위해 어셈블리어를 만들어냈다. 어셈블리어보다 더 사람이 이해하기 쉽도록 B언어가 개발되었는데, 이 B언어를 개조해서 만든 언어가 C언어이다. (B언어는 Bell 연구소에서 만들어서 B 언어인데, C언어는 그냥 알파벳 B다음이 C라서 C언어로 명명했다고 한다 ㅎ)

 

C언어는 본래 UNIX 운영체제를 재코딩하기 위해 만들어진 언어이다. (즉, 처음부터 시스템 프로그래밍을 염두에 두고 개발된 언어이다) 미국의 벨 연구소에서는 유닉스 운영체제의 원본을 혼자서 만들어낸 Kenn Thompson 이라는 사람이 있었다. 당시 유닉스는 어셈블리어로 개발되었기 때문에 디버깅이나 성능 향상이 쉽지 않았다. Thompson은 유닉스의 향후 개발을 위해서는 고수준 언어가 필요하다고 생각했고, B언어를 개발했다. 이 프로젝트에 함께 참여한 Dennis Ritchie는 B언어를 보완한 NB (New B) 언어를 만들었고 이후 이 언어가 B와는 다르게 발전하면서 후에 C언어라고 이름을 바꾸었다. 1973년 C언어는 유닉스를 다시 개발할 수 있을만큼 안정화 되었고, 이렇게 UNIX를 C 언어로 다시 쓰면서 portability (이식성) 라는 강력한 이점이 생기게 되었다.

 

C++, Java, C#, Perl 을 비롯한 많은 인기있는 언어들이 C언어의 영향을 받았다. 'C 프로그래밍: 현대적 접근'의 저자 K.N. King은 이미 인기 있는 C 기반 언어들이 있음에도 불구하고 시간과 노력을 들여 C 언어를 배워야 하는 이유를 아래와 같이 제시한다.

  1. C를 배우는 것은 C++, Java, C# 과 같은 다른 언어들의 특징에 대한 통찰력을 제공해줄 수 있다.
    (이 언어들을 처음 배우는 사람들은 주로 C에서 파생된 주요한 특징들에 대해서 익히지 못하곤 한다.)
  2. 아직도 C로 작성된 (오래된) 프로그램들이 많다
  3. C는 여전히 새로운 소프트웨어를 개발할 때 널리 쓰이는 언어이다.
    (특히 메모리나 연산 능력이 제한되어있거나, C 언어의 간결성이 필요한 상황에서! )

 

소스코드 분석

#include <stdio.h>
int main(void)
{
    printf("Hello World\n"); //Hello World 문자열 출력
    return 0;
}

 

1. #include <stdio.h>

💡 #를 붙이면 코드가 수행되기 에 처리된다.

      즉, #include <stdio.h>는 코드를 처리하기 전에 stdio.h 파일을 포함하겠다는 의미

💡 stdio.h 파일을 포함해야 하는 이유:
      4째 줄의 printf() 함수는 stdio.h 파일에 정의되어있는 함수이므로, stdio.h를 포함하지 않으면 컴파일러가 에러를 표출할 것

💡.h 가 붙어있는 파일은 헤더 파일. 헤더파일은 주로 함수나 변수의 선언을 하는 파일이다.
     stdio.h 파일은 C언어의 가장 기본(standard) 입출력 (input output) 기능을 가진 라이브러리 

2. int main(void) {}

💡 int는 함수의 출력값, void는 함수의 입력값, main은 함수의 이름, 함수 정의 영역은 { 부터 } 까지이다. 
 
💡' main'  이라는 이름의 함수는 C언어에서 C코드 수행의 시작지점이 되기 때문에 반드시 정의되어야 하는 필수적인 함수

  - C언어는 기본적으로 함수들의 집합으로 구성되는데, main 함수가 호출하지 않는 함수는 수행되지 않기 때문
  - main 함수는 다른 함수들을 호출하고, main 함수 자체는 운영체제에 의해서 호출된다. 

3. printf("Hello World\n");

💡 printf는 print + formatting. 즉, 서식화된 출력을 의미한다. 
💡 C언어에서는 문장을 마칠 때 만드시 세미콜론 을 붙여야 한다. (단, #가 붙은 전처리문들은 예외) 

4. return 0 ;

💡return은 두 가지 역할을 수행 : 값을 반환 & 함수를 종료 
 

5. //Hello World 문자열 출력

💡C언어에서는 //로 한줄 주석 처리,  /*  */로 여러 줄 주석 처리를 한다. 주석은 컴파일시 아예 무시된다.
💡주석도 코드의 일부임을 기억해야 한다 ("주석을 무시하고 코딩을 하는 오만방자함을 범하지말자")

 


Reference

1. C Programming : A Modern Approach, 2/E  K. N. King | W. W. Norton & Company

2. 나혼자 C언어 이창현  | 디지털북스 | 

반응형

댓글