최초의 알고리즘으로 가장 오래된 알고리즘으로 자주 언급되는 것은 기원전 300년경에 만들어진 유클리드의 '최대공약수를 찾는 알고리즘'입니다. 최대 공약수는 2개 이상의 자연수의 공약수 중에서 가장 큰 수를 말합니다.
유클리드는 2개 자연수의 최대 공약수는 큰 수에서 작은 수를 뺀 수와 작은 수와의 최대 공약수와 같다는 성질을 이용하여 최대 공약수를 찾는 알고리즘을 만들었습니다.
예를 들어 24와 14의 최대 공약수는 큰 수에서 작은 수를 뺀 10(=24-14)과 14와의 최대공약수와 동일합니다. 단, 0과 어떤 수 n의 최대공약수는 n이 됩니다.
최대공약수 (24,14)
= 최대공약수 (24, -14, 14) = 최대공약수(10, 14)
= 최대공약수 (14, -10, 10) = 최대공약수(4, 10)
= 최대공약수 (10 - 4, 4) = 최대공약수(6, 4)
= 최대공약수 (6 - 4, 4) = 최대공약수(2, 4)
= 최대공약수 (4 - 2, 2) = 최대공약수(2, 2)
= 최대공약수 (2 - 2, 2) = 최대공약수(0, 2)
= 2
이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.
프로그램은 시스템에서 디지털 데이터 처리를 담당하는 부분으로, 컴퓨터를 사용하면 인간이 상상할 수 있는 모든 작업을 할 수 있습니다.
프로그램은 C와 같은 프로그래밍 언어로, 작성된 코드를 직접 타이핑하여 만드는 것이 아닙니다.
프로그래밍 언어는 수행하고자 하는 작업을 구체화시키는 도구일 뿐입니다.
여기서 중요한 점은 문제를 푸는 것은 결국 컴퓨터가 아니라 사람입니다. 사람이 해결할 수 없는 문제는 컴퓨터 또한 해결하기 어렵습니다.
프로그램을 만들기 위해서는 '알고리즘'과 '프로그래밍 언어'가 필요합니다.
프로그램= 주어진 문제를 해결하기 위해 컴퓨터에서 주어지는 일련의 명령어 집합
컴퓨터는 사람의 말을 이해하지 못하므로 컴퓨터에게 명령을 내리기 위해서는 컴퓨터가 알아들을 수 있는 말이 필요합니다. 컴퓨터에게 명령(복잡한 것)을 내리기 위해서는, 여러 개의 문장이 필요하며, 문장들은 주어진 문제를 해결할 수 있도록 논리적으로 배열되어야 합니다.
'알고리즘'은 문장을 배열하여 내용을 조리 있게 표현하는 방법과 관련되어 있고, '프로그래밍 언어'는 사용할 수 있는
단어와 단어를 사용하여 문장을 구성하는 방법과 관련되어 있습니다. C 언어를 이용하여 두 숫자를 더하고 그 합을 출력하는 코드에서 단어와 문장 그리고 알고리즘을 나타내는 과정을 아래에서 확인할 수 있습니다.
프로그램은 알고리즘과 프로그래밍 언어로 이루어져 있습니다. 프로그램을 만드는 법을 배우기 위한 효과적인 학습방법은 하향식으로 배우는 것입니다.
'하향식'이란 큰 문제를 여러 개의 작은 문제로 나눈 후 작은 문제들을 해결함으로써 결국에 큰 문제로 해결하는 방식을 뜻합니다.
프로그램을 작성하는 과정에서는 문장들을 조합하여 주어진 문제를 해결할 수 있는 알고리즘 작성 방법을 먼저 배우고, 개별 문장을 프로그래밍 언어를 사용하여 나타내는 방법을 나중에 배우는 것이 하향식에 해당됩니다. 알고리즘이 프로그래밍을 먼저 무조건 하는 것보다 중요합니다.
우리는 흔히 프로그래밍 언어를 배우는 것만으로도 컴퓨터에 명령을 내리고 주어진 문제를 해결할 수 있다고 생각합니다. 프로그래밍 언어를 배우면 컴퓨터가 이해할 수 있는 몇 종류의 문장을 만드는 방법을 배울 수 있지만, 프로그램은 수십 혹은 수백 개의 문장으로 구성되며, 매우 복잡한 프로그램은 수만 개의 문장으로도 구성이 됩니다.
예를 들어 드론을 설계, 조립 사용 설명서를 만든다고 가정을 합니다. 한글만을 배워서 간단한 문장을 쓰는 중학생이 이 설명서를 말로 설명하거나 작성을 할 수 있을까요? 이와 마찬가지로 컴퓨터가 알아들을 수 있는 문장 작성 방법을 배우고, 문장들을 논리적으로 나열하기 위해서는 컴퓨터에 관련된 지식이 필요합니다. 더불어 컴퓨터에게 주어진 문제를 해결하도록 명령을 내리고 싶다면, 먼저 컴퓨터가 문제를 해결하는 방식에 맞는 알고리즘을 만들어야 하고, 알고리즘을 실제로 구현하기 위해 프로그래밍 언어가 필요합니다.
프로그래밍 언어는 문제를 해결해 주지 않으며, 알고리즘을 구현하는 도구일 뿐입니다. 실제로 문제를 해결하는 것은 알고리즘입니다. 알고리즘을 만든 후 이를 구현할 때는 어떤 프로그래밍 언어를 사용해도 괜찮습니다.
알고리즘은 프로그래밍 언어와 독립적이며, 컴퓨터가 문제를 풀어 나가는 방식에 맞게 문제 해결 방식을 기술한 것을 말합니다. 사람이 문제를 해결하는 방식과 컴퓨터가 문제를 해결하는 방식은 달라 보이고, 실제로도 다릅니다. 하지만 컴퓨터를 만드는 것은 사람이기 때문에 컴퓨터가 문제를 해결하는 방식이 사람이 문제를 해결하는 방식과 전혀 다르지 않습니다. 다만, 컴퓨터는 생각보다 단순하기 때문에 이해할 수 있는 내용이 그리 많지 않으므로 사람이 생각하는 방식 중 가장 간단한 방식으로만 문제를 풀어나갈 수 있습니다. 또한 컴퓨터는 융통성이 없기 때문에 문제를 풀어 나갈 때 모호한 점이 있어서는 안 됩니다.
컴퓨터의 문제 해결 방식과 절차를 배우는 것이 바로 알고리즘 학습 방식입니다.
이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.
사람이 가장 잘 이해할 수 있는 프로그래밍 언어(Python, Java, C++, C#, C, Ruby, Go)언어로 작성한 프로그램이라도 컴파일러가 이해할 수 있는 컴퓨터를 위한 기계어로 번역할 수 있습니다. 따라서 사용자는 번역기가 제공하는 프로그래밍 언어의 문법에 맞게 프로그램을 작성해야 합니다.
프로그래밍 언어가 요구하는 문법을 나열하는 것을 서술(Statement)형식이라고 합니다. C 언어도 몇 가지 서술 형식을 가지고 있습니다.
◎ C 언어의 기본 서술 형식
1) 단일 서술문
단일 서술문(Single Statement)은 논리적인 최소 명령 실행 단위입니다. 즉 한 개의 서술문 단위로 작업이 진행됩니다. C 언어는 ; (세미콜론)으로 문장을 구분하며 Java, Python등의 프로그래밍 언어또한 논리는 똑같습니다. ; (세미콜론)으로 문장을 구분하기 때문에 한 줄에 여러 개의 서술문은 쓸수도 있습니다.
ex)
a = a + 30; /* 한 줄로 이루어진 단일 서술문 */
a = a + 30; /* 두 줄로 이루어진 단일 서술문 */
a = a + 30; b = b + 50; /* 한 줄에 두 개의 단일 서술문을 사용합니다. */
위의 예와 같은 표현법은 모두 가능하며 총 4가지의 서술문을 사용한 것입니다.
※ 주의: C 언어 및 다른 프로그래밍 언어에서 코드를 작성할시에 문장을 마무리 할 때 반드시 ; (세미콜론)을 사용해야 합니다. ; 을 사용하지 않으면 프로그램이 제대로 실행되지 않고 오류가 발생하게 됩니다
2) 복합 서술문
복합 서술문(Compound Statement)은 여러 단일 서술문을 { } 중괄호를 사용해 하나로 묶은 형태입니다. 중괄호의 안의 단일 서술문이 모두 수행되면 이 복합 서술문이 수행된 것으로 처리가 됩니다. 예를 들어 아래의 사진과 같이 적으면 단일 서술문 2개를 사용한 것이 아니라 복합 서술문 1개를 사용한 것입니다.
{ a = a + 30; /* 주의 단일 서술문 뒤에는 항상 ;(세미콜론)을 찍어주어야 함 */
b = b + 50; } /* bracket { }뒤에는 찍어줄 필요가 없음 */
복합 서술문은 { } 중괄호를 사용하기 때문에 자신의 영역이 구분이 됩니다. 따라서 ; (세미콜론)을 사용할 필요가 없습니다. 하지만 다음과 같이 } (닫는 중괄호) 뒤에는 ; (세미콜론)을 사용해도 오류가 나지 않는데, 이것은 복합 서술문을 사용한 후 의미 없이 단일 서술문 1개를 적은 것으로 간주되기 때문에 정상적인 사용방식은 아닙니다.
{ a = a + 30; }; /* 의미 없는 단일 서술문
◎ 역할에 따른 서술 형식
1) 수식 서술문
수식 서술문(Expression Statement)은 계산 수식을 표현한 단일 서술문입니다. 앞에서 단일 서술문 설명을 위해 예로 든 내용도 수식 서술문에 해당합니다. 두 값을 평균을 내는 수식을 구성해 보면 아래의 예제와 같습니다.
average = (a + b) / 2; /* 프로그래밍에서는 나눗셈 기호를 계산기와 같이 / 로 사용합니다.
2) 조건 서술문
조건 서술문(Selection Statement)은 조건을 만족하면 지정한 서술문을 수행하도록 작성한 서술문입니다. 어떤 값이 5보다 크면 해당 값을 0으로 변경하는 조건문을 구성해 보면 아래의 예제와 같습니다.
if(a > 5) a = 0;
3) 반복 서술문
반복 서술문(Iteration Statement)은 단일 서술문 또는 복합 서술문을 반복해서 수행하도록 작성한 서술문입니다. 이 소스 코드는 0에서 4까지 더하는 기능을 반복문을 사용해 구성한 것입니다.
int sum = 0, i; for(i = 0; i < 5; i++) sum = sum + i;
4) 라벨 서술문
라벨 서술문(Labeled Statement)은 소스 파일의 특정 위치에 라벨을 지정하고 goto문을 사용해 그 위치로 이동할 수 있도록 작성한 서술문입니다. C 언어가 만들어진 초창기에 기존 프로그래밍 언어를 사용하던 프로그래머들이 쉽게 C 언어로 유입될 수 있도록 제공한 서술문입니다. 그러나 원칙 없이 프로그래머가 원하는 위치로 실행 지점을 이동하는 것은 구조화된 언어인 C 언어의 소스 코드 구성을 파괴할 수 있는 문법이기 때문에 되도록 사용하지 않는 것이 좋습니다.
if(a > 0) goto EXIT; /* 이동(라벨이 표기된 곳으로) */ a = a - 1; EXIT; /* 라벨 */
5) 분기 서술문
분기 서술문(Jump Statement)은 자신이 소속된 서술문을 벗어나거나 흐름을 바꾸어 놓을 때 사용합니다.
break, continue와 같은 문법들이 분기 서술문에 해당하는데 return문, goto문처럼 실행 흐름을 마음대로
조정(서술문의 범위를 마음대로 벗어날 수 있음) 하는 것이 아니라 특정 조건 서술문이나 반복 서술문 안
프로그래밍을 하다 보면 상황을 설명하거나 작업 내용을 기억하기 위해 소스 파일에 메모를 남겨야 하는 경우가 있습니다. 이럴 때 주석문(Comment)를 사용하면 됩니다.
주석문은 /* 기호로 시작해서 */ 기호로 끝나고, 여러 줄에 걸쳐서 사용할 수 있습니다. 또 이 기호가 표시된 부분은 컴파일러가 번역을 하지 않으므로 어떤 내용을 적어도 상관없습니다. 다음과 같이 소스코드에 주석문을 적절히 사용하면 코드의 가독성이 좋아집니다.
average = (a + b) / 2;
/* a , b의 평균값을 계산하여 average에 저장합니다 */
※ 오늘은 C언어 프로그래밍에서 'C언어의 서술형식'에 대하여 알아보았습니다.
이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.
C언어는 4가지 특징을 가지고 있습니다. 이 4가지 특징은 구조화된 언어, 이식성, 확장성, 생산성 등이 있습니다.
1) C언어는 구조화된 언어이다
C 언어 이전의 프로그래밍 언어들은 작업 단위가 구분되지 않고 단순히 나열된 형식이었습니다. 자신이 이전에 작성한 프로그램과 비슷한 기능의 새로운 프로그램을 만들 때에도 기존에 작업한 내용을 재사용하기 힘들었습니다. 그리하여 프로그램을 유지, 보수를 하는데 많은 어려움이 있었습니다.
하지만 C언어는 일정한 단위로 명령들을 그룹으로 묶는 방법을 제공하며, C 언어로 만든 프로그램은 작업 단위가 명확하게 구분되어 유지 보수가 편리하고, 기존 프로그램에서 자신이 원하는 작업을 분리하기도 쉬워서 새로운 프로그램을 개발할 때 재사용하기에도 좋습니다.
2) C언어는 이식성이 높다
C 언어 이식성(Portability)이 높다는 말은 C 언어로 만든 프로그램을 거의 수정하지 않고 다른 하드웨어 또는 운영체제로가져갔을 때도 잘 동작한다는 뜻입니다. 이를 위해 하드웨어에 종속적일 수 있는 부분은 C 언어에서 분리해 런타임 라이브러리(Runtime Library)라는 개념으로 제공하고 있습니다.
그리고 이렇게 외부에서 구현한 것들을 C 언어가 가져다 사용할 수 있게 만들었습니다. 이 런타임 라이브러리는 각 하드웨어 또는 운영체제별로 만들어졌기 때문에 사용자가 작성한 C 언어 프로그램에는 영향을 미치지 않습니다. 즉 하드웨어에 변화가 생기더라도 C 언어 문법이 영향을 받지 않도록 C 언어를 디자인한 것입니다.
4) C언어는 확장성이 좋고, 표현법이 다양해서 자기만의 표현법으로 개발이 가능하다
C 언어는 사용할 확률이 높은 문법만 최소한으로 유지하고 사용 빈도가 낮은 문법은 사용자들이 스스로 구현하기 때문에 언어의 기능을 확장할 수 있습니다. 따라서 C언어는 다른 언어에 비해 표현법이 더 많고, 개발자가 개발 상황에 따라 선택할 수 있는 문법구조나 표현법이 다양하여 자율성이 높습니다. 그래서 상대적으로 더 어렵게 느껴질 수도 있습니다. 하지만 반대로 다양한 표현법을 익히고 나면 다른 언어에서 사용할 수 없는 강력한 표현을 사용할 수 있습니다.
4) C언어는 생산성이 높다
일부 초보 프로그래머들은 다른 고급 언어에 비해 C 언어의 생산성이 떨어진다고 말합니다. 하지만 초보자 입장에서 봤을 때 제품을 쉽게 개발할 수 있는 언어가 생산성이 높다고 판단할 수 있을 것입니다. 하지만 이는 생산성에 대해 오해하고 있는 것입니다. 생산성의 높고 낮음은 단순히 제품 개발 시간만 계산하여 따질 것이 아니라, 제품을 완성한 후 고객이 만족하고 문제가 없는 상태가 되었을 때까지의 시간도 계산에 넣어야 합니다.
C언어를 사용하는 프로그래머들은 스스로 개발 인프라(명령 그룹, 함수)를 구축하기 때문에 경력이 쌓일수록 인프라가 다양해져서 프로그램 개발 속도가 빨라집니다. 그뿐만이 아니라 사용자의 여러 가지 요구에 대해 스스로 대처할 수 있어서 프로그램의 완성도와 만족도가 더 높을 수밖에 없습니다.
※ 오늘은 C언어 프로그래밍에서 'C언어의 특징'에 대하여 알아보았습니다.
이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.
C언어는 저학년 때 컴퓨터공학 수업에서 꼭 듣고 가는 수업입니다. 대부분의 학생들이 왜 C언어를 배우는지도 잘 모를 뿐만 아니라 보통 포인터 챕터에 들어가면 머리를 싸매고 어려워서 대부분 포기합니다.
앞으로 C언어를 보다 쉽게 공부를 정리하며 풀어가면서 조금 더 흥미를 가질 수 있는 기회를 만들고자 포스팅을 시작하였습니다.
이번 포스트에서는 C언어의 탄생 및 간단한 소개를 하려고 합니다.
벌써부터 노잼주의보 및 지루함이 느껴질 수도 있지만 아는 것과 모른 것의 차이는 격차가 나중에 커질 수도 있습니다. 그리고 역사 및 간단한 개요를 배우시면 나중에 다른 사람들 앞에서도 당당하게 소개할 수 있을 것 같습니다.
C 언어가 만들어진 과정과 특징을 알면 C 언어의 문법 구조를 이해하는 데 있어서 도움이 됩니다. C언어의 문법을 배우기 전에 간략하게 C언어의 역사에 대하여 간단히 알아보겠습니다.
C언어의 탄생
1960년대 개발되었던 운영체제들은 하드웨어 종속적인 언어를 사용하여서 개발되었습니다. 따라서 하드웨어가 바뀌면 운영체제의 많은 부분을 디시 개발해야 했습니다. 벨 연구소의 데니스 리치(Dennis Ritchie)와 켄 톰슨(Ken Thompson)은 이런 불편함을 없애고자 하드웨어가 변경되어도 프로그램을 다시 작성하지 않아도 되는 운영체제를 만들기 위해 노력하였습니다. 1970년에 켄 톰슨은 B 언어를 만들었지만, 이 언어도 하드웨어로부터 독립된 운영체제를 만드는 데 있어 적합하지 않았습니다. 1972년, 켄 톰슨은 데니스 리치와 함께 새로운 언어를 개발하였고, 이것이 바로 C언어입니다.
C언어는 하드웨어의 세밀한 부분까지 제어할 수 있으며, 특정 하드웨어를 직접 표현하지 않도록 문법을 구성하였기 때문에 하드웨어에 독립된 형태로 프로그램을 개발할 수 있었습니다. 데니스 리치와 켄 톰슨은 C 언어를 90% 이상 사용하여 유닉스(UNIX)라는 운영체제를 만들었고, 유닉스는 다양한 하드웨어에서 동작할 수 있는 운영체제로 자리를 잡게 되었습니다.
※ 오늘은 C언어 프로그래밍의 기초인 'C언어의 소개 및 개요'에 대하여 알아보았습니다.
이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.