[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
기존에 작성해 놓은 C++ 코드에 모던 C++를 적용하기는 쉽지 않습니다. 막상 개선하려고 마음먹었다고 해도, 어디서부터 바꿔야 할 지 막막하기만 합니다. 이 세션에서는 기존 C++ 코드에서 모던 C++를 적용해 프로그램의 구조와 성능을 개선하는 방법에 대해서 설명합니다. 그리고 기존 C++ 코드에 모던 C++를 적용할 때 주의해야 될 점에 대해서도 살펴봅니다.
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
기존에 작성해 놓은 C++ 코드에 모던 C++를 적용하기는 쉽지 않습니다. 막상 개선하려고 마음먹었다고 해도, 어디서부터 바꿔야 할 지 막막하기만 합니다. 이 세션에서는 기존 C++ 코드에서 모던 C++를 적용해 프로그램의 구조와 성능을 개선하는 방법에 대해서 설명합니다. 그리고 기존 C++ 코드에 모던 C++를 적용할 때 주의해야 될 점에 대해서도 살펴봅니다.
[C++ Korea 2nd Seminar] C++17 Key Features SummaryChris Ohk
C++은 10년 만에 C++11/14를 발표하면서 '모던 C++'이라는 이름으로 발전했습니다. 그만큼 새로운 기능들이 많이 추가되었습니다. 그리고 2017년, C++은 C++17이라는 이름으로 또 한 번의 발전을 준비하고 있습니다. 3년 주기로 빠르게 변화하는 모던 C++에 대비하기 위해, C++17에 추가될 주요 기능들을 살펴보고자 합니다.
C++은 10년 만에 C++11/14를 발표하면서 '모던 C++'이라는 이름으로 발전했습니다. 그만큼 새로운 기능들이 많이 추가되었습니다. 그리고 2017년, C++은 C++17이라는 이름으로 또 한 번의 발전을 준비하고 있습니다. 3년 주기로 빠르게 변화하는 모던 C++에 대비하기 위해, C++17에 추가될 주요 기능들을 살펴보고자 합니다.
이 발표는 이전에 발표했던 내용에서 일부 사례 추가 및 최신 내용으로 갱신한 버전입니다.
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
Item 14 : Declare functions noexcept if they won't emit exceptions. +윤석준
Item 15 : Use constexpr whenever possible. +이동우
Item 16 : Make const member functions thread safe. +제한재
22. L-Value, R-Value
L-Value : 메모리를 가진 데이타, 주소 연산을 통
해 주소를 얻어 올 수 있다.
- non-modifiable lvalue
- modifiable lvalue
R-Value : 임시 객체나 표현식(expression)
string s1 = "aaa";
string s3 = s1 + s2 + string("ccc");
function( string("aaa") );
string &s4 = "aaa"; // error
24. 연산자 우선 순위
a+b*c => a+(b*c)
*p++ => (*p)++
우측 결합성(right-associativity)
단항 연산자, 대입 연산자
a=b=c => a=(b=c)
좌측 결합성,
단항 연산자, 대입 연산자를 제외한 나머지 연산
자
a+b+c => (a+b)+c
25. 어휘 토큰으로 인정할 수 있는 가장 긴 문자열이
우선적으로 선택된다.
a+++b = (a++)+b
26. void f(int x, int y)
{
int j = x = y;
int *p = &++x;
int *q = &(x++); // error
int *pp = &(x>y? x:y);
}
27. int x = f(2) + g(3); // 함수 호출 순서는 미정의
int i = 1;
v[ i] = i++; // 실행 결과를 예측할 수 없음
단축 평가(short-cut evaluation)
&&(and) 연산은 좌변이 true일 때 우변 평가
|| (or) 연산은 좌변이 false일 때 우변 평가
28. 비트단위 논리 연산자
& : bit and
| : bit or
^ : bit xor
~ : bit not
>> : shift left
<< : shift right
32. 명시적 타입 변환
static_cast : 같은 클래스 계통 안의 포인터 타입
끼리 캐스팅
reinterpret_cast : 관련되지 않은 타입 사이 캐스
팅
(T)e 캐스팅 ex) int a = (int)b;
(T)e 캐스팅은 static_cast, reinterpret_cast,
const_cast를 모두 합친 변환함수다.
33. 생성자
T(e) 표기법
int i = int(10);
string i = string("aa");
템플릿을 작성할 때 기본 타입과 사용자 정의 타
입을 구분없이 처리 할 수 있다.
35. 문장으로서의 선언문
코드 중간에 선언문을 놓을 수 있는 것의 장점
1. const 를 사용해서 프로그램을 안전성을 높일
수 있다.
2. 초기치가 주어질 때까지 객체생성을 미룰 수
있다.
.... program....
string s = "~~~";
36. 조건식 내부에 선언문 두기
if (double d = prim())
{
~~
}
변수의 유효 범위를 가능한 작게 하는 방법
37. 주석문 및 들여쓰기
다음과 같은 주석문은 쓰지말자.
// 변수 "v"를 초기화해야 한다.
// 변수 "v"는 함수 "f()"에의해서만 초기화되어야 한다.
// 이 파일에 있는 다른 함수들보다 "init()"를 먼저 호출할 것
// 프로그램의 마지막 부분에서 "cleanup()"을 호출할 것
// 함수 "weird" 는 사용하지 말 것
// 함수 "f()"는 두 개의 인자를 받는다.
코드에 자연스럽게 녹아 있는 것들은 주석문에 또 등장할 필
요가 없다.
38. 저자가 좋아하는 주석문
1. 소스 파일 하나에 대한 주석문.
2. 각 클래스, 템플릿, 네임스페이스에 대한 주석문
3. 주요 함수에 대한 주석문. 여기에는 함수의 용도, 사용된 알고리즘, 함수의
정상 작동을 보장하는 주변 환경에 대한 가정 등이 들어간다.
4. 전역 변수 및 네임스페이스 변수 그리고 상수에 대한 주석문
5. 코드가 단순하지 않은 경우 그리고 이식성이 보장되지 않을 경우에 달아 놓
은 주석문
주석문을 잘 쓰는 것도 프로그램 잘 짜는 것만큼 어려우며,
꾸준히 연마해 두면 언젠가는 프로그래밍 능력과 함께 빛날
기술이다.
39. 바른 프로그래밍을 위한 고수의 조언
1. 비 표준의 서드 파티 라이브러리 및 직접 손으로 만든 코드 보다는 표준 라이브러리를 우선적으로
고려할 것.
2. 복잡한 표현식은 금물
3. 연산자 우선순위가 의심되면 괄호를 사용할 것.
4. 명시적 타입 변환(캐스트)을 피할 것.
5. 명시적 타입 변환을 굳이 사용해야 한다면, C스타일의 캐스트 대신에 C++전용 캐스트 연산자를 사
용할 것.
6. 결과 값이 잘 정의된 경우에만 T(e) 표기법을 사용할 것.
7. 표현식 평가 순서가 불명확해지는 경우를 피하자.
8. goto는 가급적 기피 대상.
9. do문도 마찬가지
10. 어떤 값으로 초기화되기 전엔 그 변수를 선언하지 말자.
11. 주석문은 언제나 또박 또박, 명확하게.
12. 들여쓰기는 일관성 있게 구사하자.
13. 전역 함수 버전의 operator new()를 대신하고 싶으면 멤버 버전의 operator new() 를 우선적으로
고려하자.
14. 입력을 처리할 때는 언제든 입력이 엉망으로 들어올 수 있음을 명시할 것.