.
.
책 요약정리는 어디까지나 개인적인 스터디노트 성격이 강하므로, 제가 정리하고싶은 내용만 체리픽 해서 다룹니다. 전체 내용이나 원본은 직접 책에서 확인해주세요.
C++ 에 대한 내용이다보니, 주관적으로 굳이 다룰 필요 없다고 생각되는 부분은 생략하고, 알고 있더라도 주관적으로 다루는 게 좋겠다 싶은 내용만 다뤘습니다.
이 책의 최고 장점은, 각 챕터의 마지막 소챕터로 "조언"소챕터가 들어가는데, 어느정도 전체 정리를 해주는 느낌이라는 점. 챕터를 빠르게 읽고 마지막 "조언"챕터만 다시 꼼꼼히 읽어보는 것으로 학습 효과가 좋은 것 같습니다.
1 기초
1.1 소개
1.4.2 초기화
complex<> 템플릿 컨테이너.
{} 초기화로 정보 누락의 위험이 있는 타입 변환을 방지해줌.
auto 는 타입 변환 위험이 없지만, 특별한 경우엔 사용하지 않아야 함.
- 정의가 속하는 스ㅗ프가 크고, 명확한 타입을 나타낼 때
- 변수의 스코프나 정밀도를 명확히 할 때 (플롯이냐 더블이냐)
1.6 상수
Const, constexpr 선언의 차이. Constexpr 은 상수 여부를 컴파일 시간에 지정. Const 는 런타임에 변수 생성도 허용.
1.7 포인터, 배열, 참조
int v[] = {1,2,3,4,5};
for (auto& x : v )
++x;
참조. 상수 참조.
Void doSomething( vector<double>& v );
Void doSomething( const vector<double>& v );
1.7.1 널 포인터
과거 코드에서 0이나 NULL을 사용하던 것이
nullptr 값을 사용해서 명확하게 표시 가능.
1.10 조언
C++ Core Guidelines[Stroustrup, 2015] 발췌.
[3] 좋은 프로그램을 만드는 데 C++의 모든 세부 사항을 알 필요는 없다.
[4] 언어의 기능보다 기법에 집중하라.
[5] 언어 정의에 대한 궁극적인 해답은 ISO C++ 표준에서 찾을 수 있다. 16.1.3
[6] 의미 있는 연산을 함수로 묶고, 세심하게 이름을 붙여라. 1.3
[7] 함수 하나는 논리적인 연산 하나를 수행한다. 1.3
[8] 함수를 짧게 유지하라. 1.3
[11] 언어의 기본 기능이 하드웨어에 대응되는 방식을 이용하라. 1.4, 1.7, 1.9, 2.3, 4.2.2, 4.4
[13] 복잡한 표현식은 피하자.
[15] 변수의 유효 스코프를 최소화 하자. 1.5
[19] 일반적이고 지역적인 이름은 짧게 유지하고, 일반적이거나 지역적이지 않은 이름은 길게 유지하라.
[27] unsigned 는 비트 조작에만 사용하자. 1.4
[28] 포인터는 단순하고 직관적인 방법으로 사용하자.
[30] 초기화에 사용할 값을 얻기 전까지는 변수를 선언하지 말자. 1.7, 1.8
[32] 주석에 의도를 언급하자. [CG: NL.2]
2. 사용자 정의 타입
2.1 소개
2장은 타입 정의, 사용 기본적인 기능.
4~7장 추상화 메커니즘, 프로그래밍 스타일
8~15장 표준 라이브러리 개요. 표준 라이브러리는 주로 사용자 정의 타입으로 구성. 1~7장의 활용 예가 됨.
2.2 구조체
struct Vector
점진적으로 개선하면서 11장 표준 라이브러리의 vector 를 살펴보며 개선점을 찾아본다.
vector 등의 표준 라이브러리 구성 요소 참조
- 언어의 기능과 설계 기법을 설명 가능
- 표준 라이브러리의 구성 요소를 배우고 활용하는 데 도움
vector, string 재발명 마고 잘 활용.
2.3 클래스
사용자 정의 타입이 ‘실세계의 타입’에 기대되는 모든 속성을 갖게 하려면 표현 방식과 연산 사이의 더 강한 연결이 필요. 캡슐화. 인터페이스/구현 분리 메커니즘.
class Vector {
public:
Vector(int s) :elem{ new double[s] }, sz{s} {} // Vector 생성
double& operator[](int i) { return elem[i]; }
int size() { return sz; }
private:
double*elem; // 요소를 가리키는 포인터
int sz; // 요소의 개수
}
struct 와 class 는 근본적으로 동일. 멤버의 접근제한자 차이.
2.4 공용체
union 멤버 중 실제로 값을 갖는 멤버는 하나 뿐.
union Value {
Node* p;
int i;
}
union 내 타입 관리 방식은 에러 소지가 크기 때문에 멤버로만 접근할 수 있게 강제해야 함.
표준 라이브러리 variant 는 대부분 상황에서 union 대체 가능.
variant<Node*, int> 는 Node* 나 int 를 저장 가능. variant 가 union 보다 간단하고 안전.
// if (holds_alternative<int>(pe->v)) // 13.5.1
2.5 열거형
enum class 로 스코프 제한, 혼동없이 사용 가능.
사용자 정의 타입이니 연산 정의 가능.
Color& operator++(Color& c)
{
...
return Color::yellow;
}
enum {} 은 암묵적으로 정수 값으로 변환.
2.6 조언
[2] 연관된 데이터는 struct , class 로 구조화 하라. 2.3
[6] 벌거벗은 union은 피하고, 공용체와 타입 필드를 클래스로 감싸라. 2.4, CG:C.181
[8] 예측치 못한 에러 최소화를 위해 enum 보다는 enum class 를 사용하자. 2.5; CG: Enum.3
[9] 안전하고 쉬운 사용을 위해 열거형에 연산 정의. 2.5; CG: Enum.4
.
.
'프로그래밍 이야기' 카테고리의 다른 글
[책] 코딩인터뷰 퀘스천 (2015출간) (0) | 2019.10.13 |
---|---|
A Tour of C++ : 4장 클래스 (0) | 2019.10.11 |
A Tour of C++ : 3장 모듈화 (0) | 2019.10.08 |
A Tour of C++ : 옮긴이의 말 (0) | 2019.10.06 |
Google Apps Script 제한(Limit) 내용 정리 (0) | 2019.08.16 |
프로그래밍, 구현이 더 중요? 설계가 더 중요? (0) | 2019.05.20 |
프로그래밍, OOP 설계 원칙 SOLID (0) | 2019.04.30 |