본문 바로가기
프로그래밍/그래픽스

[C] C언어 프로그래밍과 알고리즘 개론

by moo-ti 2023. 8. 14.
반응형

C언어

C언어 개론
C언어는 1970년대 초반, UNIX 운영체제를 위하여 AT&T의 벨 연구소에서 일하던 Dennis Richie에 의하여 만들어졌다. 처음 만들어진 후, 벨 연구소 안에서만 사용되던 C언어는 차츰 외부에서도 인기를 얻기 시작하며 현재는 가장 널리 사용되는 언어 중의 하나가 되었다. Dennis Richie는 이 공로로 1983년에 Ken Thompson과 함께 컴퓨터 분야의 노벨상이라 불리는 Turing Award 상을 수상하였다. 
C언어의 주요 특징은 간결하고 효율적인 언어이며, 저수준의 프로그래밍도 가능하고 고수준의 프로그래밍도 가능하다. 또 이식성이 뛰어나며, 배우기가 어렵다는 특징이 있다.
C언어에는 꼭 필요한 기능만이 들어 있고, C언어의 모든 표기법은 매우 간결하다. 간결성은 C언어의 핵심적인 특징이라고 할 수 있다. C언어가 효율적이라는 의미는 C로 작성된 프로그램의 크기가 작고, 실행 속도가 빠르고 메모리를 효과적으로 사용한다는 것을 일컫는다. C언어는 거의 어셈블리 언어 수준의 효율성을 자랑하며, 이 점은 상업용 프로그램을 작성할 때 큰 장점이 된다. 어셈블리 언어는 기계어를 인간의 자연 언어에 가깝게 기호화한 언어이며 기계 중심의 언어이기 때문에 기계 자체에 대한 지식 없이는 프로그램을 작성하기 어렵다. C언어는 운영체제를 만들었던 언어이니만큼, 어셈블리 언어만큼의 구체적인 하드웨어의 제어가 가능하다. 실제로 TV, 휴대폰, 세탁기 등의 여러 가지 전자기기 안에 들어가는 임베디드 프로그램은 대부분 C언어로 개발되고 있다. 예전에는 어셈블리 언어로 작업했지만 어셈블리 언어는 사용하는 CPU에 따라 프로그램을 변경시켜야 하는 치명적인 약점이 있기 때문에 C언어로 임베디드 프로그램을 작성하며 유지 관리 및 다른 기기로의 이식이 쉬워진다. C언어는 포인터, 비트 단위의 조작으로 여러가지 하드웨어 장비를 섬세하게 제어할 수 있다. 또 모듈 단위의 프로그램 작성을 지원하고 분할 컴파일도 가능하기 때문에 고수준에서의 프로그램 작성도 가능하다. 모듈(module)이란 프로그램을 구성하는 구성 요소로, 관련된 데이터와 함수를 하나로 묶은 단위를 의미한다. 하나의 소스 파일에 모든 함수를 작성하지 않고, 함수의 기능별로 따로 모듈을 구성한다. 이러한 모듈을 합쳐 하나의 파일로 작성하는 방식으로 프로그램을 만든다. 그리고 임베디드 시스템이란 내장형 시스템이라는 뜻으로, 일반적인 PC와 같은 범용 시스템과는 다르게 미리 정해진 특정 기능을 수행하기 위한 하드웨어와 소프트웨어가 내장된 시스템을 일컫는다. top-down(하향식) 설계, 구조화 프로그래밍, 모듈화 설계 등의 소프트웨어 공학의 다양한 기법들을 적용할 수 있다. 또 이식성이 뛰어난데, 한 번 작성된 프로그램을 다른 CPU를 가진 하드웨어로 쉽게 이식할 수 있다. 즉, PC에서 개발된 프로그램도 컴파일만 다시 하면 슈퍼컴퓨터에서 수행시킬 수 있다. C언어는 초보자가 배우기가 어렵다고 하는데, 교육을 위해 쉽게 일부러 만들어놓은 언어가 아니라 지금도 산업 현장에서 사용되는 언어이므로 당연히 어렵다고 할 것이다. 그리고 하드웨어를 제어하기 위하여 꼭 필요한 요소인 포인터는 배우기 어렵다는 특징이 있다. 

알고리즘
문제를 해결하는 절차 또는 방법이 바로 알고리즘(algorithm)이다. 예를 들어 쿠키를 만들기 위해 오븐을 준비했다. 그리고 오븐을 어떻게 사용하는지도 배웠다. 그렇다면 쿠키를 만들 재료만 있으면 누구나 오븐 베이킹을 할 수 있을까? 아니다. 오븐의 사용법은 알고 있지만 어떻게 쿠키를 만들어야 하는지 그 방법은 빠져있다. 즉, 쿠키를 만드는 절차가 빠져있는 것이다. 컴퓨터도 마찬가지로 컴퓨터에 명령을 내리는 프로그래밍 언어만 안다고 해서 프로그램을 작성할 수 있는 것은 아니다. 주어진 문제를 어떻게, 어떤 절차로 해결할 것인지가 빠져 있다면 프로그램을 작성할 수 없다. 이 해결하는 절차, 방법이 알고리즘이다. 어떤 문제가 주어져 있고 이것을 해결해야 한다면 제일 먼저 해야 할 일은 문제를 해결할 수 있는 절차와 방법을 생각하는 것이다. 예를 들면 휴대폰 문자 목록에서 친구와 나눈 문자 내역을 찾고 싶으면 문자 수신함의 첫 번째 페이지부터 한 개씩 내려가며 친구와의 문자 내역을 찾는 것이다. 이 방법은 사람들과 나눈 문자 내역이 많다면 시간이 아주 오래 걸릴 것이다. 다른 방법으로는 문자 내역에서 이름 정렬 기능을 이용해서 찾는 것이다. 이렇게 문제를 풀기 위해서 컴퓨터가 수행해야 할 단계적인 절차를 기술한 것을 알고리즘(algorithm)이라고 한다. 알고리즘을 프로그래밍 언어로 구현하면 프로그램(program)이 되는 것이다. 

그렇다면 알고리즘을 어떻게 기술하는 게 좋을지 생각해볼 수 있다. 처음 시작할 때는 순서도를 사용하는 방법이 있다. 순서도는 플로차트(flow chart) 또는 흐름도라고 하는 것으로 프로그램에서 논리 순서 또는 작업 순서를 그림으로 표현하는 방법이다. 프로그래머는 순서도를 통해 자신의 논리를 가시화하는 것이 좋다. 보통의 순서도는 단순한 기하학적 기호를 사용하며 처리는 직사각형, 판단은 마름모, 입출력 처리는 평행사변형 기호를 사용한다. 순서도의 단점은 알고리즘이 복잡해지는 경우에는 기술하기가 매우 힘들어지는 점을 꼽을 수 있다.

반응형