본문 바로가기
쿤즈 Dev/C

[C언어] 표준입력 표준출력 사용하기 (첫 프로그래밍 시작!)

by :)Koon 2020. 8. 6.

지금까지 C언어를 프로그래밍하기 위해서 여러가지 요소들을 확인해 보았습니다. 키워드와 식별자, 변수와 상수, 데이터 타입까지 이론적인 기초 부분을 알아보았습니다. 앞서 알아본 내용들을 외워야 하는것은 아닙니다. C언어라는것을 진행하다보면 자연스럽게 익혀질 내용이니 걱정하지마세요!

 

2020/07/31 - [쿤즈 Dev/C] - [C언어] 키워드와 식별자. 반드시 필요한 문자들

2020/08/02 - [쿤즈 Dev/C] - [C언어] 변수 (Variables) vs 상수 (Constraints)

2020/08/04 - [쿤즈 Dev/C] - [C언어] 데이터 타입(Data Types) 과 함께 변수 선언하기

그럼 오늘 포스팅에서는 첫번째 프로그래밍을 시작해 보도록 하겠습니다. 오늘 해볼 프로그래밍은 표준출력과 표준입력을 해볼 예정입니다. 그렇다면 이 둘이 어떤것인지부터 알아보겠습니다.

 

참고로 저는 macOS 를 사용중이기 때문에 Xcode 를 이용해서 C언어의 프로그래밍 예제를 만들고 있습니다. Windows 를 사용하고 계신 분들께서는 Visual Studio 2019 Comunity 버전을 다운로드 하시면 무료로 프로그래밍 공부를 하실 수 있습니다.


모니터(표준출력장치)에 내가 원하는 내용을 출력하라

표준출력장치는 보통 모니터를 의미합니다. 표준출력이란 모니터에 내가 원하는 내용을 출력하는 것을 의미합니다. 그리고 표준출력을 하기 위해서 사용하는 대표적인 함수는 printf() 입니다.

 

여기서 잠깐! 함수
함수란 특별한 목적의 작업을 수행하기 위해서 여러 문법들과 명령어들을 모아놓고 이를 하나의 단어로 표현해서 사용할 수 있게 만들어 놓은 것을 말합니다. C언어에서 함수는 모두 괄호() 로 표현합니다.

그럼 변수, 상수, 데이터 타입을 이용해서 첫 프로그래밍을 해보도록 하겠습니다.


소스코드1 printf1.c

#include <stdio.h> // 1. 표준 입출력 함수를 사용하기위해 선언

int main(int argc, char* argv[]) // 2. 메인함수
{
	printf("나의 첫 프로그래밍!"); // 3. 표준출력함수
	return 0;
}

결과1

나의 첫 프로그래밍!

 

1. 표준출력 함수 print() 를 사용하기 위해서는 상단에 #include <stdio.h> 를 사용해야 합니다. #include 는 헤더 파일(.h) 을 포함시키겠다라는 의미입니다. 이때 stdio.h 파일은 STandDard Input Output 의 약자로 표준 입력 출력의 함수들을 모아놓은 파일입니다.

이렇게 미리 정의된 함수를 사용하기 위해서는 반드시 헤더파일(.h) 을 포함시켜주어야 합니다.

 

2. 메인함수라고 적은 main() 역시 괄호가 있기 때문에 함수입니다. main() 함수는 C언어에서 프로그래밍의 시작을 알리는 함수입니다. 그리고 이 메인 함수 내부에 우리가 실행해야 할 구문들을 사용합니다. 지금은 시작할때 무조건 위와같이 int main (int argc, char* argv[]) 라고 사용하도록 하겠습니다. 간단히 int main() 으로 사용해도 됩니다. 익숙함을 주기 위한 것 뿐입니다.

 

3. 우리가 원하는 printf() 함수를 사용하여 화면에 출력하라 라는 의미입니다. 출력할 문장은 큰 따옴표(") 를 사용해서 그 내부에 출력하고자 하는 문장을 넣어주시면 됩니다.

 

그리고 마지막으로 return 0; 라는 문장을 사용해서 프로그래밍을 종료합니다.

 

두 번째 프로그래밍을 해보겠습니다.


소스코드2 printf2.c

#include <stdio.h> // 1. 표준 입출력 함수를 사용하기위해 선언

int main(int argc, char* argv[]) // 2. 메인함수
{
    int score = 90; // 3. int 데이터 타입 선언
    printf("점수 : %d", score); // 4. 서식지정자를 이용한 출력
    return 0;
}

결과2

점수 : 90

1. 표준입출력 함수를 사용하기 위해서 stdio.h 를 포함합니다.

 

2. 프로그래밍의 시작을 알리는 main 함수를 사용합니다.

 

3. 데이터 타입에서 알아본 정수형 자료형 int 를 사용하여 score 라는 변수를 만들고 90 을 저장했습니다. 이제 main 함수 내에서 score 라는 변수는 항상 정수형 데이터 타입인 int 를 가지게 됩니다.

 

4. 변수 score 의 값을 출력하기 위해서 서식지정자를 사용했습니다. 정수를 출력해야 하므로 %d 를 사용하였고 콤마(,)로 구분하여 뒤에 score 값이라는것을 알려주었습니다.

 

정수형을 알아봤으니 이번에는 실수를 출력하는 프로그래밍을 해보도록 하겠습니다.


소스코드3 printf3.c

#include <stdio.h> // 1. 표준 입출력 함수를 사용하기위해 선언

int main(int argc, char* argv[]) // 2. 메인함수
{
    float kor = 92.8f; // 3. float 데이터 타입의 변수 kor 선언
    double eng = 91.9; // 4. double 데이터 타입의 변수 eng 선언
    printf("국어: %.1f, 영어: %.2lf\n", kor, eng); // 5. 점수 출력
    return 0;
}

결과3

국어: 92.8, 영어: 91.90

기본틀인 1번과 2번은 항상 동일합니다. 이후부터는 main() 함수 내부만 설명하도록 하겠습니다.

 

3. 데이터 타입 float 는 실수형 변수입니다. 4 bytes 크기를 가진 변수 kor 를 선언하고 92.8 을 저장하였습니다.

 

이때, Visual Studio 2019 에서 빌드하게 되면 다음과 같은 메세지가 나타납니다.

warning C4305: '초기화 중': 'double'에서 'float'(으)로 잘립니다.

이유는 실수형 변수는 기본적으로 double 로 정의되어 있습니다. 그런데 float 을 선언하였기 때문에 warning 이 발생한 것입니다. warning 은 프로그램에 영향을 지금 당장 끼치지는 않습니다. 따라서 결과도 정상적으로 나오지만 뭔지 모를 찝찝함이 남아있기에 제거해줍니다.

 

float 변수를 선언하고 값을 넣을때, f 값을 넣어주어 이 값이 float 이라 명시해 줍니다. 결론적으로 92.8 이라는 실수값이 double 형태이기 때문에 이를 f를 넣어서 float 형태로 변환해준 것이라 생각해주시면 됩니다.

 

4. 데이터 타입 eng 역시 실수형 변수 double 로 선언합니다. 그리고 실수값 91.9 를 변수에 저장합니다.

 

5. 출력하고자 하는 내용일 큰 따옴표 내에 넣어줍니다. 이때 역시 서식지정자를 이용해서 float 는 %f, double 은 %lf 로 표현하고 뒤에 순서대로 kor, eng 를 콤마 구분으로 사용해주시면 됩니다.

 

그런데 여기서 %f 가 아닌 %.1f, %lf 가 아닌 %.2lf로 사용했습니다. 이것은 소숫점 첫째자리까지, 소숫점 둘째자리까지 표현하겠다는 의미입니다. 그래서 국어의 결과는 92.8, 영어의 결과는 91.90 으로 출력된 것을 알수 있습니다.

 

표준 출력 마지막으로 문자을 받아서 출력하는 방법을 알아보겠습니다.


소스코드4 printf4.c

#include <stdio.h> // 표준 입출력 함수를 사용하기위해 선언

int main(int argc, char* argv[]) // 메인함수
{
    char ch = 'T';  // 1. char 데이터 타입의 변수 ch 선언
    printf("Character : %c", ch); // 2. 문자 출력
    return 0;
}

결과4

Character : T

1. 문자 데이터 타입 ch를 선언합니다. 그리고 값을 저장하기 위해서 작은 따옴표(') 를 사용하여 T 값을 저장하였습니다. 문자 1개를 저장할때에는 반드시 작은 따옴표를 사용합니다.

 

2. 출력하는 방법은 동일합니다. 다만 문자를 출력하기 위해서는 서식지정자 %c 를 사용합니다.


키보드(표준입력장치)로 입력하는 값을 저장해라! 표준 입력!

대표적인 표준입력장치에는 키보드가 있습니다. 지금부터 키보드에서 입력하는 모든 값을 받아서 변수에 저장하고 저장한 값을 다시 표준출력함수인 printf() 를 사용해서 화면에 출력해 보도록 하겠습니다.

 

 

표준 입력장치의 대표적인 함수는 scanf() 입니다.


소스코드5-1 scanf.c

#include <stdio.h> // 표준 입출력 함수를 사용하기위해 선언

int main(int argc, char* argv) // 메인함수
{
    int num; 
    printf("정수 입력: ");
    scanf("%d", &num); // 1. 키보드로 입력받은 값을 num 변수에 저장
    printf("입력한 정수는 %d 입니다.", num);
    return 0;
}

 

결과5-1

error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

위와같이 프로그래밍을 하고 실행하면 Visual Studio 2019 에서는 위와 같은 error 가 발생합니다. 

scanf() 함수가 안전하지 않다는 군요. 대신에 scanf_s() 라는 함수 사용을 권하고 있는것 같습니다. 또는 함수 사용은 그대로 하고 싶을 경우에 _CRT_SECURE_NO_WARNINGS 을 사용하라 라는 메세지 입니다.

 

scanf() 함수가 안전하지 않다는 것은 해킹 공격에 취약한 함수라는 의미입니다. 이유는 또 다른 포스팅에서 알아보도록 하고, 대체할 수 잇는 scanf_s() 함수로 변경해 보겠습니다.


소스코드5-2 변경된 scanf.c

#include <stdio.h> // 표준 입출력 함수를 사용하기위해 선언

int main(int argc, char* argv) // 메인함수
{
    int num; 
    printf("정수 입력: ");
    //scanf("%d", &num); // 1. 키보드로 입력받은 값을 num 변수에 저장
    scanf_s("%d", &num); // 2. scanf_s() 로 변경
    printf("입력한 정수는 %d 입니다.", num);
    return 0;
}

결과5-2

정수 입력: 10
입력한 정수는 10 입니다.

1. scanf 는 주석(//) 으로 변경합니다. 주석은 실행하지 않지만 변경된 소스나 설명을 적을 때 보통 사용합니다.

 

2. scanf_s 를 사용할 때에는 두가지를 넣어주어야 합니다. 앞에는 서식지정자, 뒤에는 변수입니다. 서식지정자는 정수를 입력받기 위해서 %d 를 사용합니다. 변수는 num을 넣어주면 되는데 반드시 앞에 &(주소 연산자) 를 붙여줍니다. 주소연산자는 입력받은 데이터를 뒤에 나오는 변수에 저장하라는 의미로 사용합니다.

 

주소연산자는 포인터에서 조금 더 자세히 다루도록 하겠습니다.

 

만약 scanf_s() 함수를 사용하지 않고 그대로 scanf() 함수를 사용하는 방법도 있습니다. 위에서 언급한 것을 사용하면 됩니다. 그럼 소스코드는 아래와 같습니다.


소스코드5-3 변경된 scanf.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> // 표준 입출력 함수를 사용하기위해 선언

int main(int argc, char* argv) // 메인함수
{
    int num; 
    printf("정수 입력: ");
    scanf("%d", &num);
    printf("입력한 정수는 %d 입니다.", num);
    return 0;
}

결과는 동일합니다. #define 으로 _CRT_SECURE_NO_WARNINGS 를 정의해 놓으면 그대로 사용할 수 있습니다. 보통은 매크로 라고 하는데 이는 보안성 관련된 에러를 무시하겠다는 내용입니다. 그래서 소스코드5-2 와같이 프로그래밍 하시는것을 추천드립니다.

 

실수와 문자도 마찬가지로 동일하게 사용할 수 있습니다.


이번 포스팅에서는 표준입력과 표준출력에 대해서 알아보았습니다. 표준입출력 함수들의 사용도 알아보았습니다. 그리고 이것이 아마 첫 프로그래밍이 되셨을 거라 생각합니다. 프로그래밍을 익히는것은 익숙함의 정도입니다. 얼마나 많이 익숙해져있고 사용해 봤는가가 프로그래밍의 습득 여부입니다.

댓글