0. Intro
<코딩테스트 합격자 되기> 스터디를 진행하며 C++을 연습할 계획입니다
1. using namespace std?
C++에서 표준 라이브러리 구성 요소를 현재 파일(scope)로 가져오는 지시문
c++ 코드를 볼 때 `std::` 구문이 항상 존재했었다
`cout`과 같은 코드를 사용할 때에도 `using namespace std`를 사용하지 않으면?
`std::cout`과 같은 형태로 작성해야 한다
2. 항상 써도 될까?
`using namespace std`는 편리할 수 있지만, 개발에서는 사용하지 않는 것이 좋다
이름 충돌을 방지하는 기능인데
만일 내가 만든 custom_namespace가 있을 때, 여기에도 cout 함수가 있다면?
#include <iostream>
#include <string>
namespace my_namespace {
void cout(const std::string& message) {
std::cout << "my_namespace::cout: " << message << std::endl;
}
}
using namespace std;
int main() {
std::cout << "Hello, World!";
return 0;
}
Hello, World를 출력하지 못하고 오류가 나온다
명시적으로 달아준다면?
빌드에 성공하는 모습을 볼 수 있다
3. 입력 받기
https://www.acmicpc.net/problem/11945
백준 뜨거운 붕어빵 문제를 통해 처음 C++ 입력 연습을 진행했다
5 7
0010000
0111010
1111111
0111010
0010000
위의 입력을 반대로 출력하는 문제였다
C++에서 입력을 받을 때에는 우선 `#include <iostream>`헤더를 입력해서
`std::cin` `std::cout` 등 입출력을 가능하게 만들어야 한다
조금 특이한 점은
int N, M;
cin >> N >> M;
이런 형태로 처음에 선언을 해주고, 연속된 입력을 받을 수 있다는 점?
이후는 java와 유사하다
vector<vector<int>> matrix;
string line;
for (int i = 0; i < N; ++i) {
cin >> line;
vector<int> temp;
for (int j = 0; j < M; ++j) {
temp.push_back(line[j] - '0');
}
matrix.push_back(temp);
}
1. `string line`을 선언한 뒤, `cin >> line`을 통해 한 줄씩 입력을 총 `N-1`회 받는다
2. 이후 임시 `vector`를 선언하고, `push_back`으로 `temp` 뒤에 line의 인덱스 값을 하나씩 추가한다
3. 한 줄 입력이 끝나면 해당 `temp` vector를 `matrix` 뒤에 차례로 입력한다
입력은 이렇게 끝났다
남은 것은 출력
`std::cin` 작성 후 `>>`라는 `stream 연산자` 또는 `추출 연산자`를 통해 입력을 받는다
`std::cout` 의 뒤에는 `<<` 연산이 붙는데, 이는 출력이라고 이해하면 쉬울 것 같다
4. 뒤집어진 내용을 출력하면 된다
전체 코드
#include <iostream>
#include <vector>
#include <string>
using std::vector;
using std::string;
using std::cin;
using std::cout;
int main()
{
int N, M;
cin >> N >> M;
vector<std::vector<int>> matrix;
string line;
for (int i = 0; i < N; ++i) {
cin >> line;
vector<int> temp;
for (int j = 0; j < M; ++j) {
temp.push_back(line[j] - '0');
}
matrix.push_back(temp);
}
for (int i = 0; i < matrix.size(); ++i) {
for (int j = matrix[i].size() - 1; j >= 0; --j) {
cout << matrix[i][j];
}
cout << "\n";
}
return 0;
}
`using namespace std`의 사용을 지양하고, 명시적으로 사용할 함수를 가져오는 코드로 변경했다
물론 계속 `std::`를 사용하는 것은 가시성도 안좋으니 `using` 구문에 추가해서 실제 코드는 간소화해서 사용해보려 한다
4. 마무리
앞으로 연습할 때 귀찮아도 `using namespace std`를 사용하지 않고, 직접 치는 연습을 해야겠다
Java만 사용해서 C++로 개발할 일이 있을까? 싶기는 하지만, 혹시 모르니까
추가로 `return 0;`을 꼭 사용해야 하는지도 궁금했는데,
이 또한 명시적으로 함수가 성공했음을 반환해라 라는 의미라고 한다
`main`함수에는 `return`문이 없는 경우 자동으로 `return 0;`을 추가한다
C++을 학습할 때 명시성을 생각하며 학습해야겠다
'알고리즘 > 개념' 카테고리의 다른 글
[C++] 문자열 치환하기 (0) | 2024.07.12 |
---|---|
String to Char & Char to String (3) | 2023.11.29 |