티스토리 뷰

요즘은 프로그래밍 언어 중에 파이썬을 처음으로 배우는 경우가 많습니다. 파이썬은 배우기 쉽고 간결한 언어여서 처음 배우는 언어로 좋습니다. 그러나 파이썬 다음으로 C나 자바를 배우려고 할 때는 새로운 개념과 알아야 할 것들이 많습니다. 사실 C는 가장 기본적인 기능을 가지는 언어로 low-level 언어라고 얘기합니다. 그 의미는 프로그램이 가지는 명령어나 기능이 해주는 일이 작고 기본적인 것들이라 파이썬에 비해 프로그래머가 직접 짜주어야 하는 경우가 많습니다. 사실은 파이썬에 비해 해주어야 하는 일이 정~말 많습니다.

그럼 왜 그렇게 불편하고 번거로운 언어를 쓰는 걸까요? 그건 프로그래머가 고생하는 만큼 반대급부가 있기 때문이죠. 가장 큰 장점은 빠르다는 점입니다. C 언어는 정말 빠르고 가볍습니다. 실행 프로그램이 몇 K바이트고 그걸로 충분해 하드웨어 스펙이나 메모리 요구 등이 거의 없다고 볼 수 있습니다. 이것은 파이썬의 무거운 실행환경과 비교하면 아주 큰 장점입니다. 또한 컴파일해서 얻어진 실행프로그램(윈도우즈 환경에서 .exe)는 기계어 프로그램으로 CPU가 바로 이해해 실행할 수 있기 때문에 아주 빠릅니다.

자 그럼 이 글에서는 파이썬을 먼저 배운 사람들이 C 언어로 쉽게 진입할 수 있도록 가능한 한 핵심만 간결하게 추려 보려고 합니다. 또한 파이썬과 비교를 통해 차이점을 좀더 쉽게 이해할 수 있게 구성해 보았습니다.

(1) 첫번째 프로그램

- 프로그램의 구조와 기본적인 문법의 차이를 살펴봅니다.

첫줄부터 설명하면 #include 는 파이썬의 import와 같다고 보면 됩니댜. 꺽쇠를 둘러싸서 라이브러리의 이름을 써주어야 하는데, 파이썬에 비해 C 언어에서는 <>, {}, () 등 많은 부분을 해당하는 기호로 묶어주는 경우가 많습니다. 이것은 60년대 이 언어가 나오던 시점에 컴파일러가 프로그램의 구조를 쉽게 파악하게 하기 위해 사용했던 구문(syntax, 프로그램 코드의 모양)이라고 할 수 있습니다. 근데 문제는 파이썬을 쓰던 사람들에게는 이것이 상당히 번거로운 일이라는 점입니다. 이런 걸 빨리 익혀서 에러 없이 자연스럽게 코딩하게 되는 것이 사실 파이썬 프로그래밍을 배운 사람이 C 언어를 습득하기 위해 제일 먼저 해야 하는 일입니다.

두 번째 줄은 메인이라는 함수를 정의하는 부분입니다.
씨 언어에서는 가장 간단한 프로그램도 main이라는 이름의 함수를 가져야 합니다. 이 함수가 프로그램의 시작과 끝을 나타내게 됩니다. 그리고 함수의 이름 앞에는 int라는 키워드가 있고 괄호 안에는 매개변수가 나오는데 매개변수가 없다는 뜻으로 void를 써줍니다. int main(void) { }를 그냥 모든 프로그램을 시작하기 위해 써야 하는 기본 틀이라고 보시면 됩니다. 물론 #include까지 합쳐서 그렇게 한꺼번에 외워두는 것이 좋습니다. (ideone 사이트에서는 처음에 여기까지 자동으로 만들어줍니다.) 사람에 따라 다른 형태의 main을 쓰기도 합니다. 예를 들면 void main() { }도 가능합니다. 또 어떤 때는 int main(int argc, char* argv[]) { } 이런 복잡한 형태도 쓰입니다. 그러나 많은 경우 이 코드는 프로그래밍 환경에서 자동생성해 주는 그대로 쓰면 됩니다.

파이썬에서 C의 이 메인 함수에 대응하는 것은 if __name__ == '__main__': 줄에 해당합니다. 파이썬에서는 이 줄이 없어도 실행이 되지만 씨 언어에서는 메인 함수가 반드시 있어야 합니다.

세 번째 줄은 출력을 해주는 printf 문장입니다. 프로그램은 실행 결과를 보여주기 위해서는 반드시 프린트를 해야 하는데 이것은 파이썬도 마찬가지입니다. 씨 언어의 프린트 문은 나중에는 복잡해지겠지만, 일단 여기서처럼 문자열을 화면에 보여주기만 하는 경우는 파이썬과 같이 프린트 문 안에 그 문자열을 써주면 됩니다. 단, 문자열은 반드시 쌍따옴표를 써야 합니다. 홑따옴표는 다른 의미로 쓰이고 삼중따옴표는 쓰지 않습니다. 그리고 C의 printf는 끝에 줄바꿈을 해주지 않습니다. 그러므로 줄을 바꾸어 다음 출력이 다음 줄에 나오게 하려면 반드시 줄바꿈 문자 \n을 문자열 끝에 붙여 주어야 합니다. (파이썬은 안 써주면 디폴트로 줄을 바꾸죠?)

또하나 C 언어에서는 모든 문장의 끝에 반드시 세미콜론(;)을 붙여야 합니다. 이것도 괄호나 꺽쇠처럼 파이썬에서는 없던 것이라 번거롭기도 하고 손에 익숙치 않습니다. 그러나 컴파일하기 전에 반드시 괄호와 세미콜론을 한번씩 확인하는 습관을 가지고 한동안 신경쓰면 곧 익숙해 질 것입니다. (오류 메시지를 주의깊게 보는 습관을 가지면 좋습니다. 오류가 난 줄번호를 찾아서 그 앞뒤로 세미콜론이 빠진 것은 아닌지 확인합니다.)

다음 문장은 return 0;입니다. 이것은 메인 함수가 int를 반환하여야 하므로 결과값으로 0을 돌려주는 것입니다. 메인 함수는 프로그램을 실행시켜 주는 시스템(운엉체제 또는 웹서버)이 호출하므로 이 반환값 0은 호출한 시스템에게 정상적으로 종료했음을 알려주는 값입니다.

이제 여기까지 해서 프로그램의 구조에 대한 공부를 마쳤습니다.

이제 C 프로그램을 짜서 돌려볼 시간입니다. 가장 쉽게 시작하는 방법으로 온라인 컴파일러를 이용하는 방법을 추천합니다. 사용법 안내는 이 글에서 확인할 수 있습니다. 위의 프로그램을 실행시켜 결과를 확인해 보세요.

(2) 변수의 선언과 사용

- 파이썬은 변수를 선언하지 않고 사용하지만 C 언어는 변수를 반드시 미리 선언해야 합니다.

이 예에서는 세 개의 변수를 사용합니다. n, a, b 세 개의 변수를 선언해야 하는데, 선언할 때는 그 변수를 어떤 종류의 값을 저장하는데 사용할 것인지 미리 결정해야 합니다. 여기서는 세 개의 변수를 모두 정수 값을 저장하는데 사용할 것이므로 int n, a, b;로 선언했습니다. 선언을 하면 각 이름에 대해 정수를 저장할 수 있는 메모리를 할당하게 됩니다.

이렇게 선언한 변수 이름에 값을 저장하기 위해서는 지정(=)을 이용합니다. 지정은 왼쪽에 변수(좌변값), 오른쪽은 수식이나 값(우변값)이 됩니다. 그 값을 좌변값 변수의 메모리에 저장합니다.

지정은 하나의 문장입니다. 문장이란 컴퓨터에게 어떤 일을 명령하는 단위라고 볼 수 있습니다. 모든 문장은 끝에 세미콜론(;)을 붙여 줍니다.

(2-1) 가장 간단한 프로그램을 파이썬과 비교해 살펴봅니다.

이제 앞에서 살펴본 간단한 프로그램을 파이썬 코드와 비교해 보겠습니다. 왼쪽 붉은 색 박스에 있는 코드는 C 프로그램과 같은 일을 하는 파이썬 코드 부분입니다. 훨씬 간단한 것을 알 수 있습니다. C는 입출력에 필요한 #include를 추가해야 하고 main() 함수도 따로 선언해야 합니다. (파이썬은 py 파일에 바로 코드를 쓰면 main 함수와 같은 역할을 합니다.) 또한 변수를 선언해야 하고 return 0;도 추가되었습니다. 함수의 코드 부분을 { ... }로 둘러싸 주어야 하고 세미콜론도 붙여주어야 합니다. 파이썬이 얼마나 간결하고 편리한 언어인지 다시 한번 확인해 볼 수 있습니다. 파이썬은 #을 이용해 설명문을 나타내는데, C언어는 //를 이용합니다. 또한 /* ... */로 여러 줄의 설명문(파이썬의 ''' ... ''')을 나타낼 수 있습니다.

(3) 값과 타입에 대해 알아봅시다.

다음 예에서는 프로그램 코드에서 값을 나타내는 법과 타입이 무엇인지 살펴봅니다.

변수는 어떤 값을 저장할 것인지 미리 선언해야 하고 선언할 때는 어떤 종류의 값을 저장할 것인지 결정해야 합니다. 이 때 저장할 값의 종류를 타입이라고 합니다. 파이썬에서도 정수, 실수, 스트링, 리스트 등의 타입이 있었습니다. C 언어의 타입도 같은 개념인데, 차이는 C 언어에서는 한 이름이 한번 타입이 정해지면 다른 타입의 값은 저장할 수 없다는 점입니다. 타입이란 사실은 메모리에 값을 나타내는 방법입니다. 어차피 모든 값은 0와 1로 메모리에 써야 되는데, 정수와 소수점 이하를 가지는 실수는 메모리에 쓰는 방법이 달라야 되겠지요? 스트링도 마찬가지입니다. 같은 0와 1으로 구성된 메모리 영역도 그것을 정수로 보느냐, 실수로 보느냐, 또는 스트링으로 보느냐에 따라 값이 달라지게 됩니다.

C 언어의 타입으로 위의 예에서는 int, char와 char*를 보여줍니다. int는 정수를 나타내는 타입이죠? char는 문자형(한 글자)를 나타냅니다. 한글자는 홑따옴표(' ')를 사용하고 반드시 한 글자만 가져야 합니다. 그럼 그 글자는 ASCII 코드라고 하는 인코딩 방법으로 한 바이트(8비트)로 표시됩니다. 그리고 str이라는 변수는 char* 타입을 가지는데, 이것은 문자가 여러개 연결되어 만들어지는 문자열 (또는 스트링이라고도 함)을 나타냅니다. 문자열은 쌍따옴표("")로 둘러싼 부분이며 길이가 얼마든지 될 수 있습니다. 각 변수는 타입을 정해서 선언하고 그 타입으로만 사용될 수 있습니다.

예를 들어 n = "Hello";라고 하면 정수형 변수에 문자열을 지정하였으므로 컴파일할 때 경고(Warning)가 발생합니다. 경고란 프로그램 코드가 C 언어의 의미에 맞지 않게 사용되었음을 나타냅니다. 타입이 맞지 않는 변수에 지정하거나 타입이 맞지 않는 값과 변수를 이용해 연산을 하는 경우에 경고가 발생됩니다. 경고가 있어도 프로그램 수행은 되지만, 프로그래머가 의도하지 않은 결과가 될 수 있습니다. 이에 대해서는 나중에(타입 자동변환) 다시 자세하게 살펴봅니다.

지정문에서 변수에 값을 지정할 때 수치형은 정수냐 실수냐에 상관없이 변수에 맞게 바뀌어서 들어갑니다. a가 정수형일 때 a = 5.5; 처럼 정수 변수에 실수를 저장하면 5.0으로 바꾸어 정수로 저장하게 됩니다. 또한 f가 실수형일 때 f = 10;하면 f에는 10.0이라는 값이 실수형으로 저장됩니다. 

(3-1) 값과 타입을 파이썬과 비교해 봅시다.

(4) 수식과 연산

- 수치형에 대한 연산과 수식을 살펴봅니다.

연산은 연산자를 이용해 변수나 값을 계산하여 결과를 돌려줍니다. 사칙연산 외에 주의해야 하는 것으로 나누기 연산 /와 나머지 연산 %가 있습니다. 기본적으로 사칙연산은 정수와 정수를 연산하면 정수가 나오고 둘 중 하나라도 실수(float 또는 double)면 실수(double) 값으로 돌아옵니다. 지정문은 그러므로 d = b / a; 문장을 수행하면 정수 / 정수여서 정수 몫을 구합니다. 그리고 실수인 d 변수에는 2.0이 저장됩니다.

또한 C 언어의 연산자 중에 ++와 --가 있습니다. 이것들은 1증가 또는 1감소 연산인데, 변수에 대해서만 적용할 수 있습니다. c++;는 사실 c = c - 1;과 같은 뜻인데, 좀더 간결하게 표현한 것이라고 볼 수 있습니다. 변수 뒤에 쓰는 경우 후증감 연산자라고 하고 ++c;처럼 앞에 써도 같은 뜻이 됩니다. 이것은 선증감연산자라고 합니다.

마지막으로 +=이나 %= 처럼 복합지정 연산자가 있습니다. 좌변의 변수에 우변값의 연산을 적용한 결과를 지정을 통해 저장하는 것입니다. 즉 a += b;는 a = a + b;를 간결하게 쓴 것이라고 볼 수 있습니다.

(4-1) 비교와 논리연산을 포함한 조건식

조건식이란 참 또는 거짓이 되는 수식을 말합니다. 이것은 보통 if 문이나 while 문처럼 조건에 의해 실행되는 문장에서 많이 쓰이게 됩니다. C 언어는 파이썬과 달리 if 문이나 while 문의 조건식 부분에 괄호를 해주어야 합니다. 

또한 and나 or 대신 &&와 ||를 씁니다. not에 해당하는 기호는 !입니다. !은 우선순위가 높아서 어떤 조건이 아니다 라고 표현할 때는 조건식에 괄호를 붙이고 그 앞에 !을 써야 합니다.

(5) if 문과 출력

C 언어의 if 문은 if (조건식) { ... }와 같은 형태를 가집니다. 파이썬에서 :과 들여쓰기로 표시하던 부분을 여기서는 { ... }로 둘러싸서 나타내게 됩니다. C는 확실히 괄호를 자주 사용합니다. 

if나 else 에서 해당 수행부가 한개의 문장이면(한줄) { ... }를 생략할 수 있습니다. 예를 들어 위의 코드에서 else {  }에서 중괄호는 생략해도 됩니다. 그러나 문장이 나중에 추가될 수도 있고 헷갈릴 수 있으므로 가능하면 항상 {  }를 해주는 것이 좋은 습관입니다. (주의: 중괄호를 생략하면 제일 앞의 한 문장만 if나 else에 해당한다고 생각하게 됩니다. 들여쓰기는 컴퓨터에게는 아무런 의미가 없습니다.)

또한 파이썬에서는 elif를 쓰는 경우에 C 언어에서는 else if를 쓰게 됩니다.

(6) 입출력 - printf

앞에서 Hello, World를 출력할 때는 printf("Hello, World")를 바로 써주었습니다. 그러나 C 언어에서는 변수나 수식의 값을 출력할 때는 그것이 들어갈 자리와 형식을 가지는 형식 지정자를 먼저 써주고 그 다음에 변수나 수식을 나열하게 됩니다. 형식 지정자는 출력하는 형태 그대로 써주고 변수나 수식이 들어갈 자리를 %d나 %f 같이 %로 표시하게 됩니다. 그러면 뒤에 나오는 매개변수의 인자들을 계산한 값이 차례로 그 자리에 들어가게 됩니다.

printf의 형식지정자에 대해서는 printf 매뉴얼을 참고하시기 바랍니다. %d(정수), %f(실수), %s(문자열)가 대표적입니다.

(6-2) 입출력 - scanf

C 언어에서 입력은 scanf를 이용하여 변수에 값을 읽어들이게 됩니다. 파이썬과 달리 사용자가 입력한 값을 해당하는 타입으로 해석하여 값을 변수에 저장하게 됩니다. 단, 사용자가 어느 변수에 어떤 타입으로 읽어들일지를 명시해 주어야 합니다. (파이썬에서는 input()으로 읽은 문자열을 사용자가 필요에 따라 변환하게 됩니다.)

입력은 printf와 같이 %d, %f, %s 같은 형식 지정자를 사용하지만 몇 가지 점에서 달라집니다.

  • scanf 다음에 나오는 첫번째 매개변수 : 형식지정자를 포함하는 " ... " 부분은 %문자와 빈칸만 포함할 수 있습니다.
  • scanf의 뒤에 이어지는 매개변수 : 뒤에 나오는 것은 변수만 가능합니다. 변수 앞에는 &를 붙여야 합니다. 이것은 값을 읽어 저장할 주소를 전달한다는 의미입니다. 나중에 포인터를 배우면 좀더 잘 이해하게 될 것입니다.

'C 프로그래밍기초' 카테고리의 다른 글

진짜 이차원배열처럼 malloc하는 방법  (0) 2020.03.14
C 포인터 (1) - 개요  (0) 2020.02.11
구조체란 무엇인가?  (0) 2020.02.11
C printf 요약매뉴얼  (0) 2020.01.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함