프로그래밍 이야기

A Tour of C++ : 1장 기초, 2장 사용자 정의 타입

원생계 2019. 10. 6. 07:09

.

.

책 요약정리는 어디까지나 개인적인 스터디노트 성격이 강하므로, 제가 정리하고싶은 내용만 체리픽 해서 다룹니다. 전체 내용이나 원본은 직접 책에서 확인해주세요.

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

.

.

728x90
반응형