C++ 제어 흐름 (Control Flow)
·
C++/Syntax
제어 흐름 (Control Flow) 중단(Halt) return, exit 점프(Jump) goto, break, continue 조건 분기(Conditional branches) if, switch 반복(Loop) while, do while, for 예외 처리(Exception) try, catch, throw
따라하며 배우는 C++ 5장
·
C++/TBC++
제어 흐름 (Control Flow) switch 반복문 (Loop) 난수 생성 (Random Number Generation) cin 참고 따라하며 배우는 C++
C++ Type Alias
·
C++/Syntax
Type Alias 자료형, 클래스 등을 다른 이름으로도 사용할 수 있게 해준다. typedef typedef vector pairlist_t; using using pairlist_t = vector;
C++ 열거형 (Enumerate Type)
·
C++/Syntax
열거형 (Enumerate Type) unscoped enum C++98 범위에 제한이 없어 모든 namespace에 선언된다. 따라서 이름이 중복되면 안된다. 정수 타입으로 묵시적 형변환된다. enum 변수에 숫자를 넣으려면 캐스팅을 해야 한다. #include enum Color { COLOR_BLACK, COLOR_RED, COLOR_BLUE, COLOR_GREEN }; int main() { using namespace std; int color_id = COLOR_RED; Color my_color1 = static_cast(color_id); Color my_color2 = static_cast(3); if (my_color1 < 2) cout
C++ 입력 버퍼 무시하기
·
C++/Library
입력 버퍼 무시하기 cin.ignore(_Count, _Metadelim) _Count : 무시할 문자의 최대 개수(바이트) 기본 값은 1 정석대로라면 라이브러리의 std::numeric_limits::max()를 사용하는게 맞으나... 귀찮으므로 보통 적당히 큰 수를 채택하는 것 같다. _Metadelim : 이 문자가 나올 때까지 무시한다.(해당 문자 포함) 기본 값은 eof #include int getInt() { while (true) { int x; std::cout > x; if (std::cin.fail()) { std::cin.clear(); std::cin.ignore(std::numeric_limits::max(), &#39;\n&#39;); std::cout op; std::cin...
C++ 형변환 (Type Conversion)
·
C++/Syntax
형변환 (Type Conversion) 변환 방식 C Style (char)65 C++ Style char(65) static_cast(65) Numeric Promotion 크기가 작은 자료형에서 큰 자료형으로 형 변환하는 것 ex) float -> double 절삭(truncation) int i = 30000; // 0b111010100110000 short s = i; // 1바이트만 저장되어 0b00110000, 즉 48 double d = 0.123456789; float f = d; // 정밀도가 부족해서 다른 값이 저장됨 묵시적 형변환(implicit type conversion)에서의 자료형 별 우선 순위 long double (highest) double float unsigned lo..
C++ typeinfo
·
C++/Library
데이터 타입 확인 라이브러리의 typeid().name()을 사용한다. cout
C++ 자료형 추론 (auto, decltype)
·
C++/Syntax
자료형 추론 (auto, decltype) C++11 자료형을 기본 타입 형태로 추론한다. 자료형을 명시하기 복잡하거나 귀찮을 때 사용한다. 가독성이 좋다. 함수의 반환 값에도 적용할 수 있다. Trailing Return Type(후행 반환 형식) auto 키워드로 정의된 함수 반환 값의 자료형을 명시하는 것 함수 앞에 자료형을 쓰는 것보다 가독성이 좋고, 인덴팅을 맞추기도 편하다. auto add(int x, int y) -> int; auto add(double x, double y) -> double; 예제 iterator 대체 개인적으로 이 때 제일 많이 사용하는 것 같다. #include #include int main() { using namespace std; vector vec({ 1, ..
C++ using
·
C++/Syntax
using using std::cout; 이라고 선언해두면 cout만 써도 std::cout을 사용할 수 있다. 편하지만 남발하면 모호성이 생겨서 컴파일이 안될 수 있다. 영역을 최소한으로 잡아서 사용할 것 상속의 접근 권한을 변경할 때도 사용할 수 있다.
C++ extern
·
C++/Syntax
extern 함수의 경우 기본적으로 extern이 생략되어 있는 것이다. 변수의 경우 가져다 쓰는 파일에서 forward declaration 할 때 앞에 extern을 붙여주어야 한다. 이를 통해 External Linkage 속성을 가진다. main.cpp #include extern int a; // OK int a; // Linking Error int main() { using namespace std; cout
따라하며 배우는 C++ 4장
·
C++/TBC++
extern 메모리 절약 팁 (extern) using auto 데이터 타입 확인 형 변환(Type Conversion) 입력 버퍼 무시하기 열거형 (Enumerate Type) Type Alias 참고 따라하며 배우는 C++
C++ 범위 지정 연산자 (Scope Resolution Operator)
·
C++/Syntax
범위 지정 연산자 (Scope Resolution Operator) :: 클래스, 함수 이름 충돌을 해결할 수 있다. 앞에 아무것도 안쓰면 전역 변수를 불러올 수 있다. #include int value = 123; int main() { std::cout
C++ 비트 연산자 (Bitwise Operator)
·
C++/Syntax
비트 연산자 (Bitwise Operator) 빠르다. 라이브러리를 통해 비트를 그대로 출력 가능하다. unsigned int a = 3; std::cout
C++ 쉼표 연산자 (Comma Operator)
·
C++/Syntax
쉼표 연산자 (Comma Operator) 순차적으로 계산한 뒤 마지막 계산 결과를 반환한다. 일반적으로 잘 쓰이지 않고, for문에서나 가끔 쓰이는 정도라고 한다. int x = 3; int y = 10; int z = (++x, ++y); int i, j; for (i = 1, j = 1; i < 5; ++i, j += 2) myFunc((j--, i + 2), z);
C++ 산술 연산자 (Arithmetic Operator)
·
C++/Syntax
산술 연산자 (Arithmetic Operator) 음수 나누기 std::cout
따라하며 배우는 C++ 3장
·
C++/TBC++
연산자 산술 연산자 (Arithmetic Operator) 쉼표 연산자 (Comma Operator) 비트 연산자 (Bitwise Operator) 범위 지정 연산자 (Scope Resolution Operator) 참고 따라하며 배우는 C++
C++ 상수 (Constant)
·
C++/Syntax
상수 (Constant) Literal constant 숫자, 문자 등 메모리에 존재하지 않아도 사용 가능한 값 Binary Literal C++14 0b1011&#39;1111&#39;1010 Symbolic constant Compile Time constant 컴파일할 때 값이 결정되는 상수 constexpr C++11 컴파일 타임에 값이 결정되는 상수에만 사용 가능한 키워드이다. Runtime constant 런타임에 값이 결정되는 상수 매크로 C 스타일에서는 상수를 매크로로 정의했지만, C++에서는 그렇게 사용하지 않는다고 한다. 이유 디버깅이 귀찮아진다. 적용 범위가 너무 넓다. 대신에 함수 내에서 const 형식으로 작성하는 것이 일반적이라고 한다. const_cast const로 지정한 상..
C++ 출력 버퍼 비우기
·
C++/Library
출력 버퍼 비우기 (fflush) std::cout
C++ 형 변환 (Type Casting)
·
C++/Syntax
형변환 (Type Casting) 변환 방식 C Style(char)65 C++ Stylechar(65) static_cast(65) numeric promotion 크기가 작은 자료형에서 큰 자료형으로 형 변환하는 것 ex) float -> double 절삭(truncation) int i = 30000; // 0b111010100110000 short s = i; // 1바이트만 저장되어 0b00110000, 즉 48 double d = 0.123456789; float f = d; // 정밀도가 부족해서 다른 값이 저장됨 묵시적 형변환(implicit type conversion)에서의 자료형 별 우선 순위 long double (highest) double float unsigned long lo..
C++ Boolean
·
C++/Syntax
Boolean true, false 출력 bool b{true}; std::cout
C++ 소수점 (Decimal Point)
·
C++/Syntax
소수점 (Decimal Point) 고정 소수점 (정수) 부호화 절대치 맨 왼쪽 비트가 부호를 결정하고, 나머지 비트는 일반 양수를 다루듯 계산한다. 000 -> +0 001 -> +1 010 -> +2 011 -> +3 100 -> -0 101 -> -1 110 -> -2 111 -> -3 안쓰는 이유 순환성이 떨어진다.(+3 다음이 -0) 보수를 사용하면 감산기 없이 가산기만으로 뺄셈이 가능하다. 1의 보수 비트를 반전시켜 순환성을 가지도록 했다.(+3 다음이 -3) 덧셈기로 뺄셈이 가능하다. 000 -> +0 001 -> +1 010 -> +2 011 -> +3 100 -> -3 101 -> -2 110 -> -1 111 -> -0 2의 보수 1의 보수를 취하고 1을 더하는 형태이다. -0을 없애고..
C++ 자료형 (Data Type)
·
C++/Syntax
자료형 (Data Type) 라이브러리 자료형의 최대, 최소 확인 std::cout
따라하며 배우는 C++ 2장
·
C++/TBC++
변수 선언 시점 예전 c컴파일러의 경우 모든 변수 선언은 코드의 맨 위에 있었어야 했다. 메모리를 미리 다 잡아놓고 사용하는 방식이다. 요즘은 변수 사용 직전에 선언하는걸 선호한다고 한다. 디버깅, 리팩토링에 용이하다. 자료형 (Data Type) 소수점 (Decimal Point) Boolean 형변환 (Type Conversion) 출력 버퍼 비우기 (fflush) 상수 (Contant) 참고 따라하며 배우는 C++
C++ 전처리기 (Preprocessor)
·
C++/Syntax
전처리기 (Preprocessor) 기능 파일 포함시키기 #include 특정 파일을 현재 위치에 첨부하여 하나의 파일처럼 컴파일한다. 조건부 컴파일 #if, #elif, #else, #ifdef, #ifndef, #endif 등 조건에 해당되는 코드만 실행한다. defined 키워드와 같이 사용하여 복합적으로 정의할 수 있다. OS에 따라 다른 파일을 포함시키는 예제 #ifdef __unix__ /* __unix__ is usually defined by compilers targeting Unix systems */ # include #elif defined _WIN32 /* _Win32 is usually defined by compilers targeting 32 or 64 bit Windows ..
C++ Namespace
·
C++/Syntax
namespace 함수, 객체 등의 이름 충돌 방지 namespace 내부에 또 다른 namespace를 넣을 수 있다.
C++ 헤더가드 (Header Guard)
·
C++/Syntax
헤더 가드 (Header Guard) #include guard internal include guard : 헤더파일 내부에서 매크로를 검사하는 것 header.h #ifndef HEADER_H # define HEADER_H ... #endif external include guard : 헤더파일을 외부에서 include할 때 매크로를 검사하는 것 main.cpp #ifndef HEADER_H #include "header.h" #endif 장점 컴파일러에 의존하지 않는다. 단점 한 번 읽은 헤더 파일도 내용을 읽어야 해서 컴파일 속도가 느릴 수 있다. 귀찮지만 external include guard를 적용하면 해결 가능하다. 매크로 이름이 충돌할 가능성 존재한다. 대규모 프로젝트에선 명명 규칙을 정..
C++ 초기화 (Initialization)
·
C++/Syntax
초기화 (Initialization) C에서는 솔직히 별로 의미가 없었다고 생각하는데, C++에서는 생성자의 개념 때문에 중요한 것 같다. 메모리를 할당함과 동시에 값을 부여한다. 할당 생성자에서 값을 대입하는 방식이다. int num; num = 42; 초기화 초기화 리스트로 지정 Copy Initialization 등호를 통해 초기화하는 방식이다. int width = 5; Direct Initialization 소괄호로 값을 감싸서 초기화하는 방식이다. int width(5); Uniform Initialization List Initialization, Brace Initialization C++11 위의 두 가지(Copy Initialization, Direct Initialization)보다 ..
따라하며 배우는 C++ 1장
·
C++/TBC++
언어 컴파일러 언어 코드를 컴파일하여 실행파일을 생성하고 실행시킨다. 인터프리터 언어 실행파일 없이 바로 실행시킨다. 상대적으로 느리다. 실행파일을 만들고 반복해서 사용하는게 더 빠르다. 주석 당연한건 적지 말자 초기화 (Initialization) 헤더 가드 (Header Guard) namespace 전처리기 (PreProcessor) 참고 따라하며 배우는 C++
라즈베리파이에서 리액트 작업 환경 설정
·
Raspberrypi
라즈베리파이에서 리액트 작업 환경 설정 nodejs nodejs는 크롬 V8 js 엔진으로 빌드한 js 런타임이다. 웹 브라우저가 아니어도 js 연산이 가능하다. 설치 시 npm도 같이 설치된다. https://github.com/nodesource/distributions/blob/master/README.md#debinstall에 설치 방법이 나와있다. https://nodejs.org/en/에 접속해보니 LTS 버전이 14.x라서 해당 버전으로 설치하려는데.. pi@raspberrypi:~ $ sudo curl -fsSL https://deb.nodesource.com/setup_14.x | bash - ## Installing the NodeSource Node.js 14.x repo... ## ..
라즈베리파이 USB 마운트 해제
·
Raspberrypi
라즈베리파이 USB 마운트 해제 기본적인 마운트 위치는 /media/pi/ 디렉토리 내부이다. 다음과 같이 umount 명령어로 언마운트 시킬 수 있다. umount /media/pi/USB 위치를 잘 모르면 umount를 치고 탭을 눌러가며 보면 된다.