7 min read

cpp[1] - 출력문 완전분석

cpp[1] - 출력문 완전분석

지난 글에서 cout을 통한 문자열을 출력하는 법을 알아보았지만, 이것만으로는 대부분의 문제를 해결할 수 없습니다.
보다 많은 문제들을 해결하기 위해서, 출력문에 대해서 깊게 짚어보고 가도록 하겠습니다.

cout의 기본 구조

cout << "출력할 문자열";

cout의 기본 구조는 위와 같습니다.
문자열은 문자가 나된 것이라고 생각해주시면 됩니다.
어떤 출력할 문자열을 << 화살표를 통해 화면으로 출력해 낸다 라고 이해해주시면 깔끔합니다.

여기서 "출력할 내용"이 무엇이냐에 따라 다양한 변형이 가능합니다.

숫자 출력하기

지금까지의 지식을 바탕으로 998244353이란 숫자를 출력하려면

#include <iostream>
using namespace std;

int main(){
	cout << "998244353";
	return 0;
}

다음과 같은 코드를 작성해야 합니다.
그런데, "" 라는 것은 이 안에 있는 내용을 문자열으로 보겠다는 의미의 구문이라서, "998244353"을 출력하는것은 숫자 998244353이 아니라,
문자열 "998244353"을 출력하는 것입니다.

이렇게 한개의 숫자만 다루고 있는 경우에는 출력에 아무런 차이가 없겠지만, 숫자 5+3 을 출력하는것과 문자열 "5+3"을 출력하는 것에는 큰 차이가 있습니다.

전자는 컴퓨터가 계산한 후 8 이 출력되고,
후자는 5+3이 출력됩니다.

이를 해결하고 숫자를 그대로 출력하기 위해서는, 문자열으로 보겠다는 의미의 ""을 제거하고,

#include <iostream>
using namespace std;

int main(){
	cout << 5+3; // 결과:8
	return 0;
}

이렇게 작성해주시면 됩니다.

// 결과:8 이라고 적어둔 부분은 주석으로, C++에서는 해당 부분을 읽지 않습니다. 대부분의 프로그램에서 주석을 회색으로 표기하니 색을 통해 구분하실 수 있습니다.

문자 출력하기

문자 출력하기가 아니라 문자 출력하기임에 신경써주셔야 합니다.
문자열을 "" 으로 감싸서 표기하는 것처럼,
문자 한 글자는 ''으로 감싸서 표기할 수 있습니다.

물론 문자가 한개뿐인 문자열도 존재하기에, "A" 등을 사용하실 수도 있습니다.

#include <iostream>
using namespace std;

int main(){
	cout << "A"; // 결과:A
	cout << 'A'; // 결과:A
	return 0;
}

이 둘의 차이에 대해서는 한번 쭈욱 정리한 후에 보다 심화적인 글에서 다룰 예정입니다. 지금은 같은 역할을 한다 정도로 이해해주세요.

특수기호 출력하기

일반적인 특수기호들은 문자열임을 나타내는 기호 ""를 통해

#include <iostream>
using namespace std;

int main(){
	cout << "!@#$^&*()";
	return 0;
}

로 출력할 수 있습니다.
그런데, " 그 자체를 출력하기 위해서는 어떻게 해야 할까요?

#include <iostream>
using namespace std;

int main(){
	cout << """;
	return 0;
}

그냥 이렇게 작성하면 될까요?
이렇게 작성하면 C++은 해당 줄을 제대로 읽지 못했다고 오류를 출력할 것입니다.

""" 이라는 부분에서 앞의 두 글자 "" 를 하나의 문자열으로 보고,
그 뒤에 뜬금없이 " 가 있기 때문에 오류가 출력되는 것입니다.
이렇듯, 문자열이나 문자임을 알리는 역할을 가지는 문자

  • "
  • '
  • \
  • %
    등은 제대로 출력되지 않는 문제가 있습니다.

이를 해결하기 위해서, C언어에서는 역슬래시 \ 라는 기호를 사용합니다.
역슬래시 뒤에 오는 것들은 일반 문자로 보겠다는 의미가 있습니다.
역슬래시를 사용하여 해당 특수문자들을 출력해 보면

#include <iostream>
using namespace std;

int main(){
	cout << "\""; // 결과:"
	cout << "\'"; // 결과:'
	cout << "\\"; // 결과:\
	cout << "%%"; // 결과:%
	return 0;
}

다음과 같이 출력할 수 있으며, 이때 %는 형식 지정자 라는 다른 분류에 속하기 때문에 %% 로 출력함에 유의하셔야 합니다.
형식 지정자는 C언어에 남아있는 개념으로, C++에서는 불필요하기에 설명에 지면을 할애하지는 않겠습니다.

이 부분은 영어로 비유하자면 문법이기 때문에 외울 생각을 하시는것이 깔끔합니다.

이스케이프 시퀀스와 줄내림

모든걸 출력할 수 있게 된것 같지만, 아직 엔터 가 남았습니다
엔터는 문자 그대로 줄내림을 담당하는데, 키보드에서도 enter이라고 적지
엔터에 대응하는 "글자" 는 존재하지 않습니다.

앞서 역슬래시 \ 기호를 사용하여 특수문자를 표기한다고 하였는데,
엔터 등의 일반적으로 표현할 수 없는 글자도 특수문자의 일종으로 보고,
이들을 이스케이프 시퀀스라고 합니다

  • \n 줄내림, 엔터를 담당함
  • \0 Nul 문자, 문자열의 끝을 의미.

수많은 이스케이프 시퀀스가 있지만, 알고리즘 문제해결시에 필요한것은 이 둘입니다.

복합 출력

이제 숫자, 문자, 문자열을 각각 출력할 수 있게 되었는데,
이들을 섞어서 한번에 출력할 수도 있습니다.

예를 들어서 숫자 출력 후 줄내림을 하고 싶다면,

#include <iostream>
using namespace std;

int main(){
	cout << 998244353;
	cout << "\n";
	return 0;
}

으로 출력하실 수 있습니다.
하지만 지난 시간의 뇌피셜 대원칙에 의하면 최대한 축약하는 것이 좋고,

#include <iostream>
using namespace std;

int main(){
	cout << 998244353 << "\n";
	return 0;
}

cout을 통해 문자열이 나가는것은 똑같으니
왼쪽부터 차례대로 나가도록 다음과 같이 적는것도 가능합니다.

결론

이제 특수문자와 줄내림도 출력할 수 있게 되었으므로,
브론즈V 난이도에서 입력을 요구하지 않는 문제들을 해결하실 수 있습니다.

10171번: 고양이

고양이를 출력하는데 역슬래시 \ 가 포함되어있습니다. 적절한 규칙에 맞게 출력해주시면 됩니다.

지금까지의 배운것을 활용하시면

문제 > 새싹 > 출력 에서의 여섯문제를 모두 해결하실수 있습니다.

  • boj 10718 We love kriii
  • boj 5338 마이크로소프트 로고

등의 문제들도 추천드립니다.