공부 자료실/C++

C++ - 입출력

자료수집중 2020. 8. 12.
반응형

 

소스파일을 만들었으니 가장 먼저 "Hello World"를 입력과 출력을 해보겠습니다.

C언어에서 stdio.h의 scanf()(또는 scanf_s())와 printf()를 사용했습니다.

그냥 사용해도 에러는 발생하지 않습니다.

#include <stdio.h>
#define ARRAY_SIZE 20

int main()
{
	char str[ARRAY_SIZE];
	scanf_s("%[^\n]", &str, ARRAY_SIZE);
	printf("%s \n", str);
	return 0;
}

 

하지만 새롭게 C++을 배우기 때문에 C++ 표준 라이브러리를 사용하겠습니다.

C++에서 새롭게 등장하는 iostream(Input/Output Stream)표준 라이브러리 중 하나입니다.

#include <stdio.h>

이 표준 라이브러리를 포함해서 다시 Hello World를 입력받고 출력해보겠습니다.

#include <iostream>

#define ARRAY_SIZE 20

int main()
{
	char str[ARRAY_SIZE];
	std::cin.getline(str, ARRAY_SIZE);
	std::cout << str << std::endl;

	return 0;
}

결과는 위의  scanf()(또는 scanf_s())와 printf()를 사용한 결과와 같습니다.

이제 하나씩 알아보겠습니다.

 

먼저 std(standard의 약어)네임스페이스(namespace)입니다.

네임스페이스란 C++로 넘어오면서 굉장히 방대한 양의 식별자들이 나오게 되고 중복이 되는 상황이 발생하게 되면 구분을 할 수 없는 경우가 생깁니다. 이를 해결하기 위해서 나온 개념입니다.

변수, 함수등의 소속된 영역을 정의해주는 역할입니다.

std::cin.getline(str, ARRAY_SIZE);

위의 코드는 std의 소속된 cin을 사용한다는 뜻입니다. ( ::은 스코프 분석 연산자)

 

다음으로 입출력을 도와주는 cincout입니다.

cincout는 함수가 아닌 객체입니다.

살짝만 보들여다보면 C++은 객체 지향 언어입니다.

객체 지향 언어의 특징으로 C언어에서는 사용하지 않았던 클래스(class)라는 개념이 추가되었습니다.

C++에서 객체는 속성과 동작들을 하나로 묶은 것입니다. 

클래스는 객체를 정의해주는 수단입니다. 그래서 클래스 변수들을 객체라고 부릅니다.

보통 클래스를 붕어빵틀, 객체를 붕어빵으로 많이들 비유하십니다.

틀은 한개만 있어도 여러 개의 붕어빵을 만들 수 있기 때문입니다.

cin을 정의한 클래스는 istream이고 cout을 정의한 클래스는 ostream입니다.

 

 

cin은 scanf()와 다르게 포맷이 필요 없습니다.

예를 들어 정수를 입력받고 싶다면

#include <iostream>

int main()
{
	int num;
	std::cin >> num;

	return 0;
}

여러 개를 동시에 입력받고 싶다면

#include <iostream>

int main()
{
	int num1,num2,num3;
	std::cin >> num1 >> num2 >> num3;

	return 0;
}

변수만 >>(입력 연산자) 뒤에 입력해주면 됩니다.

 

std::cin.getline(str, ARRAY_SIZE);

위의 예제에서 getline()은 cin의 멤버 함수입니다.

문자열을 입력받을 때 cin도 기본적으로는 scanf()처럼 공백을 받지 않습니다. 하지만 getline()을 사용하면 \n(엔터)이 입력될때까지 모든 문자열을 입력받을 수 있습니다.

원형은 다음과 같습니다.

getline(_Elem *_Str, streamsize _Count)

첫 번째 인자는 입력받은 문자열을 저장할 배열이고 두 번째 인자는 배열의 크기입니다.

 

 

cout도 printf()와 다르게 포맷이 필요 없습니다.

<<(출력 연산자)뒤에 출력할 값만 입력하면 됩니다.

#include <iostream>

int main()
{
	int num1=1,num2=2;
	std::cout << "num1 = " << num1 << std::endl << "num2 = " << num2;

	return 0;
}

endl은 출력이 끝났으니 다음 줄(개행)로 넘어가라는 의미입니다. 

다음처럼 수정해도 같은 결과를 볼 수 있습니다.

std::cout << "num1 = " << num1 << "\n" << "num2 = " << num2;

하지만 endl \n은 자세히 들여다보면 중요한 차이점이 있습니다.

endl는 다음 줄로 넘기기만 하는게 아니라 내부 버퍼를 비워주는 역할도 수행합니다.

\n은 단순 개행만 수행합니다. 그래서 endl이 더 무겁습니다. 

 

 

 

댓글