본문 바로가기

Programming Language/basic C Language

1. 표준입출력

1. 표준입출력

1. Intro

프로그램은 일종의 함수이다. 외부로부터 입력을 받아, 그것을 가공한 후, 결과값을 반환한다. 이러한 일련의 과정에서 입력과 출력의 역할은 정말 중요하다. 이번 단원에서는 C 언어의 기본적인 구조와 간단한 출력과 입력을 하는 방법에 대해 다룬다.


2. C언어의 기본 구조

C 언어의 기본적인 구조는 다음과 같으며, 다음의 기본적인 구조는 반드시 존재하여야 한다.

#include <stdio.h>  // [1]

int main()  // [2]
{    // [3]    
        printf("This Is Vegetable"); // [4]
        return 0;  // [5]
}    // [6]

[0]. 프로그램의 동작 순서


프로그램이 실행될 때에는 맨 윗줄부터 차례로 실행한다. [1]번째 줄 실행 -> [2]번째 줄 실행 -> ... -> [6]번째 줄 실행 -> 종료 순으로 동작한다.



[1]. 헤더파일 인클루드


c에는 프로그래밍의 편의를 위해 미리 만들어둔 함수와, 그들이 정의된 헤더파일이 존재한다.


그림1. 물리적으로 존재하는 헤더파일


여기서 다음 구문이 의미하는 바를 살펴보자.


#include <stdio.h>

#include 는 단어 include가 의미하는 것 처럼 뒤에서 선언할 헤더파일을 코드에 포함하겠다는 의미이다. 즉 위 구문은 stdio.h 라는 헤더 파일에 있는 함수들을 사용하겠다는 의미이다. stdio.h 는 표준입출력(STanDard Input Output)에 관한 내용을 담고 있으며, 뒤에서 다룰 printf 함수와 scanf 함수에 대한 정보 역시 stdio.h 에 기술되어 있다. 앞으로의 대부분의 입출력은 표준입출력을 사용할 것이기 때문에 이 문장은 항상 작성될 것을 염두해 두어야 한다.



[2]. main 함수 선언


프로그래밍은 여러가지 명령어와 함수를 이용해 일련의 동작을 정의하는 것과 밀접한 관련이 있다. 일련의 동작을 묶어 '함수'라고 부르는데, c 언어로 프로그래밍을 할 때 개발자는 미리 만들어진 함수와 개발자가 개인의 필요에 의해 만드는 '사용자 정의 함수'를 이용해 본인이 수행하고자 하는 동작을 기술할 수 있다. 여기서 가장 기본이 되는 함수가 main 함수로, main 함수는 단어 main이 의미하는 것과 같이 주主가 되는 함수이다. 하나의 프로그램에 단 하나 존재하며, 프로그램 실행시 가장 먼저 작동되는 함수이다.

개발자나 책에 따라서 이 부분을 기술하는데 차이가 존재하는데, 

// type 1 int main(){     return 0; } // type 2 int main(void) {     return 0; } // type 3 void main() { } // type 4 void main(void) { } ...

와 같이 다양하게 표현된다. main 함수도 결국 하나의 함수이기 때문에 함수가 갖는 특징을 가지고 있으며, 이 부분은 나중에 [사용자 정의 함수] 단원에서 다루어 보도록 한다. 또한 void main()이 썩 본인의 마음에 들지 않기 때문에, 여기에서는 당분간

int main()
{
        return 0;
}

의 형식으로 기술할 것이다.



[3], [6]. 중괄호


C언어에서 중괄호는 문단을 나누는 들여쓰기, 줄바꿈과 비슷하다고 볼 수 있겠다. 열고 닫는 중괄호로 둘러싸인 부분이 하나의 문단이 되는 셈이다. 이것은 나중에 [사용자 정의 함수]와 [변수] 단원에서 다룰 scope의 개념을 다루는 데 중요한 역할을 할 것이다.

지금 단계에서는 '중괄호는 문단을 표현하는과 비슷한 의미이다' 라는 것과 '중괄호로 열었으면 반드시 닫아주어야 한다' 는 것을 알고 넘어가도록 하자.



[5]. 반환식 


[4]를 하기 전에 먼저 [5]반환식에 대해 살펴보자. return 0; 는 단어 return이 의미하는 것과 같이 뒤에 서술한 값인 0을 반환한다는 것이다. 프로그램이 함수에 기술된 동작을 하다가 이 문장에 도달하면 함수의 동작이 끝난 것으로 간주하고 동작을 종료한다.

[0]에서 프로그램은 윗줄부터 차례로 동작한다고 했다. 그렇기 때문에 반환식 밑에 어떤 동작을 기술해도 그것은 프로그램에 의해 실행되지 않는다. 이러한 순서가 중요하기 때문에 [4]보다 [5]번 줄을 먼저 살펴 보았다.



[4]. 함수의 동작 내용


중괄호 사이에, 그리고 반환식 앞의 공간은 함수의 동작을 기술하는 공간이다. 본격적인 프로그래밍은 여기서 이루어질 것이다. 간단한 입출력부터 복잡한 알고리즘의 구현까지 모든 동작에 대한 내용은 여기에 작성된다. 물론 이 부분을 공백으로 남겨놓아도 오류는 발생하지 않는다.

여기서 주의해야 할 점은, 각 문장은 모두 세미콜론[;]으로 끝이 나야 한다는 것이다. 이는 문장의 온점과 같은 역할을 하며, 컴파일러가 문장의 끝임을 인식하게 하는 장치이다.



3. 표준 출력


#include <stdio.h>

int main()
{   
        printf("This Is Vegetable");
        return 0;
}

다음 코드를 빌드한 후 실행시켜 보면 다음과 같은 결과가 콘솔창(흔히 알고있는 검은 바탕과 흰 글씨의 창이다)에 출력될 것이다.



printf란 print format의 약자로 형식화된 문자 출력에 사용되는 함수이다. 가장 기본적인 구조는 다음과 같다.

printf("출력하고 싶은 내용");
printf[함수 이름] ([소괄호 열고] "[쌍따옴표] [출력하고 싶은 내용] "[쌍따옴표] )[소괄호 닫고] ;[세미콜론]

일반적으로 수학에서 함수를 사용할 때 f(x)와 같이 쓰는 것 처럼, 여기에서도 함수이름(인자)의 형식으로 함수를 사용한다. printf 함수는 출력하고 싶은 문자열을 인자로 받는 것이다. 특별히 주의해야 할 것은 문자열을 쌍따옴표로 감싸주어야 한다는 것이다. 왜 그래야 하냐고 물어보고 싶다면

IBM Knowledge Center에서 printf 함수에 대해 자세하게 설명해놓았으니 해당 페이지를 참조하면 도움이 될 것이다.


printf 함수와 함께 사용할 수 있는 c 언어 개념에는 서식 문자와 이스케이프 시퀀스(escape sequence)가 있다.


[1]. 서식 문자

서식 문자는 인자가 문자인지, 정수인지, 실수인지, 문자열인지 등을 안내하는 문자이다. 서식 문자의 종류는 다음과 같으며 외에도 많은 서식 문자가 존재한다.


 서식 문자 종류

서식 문자 의미 

사용 예시 

 %d

10진 정수형(Decimal) 자료

printf("%d", 170914); 

 %lf

 실수형(long float) 자료

printf("%lf", 3.141592); 

 %c

 문자형(character) 자료

printf("%c", 'A'); 

 %s

 문자열(string) 자료

printf("%s", "ThisIsVegetable"); 


가장 자주 사용되는 서식 문자는 위의 네 개이다. 사용 예시와 같이 printf 함수는 서식 문자를 이용한 구조로 사용할 수도 있다.

printf("서식 문자", 출력하고 싶은 내용);
printf ([소괄호 열고] "[쌍따옴표] [서식 문자] "[쌍따옴표] ,[쉼표] [출력하고 싶은 내용] )[소괄호 닫고] ;[세미콜론]

이렇게 서식 문자를 이용해 출력하는 기능은 뒤에서 다룰 변수와 함께 사용되어 매우 강력하게 사용된다.


[2]. 이스케이프 시퀀스

이스케이프 시퀀스는 이스케이프 문자[\]와 다른 글자를 합쳐 만들어진 문자로, 줄바꾸기, 탭 등의 의미를 가진다. 이스케이프 문자는 우리가 흔히 아는 원화 기호, 또는 역슬래쉬로, 키보드의 오른쪽 엔터 위에 위치한다. 아마도 그럴 것이다. 이스케이프 시퀀스의 종류는 다음과 같다.


 기호

의미 

\n 

개행, new line 

\t

 탭, tab

\\

백슬래쉬, \ 

\b

백스페이스, 

\"

쌍따옴표, " 

\'

작은따옴표, ' 


사용 예시는 아래와 같다.

printf("This Is Vegetable.\nI Like an apple");

위 문장을 실행시키면

위와 같이 한줄이 개행되어 출력되는 것을 볼 수 있다.

\\, \", \'의 경우 각각 \, ", '를 출력하기 위해 특별히 존재한다. 이상하게도 %를 출력하기 위해선 \%가 아닌 %%로 써야 한다.



4. 표준 입력


입력의 특징은 출력과 달리 입력된 값을 저장하는 그릇이 필요하다는 점이다. 이 때문에 입력을 받기 위해서는 반드시 [변수]라는 개념을 알아야 한다. 표준 입력의 간단한 예시는 다음과 같다.

#include <stdio.h>

int main()
{
        int a;    // [1]
        scanf("%d", &a);  // [2]
        printf("%d", a);  // [3]
        return 0;
}

[1]번 문장이 바로 변수, 즉 입력받은 값을 저장할 그릇을 선언한 부분이다. 이 개념은 다음 단원에서 자세하게 다루도록 한다.

[2]번 문장이 입력문이다. 기본적인 문법은 다음과 같다.

scanf("서식 문자", &저장할 변수의 이름);
scanf([소괄호 열고]"[쌍따옴표][서식 문자]"[쌍따옴표],[쉼표]&[앰퍼샌드][저장할 변수의 이름])[소괄호 닫고] ;[세미콜론]

printf와 scanf의 각각의 인자가 지니는 의미의 차이에 주의하여야 한다. 또한 저장할 변수의 이름에 &(ampersand)가 앞에 붙음에 주의하여야 한다. 이는 scanf가 저장할 변수의 주소를 인자로 요구하기 때문이다. 주소와 포인터에 대한 개념은 나아아중에 살펴보도록 하고 지금은 그렇다고만 알고 있으면 된다.


int a;
scanf("%d", &a);

scanf에서 서식문자 %d를 사용한 이유는 위에서 본 것과 같이 %d가 정수형을 의미하는 서식문자이며 입력값을 받을 그릇이 정수형(Integer) 변수이기 때문이다. 변수에 대한 내용은 앞에서 언급했듯 다음에 자세히 살펴보도록 하고 지금은 입력받을 변수의 자료형과 서식문자를 알맞게 사용해야 한다는 것만 기억하여도 좋다.


[3]번 문장은 앞에서 말한 강력한 기능에 관한 것이다. 

printf("%d", a);

가 의미하는 바는, "정수형 변수 a에 저장된 정수형 자료값을 출력해라"이다.

개발자가 어떤 수를 입력받고 그 수를 출력하고 싶어졌다고 가정하자. 이런 경우는 셀 수 없이 많을 것이다. 이 때 서식문자를 이용한 출력을 printf가 지원하지 않았다면 어땠을까. 개발자는 다음과 같이 모든 정수에 대한 경우의 printf 구문을 작성하고 난잡한 조건문을 사용해 경우에 맞는 printf 구문을 호출해야 했을 것이다.

if(a == 1){ printf("1"); } else if (a == 2){ printf("2"); }

else if (a == 3){ printf("3"); }

...

else if (a == 170914){ printf("170914"); }

...

하지만, printf 함수를 서식 문자와 함께 사용할 수 있는 덕분에 위에서 본 것과 같이 간단하게 변수에 저장된 값을 출력할 수 있다. python은 그마저도 복잡하다고 해서 print(a)라고 하면 되긴 하지만..


이번 단원에서는 c언어의 기본적인 구조와 간단한 입력, 출력에 대해 살펴보았다. 프로그래밍이 처음인데다가 함수니 입력이니 정수형이니 서식 문자니 뭐니 처음 들어보는 이상한 단어들이 많이 등장해서 곤혹스러운 사람이 충분히 있을 수 있다. 여기서 중요한 것은 프로그래밍 언어도 결국엔 언어이기 때문에 많이 사용해서 익숙해져야 한다는 점이다. 모르는 부분은 다른 강의, 다른 책을 찾아보며 공부하는 것도 중요하고 무엇보다 직접 프로그래밍을 해 보면서(그것이 매우 간단한 것일지라도), 손에 익숙해지는 것이 필요하다.

정 이해하기 어렵다면 이곳은 초급 단계이기 때문에 그저 외우고 익숙해지는 것이 좋을 수도 있다. It's a piece of a cake.을 "이것은 케잌 한 조각이다."로 열심히 해석하는 것 보다는 "식은 죽 먹기"라고 외우는 것이 좋은 것과 같은 이치이다.


매 단원에 간단한 문제를 둘 것이다. 풀어보고 싶은 사람은 푸는 것을 추천한다.






문제 1. 다음과 같이 출력하시오



답안 예시


#include <stdio.h>

int main()
{   
        printf("지축을 박차고 포효하거라\n");
	printf("너의 기개 너의 지조 너의 예지는\n");
	printf("조국의 영원한 고동이 되리라");
        return 0;
}



문제 2. 오늘의 월과 일을 입력받아 다음과 같이 출력하시오.



답안 예시

#include <stdio.h>

int main()
{   
        int day;
	int month;
	scanf("%d %d", &month, &day);
	printf("today is %d, %d\n\n", day, month);
        return 0;
}