C++ 01
개요
시간을 들인 만큼 성장한다.
자주 사용하지 않는다면 일주일이면 까먹지만 나중에 다시 봤을 때 그렇게 들인 시간이 쓸모 없다고 느낀 적은 없었다.
다음에 다시 공부하면 더 빠르게 배운다.
책을 사놓고 그동안 방치해놨는데 이번 기회에 정리해본다.
C++
코드 실행 환경
삼성에선 역량 테스트 A형을 통과해야 B형을 볼 수 있고 B형을 통과해야 C형을 볼 수 있다. 삼성 SW 역량 테스트 B형 부터는 파이썬을 사용할 수 없고 좀더 하드웨어 친화적인 언어인 C/C++로만 시험을 치는 것이 권장된다.
또 C++을 공부하며 컴퓨터의 내부 동작 까지 더 자세히 알 수도 있다는 장점도 있다.
C++을 공부해보려고 했지만 항상 막혔던 부분이 마땅한 코드 에디터를 찾기 힘들다는 것이었다.
윈도우라면 비주얼 스튜디오를 사용하면 되지만 나는 맥을 사용하고 있고 Xcode는 악명이 자자하더라.
그러던 중 VS코드로 C/C++을 사용할 수 있다는 정보를 얻었고 정리해본다.
VS코드의 확장 마켓플레이스에서 마이크로 소프트에서 나온 C/C++을 설치해준다.
이건 코드를 실제 실행시켜주도록 하는 플러그인이 아니라 VSCode에서 C/C++ 코드를 작성할 수 있고 브레이크 포인트를 걸어 디버깅할 수 있도록 하는 등의 편의 기능을 제공하는 것이다.
Pre-requisites
C++ is a compiled language meaning your program's source code must be translated (compiled) before it can be run on your computer. VS Code is first and foremost an editor, and relies on command-line tools to do much of the development workflow. The C/C++ extension does not include a C++ compiler or debugger. You will need to install these tools or use those already installed on your computer.
코드를 실제로 실행시키기 위해선 Code Runner라는 의존성이 필요하다.
Code Runner를 설치하고 톱니 바퀴 모양을 클릭하여 설정에 들어간다. 여기서 Code-runner: Run In Terminal
을 체크하고 :Executor Map에서 settings.json에서 편집을 클릭한다. 그럼 json파일이 하나 나오는데 여기서 cpp 항목을 수정해준다. 버전과 타겟 파일 경로를 입력한다.
"cpp": "cd $dir && g++ -std=c++17 $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
그런 다음 상단의 터미널을 클릭해서 기본 빌드 환경 구성을 클릭한다. 여기서
"args": [
"-std=c++17",
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-g",
// "${file}",
"${fileDirname}/**.cpp",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
],
이런 식으로 설정했다. 아직은 자세히 모르겠고 공부를 해보면서 알게 되면 추가로 정리해볼 예정이다. 이렇게 하고 파일을 작성해서 실행해보면 터미널 잘 출력되는 것을 볼 수 있다.
#include <iostream>
using namespace std;
int main() {
cout << "Hello world!";
return 0;
}
기본 문법
컴퓨터는 1과 0으로 이루어진 기계어를 통해 명령을 이해하고 수행한다.
이를 기계어라고 하는데 인간이 이걸 이해하기는 정말 어렵다.
따라서 우리가 이해할 수 있는 언어로 코드를 작성하여 통역사 역할을 하는 컴파일러에게 통역을 맡긴다. 이를 컴파일이라고 한다. 컴파일이 완료되면 폴더에 기계어로 번역된 파일이 새롭게 생성되는데 이를 오브젝트 파일(목적 파일)이라고 부른다.
C++은 컴파일을 완료한 뒤 다수의 목적 파일을 연결하여 하나의 프로젝트로 만드는 작업을 수행한다. 이를 링크라고 부른다.
위의 코드가 가장 간단한 C++ 예제 코드다.
#include는 화면에 표시하는 기능이 적혀있는 파일을 컴파일 전에 미리 읽어두어라 라고 선언하는 부분으로 자바의 import라고 생각해도 된다. 이걸 읽어놓지 않으면 출력 기능을 사용할 수 없다. 이를 헤더파일이라고 부른다.
#이 붙은 코드는 컴파일러에 포함되어있는 전처리기가 먼저 읽어들인다.
cout는 표준 출력을 의미한다.
여러 줄의 텍스트를 출력시키고 싶다면 줄바꿈 기호를 입력하면 된다. \역슬래시 표시다.
#include <iostream>
using namespace std;
int main() {
cout << "test" << '\n';
cout << "test" << '\n';
cout << "test" << '\n';
cout << "test" << '\n';
return 0;
}
c++에서 변수는 다음과 같이 사용한다.
/ 자료형 변수 며
int a = 0;
#include <iostream>
using namespace std;
int main() {
int a = 0;
cout << "test" << a << '\n';
return 0;
}
다음으론 사용자로부터 값을 입력받아보자.
#include <iostream>
using namespace std;
int main() {
int a = 0;
cin >> a;
cout << "test" << a << '\n';
return 0;
}
여러가지 값을 입력받을 수도 있다. 여러 값을 입력할 때는 엔터를 기준으로 입력된다.
만약 원주율 같은 변하지 않을 상수를 사용하려면 const 키워드를 사용하면 된다.
#include <iostream>
using namespace std;
int main() {
int a = 0;
const double pi = 3.14159;
cout << pi << '\n';
return 0;
}
만약 상수를 변경하는 코드를 작성하면…
variable 'pi' declared const here
위와 같은 에러가 발생하며 컴파일되지 않는다.
조건문과 반복문을 알아보자. 조건문은 다음과 같이 사용한다.
#include <iostream>
using namespace std;
int main() {
int a = 11;
bool answer = false;
if(a == 10) {
answer = true;
}else if(a == 11) {
answer = true;
}else {
answer = false;
}
cout << answer << '\n';
return 0;
}
사실 일반적인 프로그래밍 언어와 기능은 같은데 표현 형식이 다른 거라 필요한 부분만 정리해야겠다.
여러 언어를 배우려 해봤지만 가장 좋은 건 하나의 언어를 기초부터 배우고 그 다음부턴 코딩테스트 연습문제를 하나씩 풀어보며 익히는 것 같다.
using namespace std;
원래 위의 코드는 std:cout로 적어야한다. 그러나 이렇게 반복되는 작업을 줄이기 위해 네임스페이스라는 개념을 사용하여 접두사를 생략하고 사용할 수 있게 된다.
코딩 테스트에서 배열의 크기를 구하는 경우가 있다. 그럴 땐 다음과 같이 사용한다.
numbers.size();
문자열의 길이를 구하려면 test.length();와 같이 사용한다. length는 #include
test.length();
int와 int의 연산 결과는 여전히 int가 나온다.
그러나 소수점 단위의 수가 필요하다면 피연산자 중 하나를 형변환해야한다.
두 가지 방법이 있다.
(double)a / b;
static_cast<double>(a) / b;
일반적으론 두 번째 방법을 권고한다.
첫번째 코드의 경우 옛날 C언어 방식의 형변환으로 단순하고 짧지만 잘못된 형변환이 발생해도 경고를 받을 수 없고 디버깅이 어렵기 때문이다.
두번째 방법은 컴파일러가 형변환이 정적 변환인지 런타임 확인이 필요한지 등을 알 수 있고 컴파일 타임에 형변환이 안전한지 확인하기 때문에 명확하고 안전하다.
배열을 반복 방법에는 다음과 같은 선택지가 있다.
- 인덱스로 순회
- vector로 순회
vector로 순회하는 방법
for (int num : vec) {
std::cout << num << " ";
}
슬라이싱 방법
vector<int> answer(numbers.begin() + num1, numbers.begin() + num2);
범위를 지정하여 자른 다음 새로운 벡터로 반환한다.