ㅇ# Study Modern C++:open_book:
- Study Plan
- 1주차
- 2주차
- 3주차
- 4주차
- 5주차
- 6주차
- 7주차
- 8주차
- 9주차
- 10주차
- 11주차
- 12주차
- 13주차
- 14주차
- 15주차
- 16주차
- 17주차
- 18주차
- 19주차
- 20주차
- 21주차
- 22주차
- 23주차
- 24주차
- 25주차
- 26주차
- 27주차
- 필요한 것만 골라 배우는 모던 C++
- 씹어먹는 C++
챕터 1개당 1 or 2주 간 읽어온 후, 스터디 시간에 간단히 리뷰 및 연습 문제 풀이프로젝트 기반으로 진행진행 시간은 일요일 오전 8시진행 시간은 목요일 오후 8시- 일정이 불가능하거나, 변동이 필요한 경우, 카톡방에 내용 공유
- 진행에 따라 내용을 업데이트 예정
- 전체 진행 일정 조정
- 2주차 리뷰 예정 내용
- 1장 C++ 기초
- 2장 클래스
- 2주차 리뷰 예정 내용
- 1장 C++ 기초
- 1.1 생애 첫 C++ 프로그램
namespace std
를 꼭 쓸 필요는 없지만, 써 주는 것이 다른 사람이 코드를 볼 때 이해가 쉽다.- 입, 출력 기능은 C++의 핵심 언어의 일부가 아님 (명시적으로
iostream
을include
시켜줘야한다) - 모든 C++ 프로그램은
main
함수의 호출로 시작되며,return
으로 하나의 정수를 돌려주는데 0은 정상 종료를 의미한다. - 중괄호({})는 여러 코드 문장을 하나의 코드 블록으로 묶는 역할을 한다. (복합문)
std::
는 그 다음에 나오는 이름이 표준namespace
에 포함된다는 뜻 (namespace
는 이름을 관리하는 수단)- 문자열 상수(문자열 리터럴)은 큰따옴표("")로 감싼다. ('a' != "a")
- 프로그래밍 언어를 배우는 유일한 길은 실제로 사용해 보는 것이다.
- 1.2 변수
- C++은 강 형식 언어(strongly typed language)
- 변수는 형식 이름 다음에 변수 이름이 오는 형태의 문장으로 선언
- 변수 이름 다음에 변수의 초기화 구문을 둘 수 있으며, 쉼표를 이용해서 변수 이름을 여러 개 나열할 수도 있다.
- 각 내장 형식들은 컴파일러 별로 사용하는 메모리 공간의 크기가 다르다. (컴파일러에 상관 없이 같고 싶다면,
int8_t
,uint16_t
등을 쓰자) - 'a' + 7 = 'h'가 되지만, 읽는 사람이 화가날 수 있으므로 절대 쓰지 말자.
- 문자열을 다룰 때는 헤더를 추가하자.
- <C++14> 문자열 리터럴을 string으로 취급하려면 접미사 s를 붙여야한다. ("Hello" --> char [], "Hello"s --> string)
- 변수는 최대한 늦게 선언해라. 보통 처음 사용하기 직전에 선언하는 것이 좋다, 변수를 초기화할 수 있는 지점 이후여야만 한다.
- 상수 변수는 선언과 동시에 초기화 되어야하며, 변수가 사용되는 곳 어디든 사용이 가능하다.
- 리터럴 값에 붙는 접미사에 따라, 형식이 지정된다. (u, l, f, ul, l 등)
- <C++14> 숫자들 사이에 가독성을 위해 어포스트로피를 삽입 가능 (')
- 중괄호로 초기화를 사용하면, narrowing conversion을 허용하지 않음 (컴파일 오류 발생)
- 좁아지는 오류가 양방향으로 발생할 수도 있다.
- 전역 변수는 사용하지 말라. (전역
상수
변수는 허용) - 지역 변수는 {} 블록에 한정됨. (C++은
GC
가 없음 --> {}를 탈출하면 안에서 정의한 변수들 다 사라짐)
- 1.3 연산자
- 연산자는 사용자 정의 형식에 대해 중복적재(
overloading
)할 수 있다.(overloading
--> 함수 이름은 같으나, 입력 인수에 따라 다른 함수가 호출되는 것) - 연산자의 우선순위가 분명 존재하지만, 아무도 모름 (그냥 괄호를 잘 치는 것이 좋다)
- 전위 증가는 먼저 증가 후
return
, 후위 증가는return
후 증가 - 주소 지정이 가능한 데이터 항목을 C++에서는
lvalue
라고 지칭 - 산술 표현식에서는 증가, 감소 연산자 대신 j+1처럼 명시적으로 더하거나 빼주는 것이 좋다.
- 표현식 안에서 값을 수정하는 것은 위험하다, 수정을 개별적으로 수행하자.
- 이항 연산의 인수들의 형식이 다르면, 둘 중 하나 또는 둘 다가 공통의 형식으로 변환된다. (그냥 수동으로 형변환 해주는게 편할 때가 많다)
- 삼중비교 (
<=>
) a.k.a. 우주선 연산자 (ufo 연산자), a <=> b --> a < b인 경우 -1, a == b면 0, a > b면 1이 나옴- 그치만 그냥 a > b, a == b, a < b를 쓰자.
- C++도 not이 있다. (not false --> true)
- 논리 표현식에는 꼭
bool
을 쓰자. - 등호 양변의 형식이 다르면 우변이 좌변의 형식으로 변환된다. (float a = 1.0으로 적으면, 1.0이 float으로 변환된다.)
- 소프트웨어 설계의 주요 원칙 중 하나는
관심사의 분리
(유연성이 증가하고, 복잡성이 감소한다.) - 함수형 프로그래밍 스타일로 작성하면 은근 유리하다. (배정문에서 변경되는 것은 배정 연산자의 왼쪽에 있는 변수뿐이어야 한다.)
- 사람이 이해하기 쉬운 코드일 수록, 컴파일러가 최적화하기도 쉽다.
- 연산자는 사용자 정의 형식에 대해 중복적재(
- 1.4 표현식과 문장
if
문의 각 갈래는 각자 하나의 범위를 형성한다.- 중괄호를 쓰는 것이 바람직하다. (한줄만 수행을 하더라도)
- 가독성을 위해서 중괄호 안의 문장을 들여쓰자.
- <C++17> 조건식에서 변수 선언 가능
- <C++17>
switch-case
문에서 [[fallthrough]]가 추가됨 (아래로 흘러가도록 설정 가능) while
은 선 조건 검사 후 실행,do-while
은 선 실행 후 조건 검사 (do-while
은 최소 1회는 실행된다)for
문은 초기화 절, 조건식, 단계 연산으로 사용 가능- 내장 형식에서는 ++i나 i++나 별로 차이가 없지만, 사용자 정의 형식에서는 i++를 사용하면 쓸데없는 복사 연산이 되므로, ++i를 권장
- 초기화 절에는 모든 종류의 표현식과 변수 선언이 가능, 비워두기도 가능, 같은 형식의 변수 여러 개를 선언하는 것도 가능
- 루프 색인을 루프 본문에서 수정하는 것도 가능하지만, 당연히 하지 않은 것을 권장
- <C++11> 구간 기반
for
루프 (for
(int i : 배열)과 같은 식으로 입력하면 배열 내부의 값이 i에 순차적으로 들어간다. ) - <C++20> 구간 기반 루프의 시작 지점에 초기화도 가능하다.
goto
는 절대 쓰지 말 것
- 다음주 계획
- 1장 마무리 및 1장 연습문제 풀이
- 1.1 생애 첫 C++ 프로그램
- 1장 C++ 기초
- 1.5 함수
- 값 전달, 참조 전달 두 가지 방식
- 값 전달은 변수를 복사해서 사용! (실제 값에는 영향 없음)
- 참조 전달은 변수를 직접 사용! (실제 값에도 영향 있음)
- 함수에도 기본 인수 값을 설정할 수 있음
- 표현식 템플릿은 주어진 계산을 그 결과가 실제로 저장되는 시점까지 미룸으로써 불필요한 복사를 방지한다 (?????, TODO.)
- 함수 호출은 사실 공짜가 아님 (이를 공짜로 만들어주는 것이 인라인화)
함수 이름
,매개변수 개수
,매개변수 형식
이 함수의 서명이며, 이 값이 함수 오버로딩을 구분하는 기준값이 된다.- main함수에는
argc
,argv
의 2가지 인수를 받을 수 있다.
- 1.6 오류 처리
assertion
은 프로그래머의 실수를 검출하기 위함이며, 해당 구문이false
이면 코드가 종료assertion
의 장점 중 하나는Release
모드로 빌드 시, 동작하지 않는다는 것- 일반적인 오류 처리는
try
,catch
구문을 활용할 수 있음 - 오류가 발생할 수 있는 곳에서
try
- 오류가 발생하면 동작할 부분을
catch
사용 catch
는 다중으로 사용 가능하며, 입력되는 값이나, 예외 종류에 따라 다르게 동작하도록 할 수 있음- 예외가 발생해도 그냥 무시하고 진행하고 싶다면 빈
catch
를 추가한다. static_assert
는 컴파일 시점에서 오류를 검출하기 위함
- 1.7 파일 입출력
- 파일 입출력 및 파일 시스템 관련 입출력이 존재
- 필요한 상황에 맞춰서 구글 검색을 잘 해서 사용하면 될 것으로 보임
- 1.8 배열, 포인터, 참조
- 배열은 선언 시에 크기를 지정해줘야함 (싫을 경우, 동적할당)
- 배열 접근 시, 색인의 유효성이 점검되지 않는다. (C++ Array로 해결 가능)
- 동적 할당 시에 포인터의
new
,delete
를 같이 사용해줘야 한다. - 꼭 메모리 할당과 해제를 해줘야만 메모리 누수를 방지할 수 있음
- 포인터는
메모리 주소
를 저장하는 변수를 의미 - 포인터의 초기화는
nullptr
(C++ 11이상) - 포인터는 결국 메모리를 직접 사용하는 것이므로, 잘 사용하지 않으면, 여러 방면으로 오작동할 수 있음
- 이를 해결하기 위해서는 라이브러리 내부의 컨테이너, RAII를 이용한 캡슐화, 스마트 포인터 등을 사용하면 좋다.
unique_ptr
은 객체에 대한 유일한 소유권을 나타내는 포인터 (동일한 객체에 대해 여러 개 생성 불가)shared_ptr
은 공유 포인터를 의미하며, 일반적인 포인터처럼 사용이 가능, 순환 참조 문제 발생 시 위험할 수 있으며,make_shared
를 이용해서 생성하는 것이 안정적이고 좋다.- 참조는 해당 변수에 대한 별명을 생성하는 것
- 함수에서 참조를 Return할 때는 주의할 것 (상한 참조)
vector
는Python
의list
와 유사한 컨테이너valarray
는 성분별 연산을 지원함, 쓰는걸 본적은 없음
- 1.9 소프트웨어 프로젝트의 구조화
- 주석 작성 시, 중첩된 주석 안되므로 주의
- 매크로는 되도록 피하고, 상수, inline, constexpr 등을 활용할 것
- 포함가드를 이용하면, 헤더 파일 중복 정의를 피할 수 있으며,
#pragma once
에 비해 이식성이 좋게 사용할 수 있다. - 조건부 컴파일을 이용하면, 디버깅 상황에 특별한 로깅을 수행하도록 할 수 있으며,
Window
,Linux & Unix
에 맞춰서 코드를 추가할 수 있도록 할 수 있으며, 라이브러리 존재 유무를 이용하여, 코드를 다양하게 작성할 수 있다. - 또한, C++의 새로운 기능이 추가되었는 지 여부에 따라, 코드를 사용할 수 있다.
- 1.5 함수
- 진행 방식 변경
- 스터디 시간 변경
$\rightarrow$ 목요일 오후 8시 - 스터디 방식 변경
$\rightarrow$ 프로젝트 위주 코드 작성 - 스터디 참고 문서 추가
$\rightarrow$ 씹어먹는 C++ - 다음주까지 개인별로 프로젝트 주제 정해오기
- 스터디 시간 변경
- 주제 선정
- 재훈 :
SLAM
을 간단히 만들어볼 예정 (시작은ICP
부터 진행,ROS
사용 예정) - 예빈 : 테트리스 (Visual Studio 사용 예정 -->
MSVC
) - 범훈 : 일단 패스
- 동현 : 시뮬레이터 제작 (프로그램 미정)
- 준규 : 쉐이더를 이용해서 디펜스 게임
- 우성 : 실제 드론 제어
- 재훈 :
- 매주 코드 리뷰를 진행
- 새롭게 알게된 내용을 공유
- 범훈님 개인 일정으로 탈퇴 (돌아오실 지는 의문)
- 진행하신 코드 꼭 올려주세요!
- 준규님
- 타워 디펜스 시작 전 메뉴까지 구현 (Terminal 환경 Only)
- Review 피드백
- 오류 찾기 및 디버깅 때 용이하도록 클래스 별로 분리 (게임동작 클래스, 메뉴동작 클래스 등)
- while 문 같은 경우는 리소스를 많이 잡아먹고 block이 생길 수 있기에 지양할 것
- 주석으로 표현하는 것 보다 enumerate를 이용해 가독성과 코드 퀄리티에 신경쓸 것
- 다음주까지 입력시 발생하는 문제 해결과 게임 환경 세팅 예정
- 동현님
- 오픈 소스 이용하여, 화면 상에서 이동만 가능 (Terminal 환경 Only)
- 아직 크게 진행 사항 없어서 피드백 따로 없음
- 재훈님
- 업무가 바빠서 아직 진행 사항 없음
- 다음주까지는
ICP
논문 보고, 오픈 소스 기반으로 구현 해보기
- 예빈님
- PPO를 구현?
- 우성님
- Ubuntu 20.04 설치 및
CrazyFile
조립 중 Localization
은Base Station
기반으로 진행 예정 (LightHouse
)- 다음주까지 환경 세팅 마치고 코드 작성 진행 예정
- Ubuntu 20.04 설치 및
vector
에 관련된 간단한 이야기([]
와at
의 차이)valgrind
및sanitizer
를 통한 메모리 누수 방지- 메모리
Heap
및Stack
에 대한 간단한 소개 - 다음주 진행 여부는 아직 불확실
- 진행 방식 변경
- 약 10 ~ 15분 정도 발표할 내용 준비
- 준비 안해올 시, 벌금
5000원
- 연속으로 안해오시면, 누진세 (2주 연속이면
10000원
, 3주 연속이면15000원
, 4주 연속이면스터디 탈퇴
) - 개인 사유 있으시면, 미리 말씀해주시고, 시간이 너무 길어지면, 격주로 변경하겠습니다.
- 준규님
- 코드 작성 추가 진행
- 피드백 내용 작성 부탁드립니다.
- 동현님
딥러닝
관련 내용 세미나 진행- 설명 보완이 필요할 것 같음
- 우성님
- 추후 진행할 프로젝트 관련 내용 설명
CAN
통신 기반의 보안 관련 프로젝트 진행 예정
- 재훈님
C++
의Thread
등의 동시성 처리를 위한 방법 소개 예정- 간단한
Thread
와Process
의 차이 설명 Thread
,Mutex
,Future
,Promise
등에 대해 소개 예정
- 동현님
ORB-SLAM3
설치 및 실행- 조금 더 관심을 가지고 스스로 알아가는 기회를 가졌으면 좋겠음
- 예빈님
- 문제를 끝까지 푸는 연습을 할 것
CS
공부는 틈틈히 할 것
- 재훈님
- Class 구조화 및 메서드 구현 관련 설명
- 나머지 연산자 오버로딩 관련 내용 설명 예정
- 예빈님
Dynamic Programming
- 동현님
Unitree Go1
- 재훈님
C++ Operator Overloading
- 우성님
- 준비 안함 (
5,000원
감사합니다)
- 준비 안함 (
- 예빈님
5000원
- 동현님
Visual Odometry
코드 리뷰
- 재훈님
- 상속 없이 코드 작성하는 방법 (다음주에 상속 내용 진행 예정)
- 우성님
Simulink
로 간단한Suspension
모델 구현
- 준규님
D435
+yolov5
적용해서Object Detection
후, 해당 객체 위치로의 Goal 찾기
- 재훈님
- 상속 관련 내용 설명
Rule of Three / Five / Zero
설명istream
,ostream
,ifstream
,ofstream
,stringstream
관련 내용 설명
- 예빈님 (안왔는데..?
10000원?
)Dijkstra 최단 경로 알고리즘
설명/ 예시 문제(https://rndpqls999.tistory.com/214)Deep copy
&Shallow copy
설명(https://rndpqls999.tistory.com/211)- 시간이 된다면
DFS
/BFS
까지(https://rndpqls999.tistory.com/210)
- 우성님
Active Suspension
Model 만들기
- 동현님
Visual Odometry
코드에 있는FAST
대신ORB
,BRISK
로 바꿔봄
- 준규님
5000원
- 재훈님
C++ Template
일부
- 예빈님
- 지난주 안한 내용 + 추가한 내용
DFS
/BFS
로 코드 짜기 (https://rndpqls999.tistory.com/210)무방향 그래프
탐색 예시 문제(https://rndpqls999.tistory.com/221)Deep copy
&Shallow copy
설명(https://rndpqls999.tistory.com/211)
- 준규님
D435
를 이용해 도킹 스테이션 구축 위한 관련자료 발표
- 재훈님
C++ Inline 함수
내용 +implementation header
관련 내용 추가
- 동현님
- CycleGAN 돌리기 위한 환경 설정 + 학습중...
- 우성님
- semi active susepension 원리
- 재훈님
C++ Template 특수화
&Variadic Template
&TMP
- 준규님
D435
+yolov5
로 물체 각도 측정.- 이후
2D LiDAR
+Camera
Calibration 진행 예정 - 관련 코드 내용 추가
- 재훈님
STL
&예외처리
&rvalue reference
- 재훈님
move semantics
&perfect forwarding
&Unique Ptr
- 동현님
StarGAN v2 논문리뷰
- 우성님
Active Suspension
Simulink & CarMaker로 테스트
- 재훈님
Shared Ptr
&Callable
&C++ GUI App
- 예빈님
- BlackJack 카드 게임 구현한 코드(객체지향, 상속)
- 재훈님
- C++
Thread
&mutex
- C++
- 동현님
- ORB-SLAM3를 직접 취득한 데이터 셋으로 실행해보기 + 성능비교
- 우성님
- 최종 프로젝트 발표 준비
- 재훈님
Atomic
,Memory Order
- 재훈님
Python
Selenium
사용 예시,Future & Promise
- 우성님
Active Suspension
관련TTC
계산 및 이를 통한 제어 소개
- 휴식 (회식)
- 예빈님
Point Cloud Library
- 준규님
C# 기반 주행 제어 코드
- 재훈님
ThreadPool
&initializer_list
- 예빈님
pcl RANSAC
&clustering
- 예빈님
- GUI
rqt_example
&qt_creator
- GUI