목록책 (6)
Sonji-log
1. 이 항목이 왜 중요한가C++에서는 내가 직접 쓰지 않아도 컴파일러가 몇몇 함수를 자동으로 만들어 주는 경우가 있다. 대표적으로 아래 두 가지가 자주 문제를 만든다.복사 생성자(copy constructor)복사 대입 연산자(copy assignment operator)겉으로 보기에는 편리하다. 하지만 어떤 클래스는 "복사되면 안 되는 객체" 인데도, 아무 조치를 하지 않으면 복사가 가능해질 수 있다.예를 들어, 아래와 같은 경우를 생각해 보자.mutex 같은 동기화 객체파일 핸들, 소켓 핸들 같은 시스템 자원"오직 하나만 존재해야 하는" 객체(Singleton Pattern에 해당하는 성격의 객체를 생각하면 쉽다)내부적으로 복사 의미가 애매하거나 위험한 객체이런 객체를 실수로 복사하면 다음과 같은 ..
이 항목의 핵심은 간단하다.클래스의 생성/복사/대입/소멸 동작을 내가 명시하지 않으면 컴파일러가 "합리적이라고 판단한 기본 동작"을 넣어 준다.문제는 이 기본 동작이 "컴파일은 되지만 의도는 틀린 코드"를 만들 수 있다는 점이다. 특히 리소스 소유권(메모리, 파일, 소켓, 뮤텍스)을 다루는 클래스에서 위험하다.1. 컴파일러가 자동으로 만들 수 있는 함수C++ 클래스에서 특별히 선언하지 않으면 컴파일러가 다음 멤버 함수를 자동으로 선언할 수 있다.기본 생성자(default constructor)소멸자(destructor)복사 생성자(copy constructor)복사 대입 연산자(copy assignment operator)C++11 이후에는 이동 의미(move semantics)가 추가되어 아래도 상황에..
1. 왜 초기화가 중요한가초기화되지 않은 객체를 쓰면 버그가 바로 드러날 때도 있고, 꽤 잘 재현되는 것처럼 보일 때도 있다.문제는 그 재현성이 신뢰할 만하지 않다는 점이다. 빌드 옵션이나 코드 배치, 실행 환경이 바뀌면 증상이 달라지거나 갑자기 사라질 수 있다.핵심은 단순하다.초기화되지 않은 값은 믿을 수 없다.컴파일러가 항상 자동으로 올바른 초기화를 해주지 않는다.특히 기본 타입(int, double, 포인터 등)은 상황에 따라 초기화가 되기도 하고 안 되기도 한다.int x; // 초기화되지 않음 (값 미정)double y; // 초기화되지 않음 (값 미정)int* p; // 초기화되지 않음 (쓰레기 주소 가능)이 상태에서 값을 읽으면 동작이 예측 불가능해진..
1. 왜 const를 사용해야 하는가const를 쓰는 이유는 간단하다. "바뀌면 안 되는 값을 못 바꾸게 만들기" 위해서다.의도의 전달const를 붙이면 "이 값은 안 바뀐다"는 약속을 코드에 직접 적는 셈이다. 그래서 나중에 코드를 읽는 사람(미래의 나 포함)도 의도를 바로 이해할 수 있다.컴파일러를 통한 실수 방지const 값은 바꾸려고 하면 컴파일 단계에서 바로 에러가 난다. 프로그램을 실행하기 전에 실수를 잡을 수 있다는 뜻이다.const int maxSize = 100;maxSize = 200; // 컴파일 에러 → 실수를 즉시 발견핵심은 "내가 조심하자"가 아니라 "컴파일러가 막아주게 하자"다. const를 붙일 수 있으면 가능한 붙이는 편이 안전하다.2. const의 적용 범위const는 생..
책 내용 정리예를 들어, 아래와 같은 코드를 작성했다고 가정하자.#define ASPECT_RATIO 1.653우리는 당연하게 ASPECT_RATIO 가 symbolic name으로 파악할 수 있지만, 컴파일러 입장에서는 전처리기가 숫자 상수로 바꾸어버리기 때문에 컴파일러의 기호 테이블에 들어가지 않아 디버깅이 다소 난해해질 수 있다.이를 매크로 대신 상수로 작성하고, 비교를 위해 아래처럼 코드를 작성했다고 가정하자.#include using namespace std;#define ASPECT_RATIO 1.653int main(void){ const double aspect_ratio = 1.653; cout 실제로 이 코드에서 cout 전에 breakpoint를 찍고 기호 테이블을 보면 아래 그림처럼..
책 내용 요약C++는 다중 패러다임 프로그래밍 언어이다.절차적(procedual) 프로그래밍이 기본형기본 C언어에서 여러 특징을 추가해 C++이 탄생했으므로, C언어의 절차지향적 특징을 모두 가지고 있음.객체 지향(Object-Oriented) 특징이 다수 수록됨클래스와 객체를 사용해 시스템을 구성할 수 있음순수 가상 함수를 지원하여 인터페이스를 구현하고, 이를 통해 추상화를 달성함접근 지정 연산자(public, protected, private)를 통해 캡슐화를 구현함기존 클래스를 확장해 새로운 클래스를 만드는 상속 개념을 도입함같은 인터페이스를 오버라이딩해 다형성을 지원함함수형(functional) 프로그래밍 기능을 지원함주로 C++11 이후부터 명확하게 드러남람다 표현식(Lambda Expressi..