기본 입출력 함수
헤더 파일
#include <iostream>
- 위의 헤더파일을 반드시 추가해야 사용 가능합니다.
- cin,cout 모두 std 네임스페이스 내에 존재합니다.
참고로 아래의 코드를 추가하면 std:: 를 붙이지 않고도 사용할 수 있습니다.
1.전체 네임스페이스를 std로 선언하는 방식.
이는 추후에 문제가 생길 수 있는 방식이니 초반에만 사용하도록 합니다.
using namespace std;
2. cin,cout에 대해서만 네임스페이스를 지정해주는 방식
이 방식이 좀 더 권장되는 방식입니다.
(사실 귀찮아서.. 저는 1번도 자주 사용합니다.)
using std::cin;
using std::cout;
std::cin
#include <iostream>
int main(){
int num; //변수 선언
std::cin >> num; //변수 입력
}
- 가장 기본적인 cin의 활용 방식입니다.
- 백준 저지의 경우라면 입력으로 보여주는 숫자들이 프로그램 흐름상 차례로 변수에 입력되게 됩니다.
- >> 의 방향에 유의하도록 합시다. 저는 변수에게 집어넣는다고 연상해서 외웠습니다.
std::cout
#include <iostream>
int main(){
int num; //변수 선언
std::cin >> num; //변수 입력
std::cout << num; //변수 출력
}
- 앞서 cin으로 값을 입력받은 num 변수를 출력하는 모습입니다.
- cin과 화살표 방향이 반대임을 꼭 유의하도록 합니다.
-여러개의 변수를 한꺼번에 입출력 시
std::cin >> a >> b;
std::cout << a << b;
- 너무 횟수가 늘어나는 경우에는 당연히 반복문 등을 활용하도록 합니다.
시간 제한 환경에서의 빠른 입출력
- 무턱대고 cin과 cout을 쓰다 보면, 백준 저지등에서 시간초과가 날 수 있습니다. 속도가 아주 느리거든요.
- 속도가 느린 이유는 저도 자세히는 설명이 어렵지만(잘 모름), 대체로 2가지로 추려볼 수 있습니다.
- 타 언어(C나 Java등)와 달리 입출력하는 데이터의 형식을 지정하지 않습니다.(데이터가 int인지, string인지..) 아주 편리하죠.
- iostream이 cstdio와 동일한 버퍼 시스템을 사용하기 때문에. (잘 이해가 되지 않으나 printf, scanf등을 모두 호출한다고 함)
- 그런데, 느리다고 해서 나쁜 걸까?
- 그렇지는 않습니다. 아래의 방식들은 시간 제한이 있는 코딩테스트 등의 특수한 상황에서의 대처법일 뿐입니다.
- cin, cout이 나중에 나온 언어이니 만큼 안정성, 확장성 등에서는 더 뛰어나다고 합니다.
1. C의 입출력 사용하기
헤더파일
#include <stdio.h> //C의 방식
#include <cstdio> //C++의 방식
- stdio.h와 cstdio는 namespace가 다르다곤 하지만.. 다들 취향껏 사용하시는 듯 하니 골라서 쓰시면 됩니다.
scanf
#include <cstdio>
int main()
{
int num;
scanf("%d",&num); //입력
}
- %d란 무엇일까요? cin과 달리 printf는 입력받는 데이터의 형식을 지정해 주어야 합니다.
- 바로 그 데이터의 형식을 알려주는 문자를 형식지정자 라고 합니다.
- 형식지정자에 관해서는 아래의 페이지를 참고 해 주세요! (추가 예정)
- 그렇다면 입력 받는 변수 앞에 &를 붙이는 이유는 무엇일까요? (참고로 &는 코딩 초기에 자주 까먹습니다. 유의하세요.)
- C에서 포인터를 배웠다면 아시겠지만.. &를 변수 앞에 붙여주면 변수의 메모리 주소라는 의미입니다.
- 여기서는 num의 메모리 주소로 가서 입력받은 int 데이터를 입력하라는 뜻으로 보면 되겠죠.
- 한번에 여러개의 입력을 받을 때는 아래처럼 사용하면 됩니다.
scanf("%d %d %d",&a,&b,&c);
printf
#include <cstdio>
int main()
{
int num;
scanf("%d",&num);
printf("%d",num); //출력
}
- scanf와 거의 동일한 모양입니다. 다만 변수 앞에 &가 붙지 않음을 유의하세요.
- scanf와 달리 문자열과 함께 사용할 수 있습니다. 아래와 같습니다.
printf("%d 더하기 %d 는 %d 입니다.\n",a,b,a+b);
2. 버퍼 동기화 끊기 + untie
버퍼 동기화 끊기
ios_base::sync_with_stdio(false);
- 앞서 말한 cstdio와 iostream의 버퍼 동기화를 끊어줍니다.
- 메인 함수 안, 가장 윗줄에 추가하여 사용합니다.
- 다만, 이걸 사용한 경우에 cin,cout을 사용하면서 printf,scanf를 동시에 사용하는 것은 불가능하니 유의합시다.
untie
cin.tie(NULL);
- cin과 cout의 tie를 풀어줌으로써 속도를 향샹시키는 방식입니다.
- cin과 cout의 tie의 의미 : 서로의 IO작업 전에 자동으로 버퍼를 비웁니다.
- 따라서 이 코드를 사용한 경우에는 수동으로 버퍼를 비워줘야 합니다. (대체로 코딩테스트에서는 잘 없음)
- 마찬가지로 메인 함수 안, 가장 윗줄에 추가하여 사용합니다.
저는 개인적으로 애초에 아래의 형식을 기본으로 두고 사용하는 편입니다. (대체로 백준에서는 문제 없었음)
#include <iostream>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
/*
TODO
*/
}