본문 바로가기

카테고리124

Effective C++ | 항목 03 낌새만 보이면 const를 들이대보자 2021. 8. 26.
Effective C++ | 항목 02 #define을 쓰려거든 const, enum, inline을 떠올리자 항목 02 #define을 쓰려거든 const, enum, inline을 떠올리자 2.1 매크로 상수 대신 const 상수 #define ASPECT_RATIO 1.653 우리에겐 이 ASPECT_RATIO가 기호식 이름(symbolic name)으로 보이지만, 선행 처리자는 소스 코드가 컴파일러에게 넘어가기 전에 ASPECT_RATIO를 밀어버리고 숫자 상수로 바꾸어 버린다. 그 결과, ASPECT_RATIO라는 이름은 컴파일러가 쓰는 기호 테이블에 들어가지 않는다. 그래서 숫자 상수로 대체된 코드에서 컴파일 에러가 발생하게 되면 대체 1.653이 어디서 왔는지 찾느라 시간을 허비하게 된다. 마찬가지로 기호 테이블에 이름이 들어가지 않기 때문에 기호식 디버거(symbolic debugger)에서도 문제.. 2021. 8. 21.
Effective C++ | 항목 01 C++를 언어들의 연합체로 바라보는 안목은 필수 항목 01 C++를 언어들의 연합체로 바라보는 안목은 필수 1.1 C++는 다중 패러다임 프로그래밍 언어 오늘날의 C++는 다중 패러다임 프로그래밍 언어(multiparadigm programming language)라고 불린다. 절차적 프로그래밍을 기본으로 하여 객체 지향, 함수식, 일반화 프로그래밍을 포함하며 메타 프로그래밍 개념까지 지원하고 있다. 이런 엄청난 표현력과 유연석 덕분에 C++는 소프트웨어 개발에 있어 대체할 만한 것이 없는 도구가 되었지만, 혹자에게 어느 정도 혼동을 줄 여지가 있는 것도 사실이다. 가장 쉬우면서 정확한 방법은 C++를 상관 관계가 있는 여러 언어들의 연합체(federation)로 보는 것이다. C++를 제대로 따라잡으려면 이 언어가 여러 개의 하위 언어(sublang.. 2021. 8. 20.
C++ | 04-3 생성자와 소멸자(Constructor and Destructor) 1. 생성자 1.1 생성자의 선언과 정의 새로운 객체를 생성하고 멤버 변수를 private으로 선언하면 이 멤버 변수를 초기하는 멤버 함수를 부득이하게 정의해야 했다. 그러나 멤버 변수를 초기화하기 위해 매번 멤버 함수를 정의하는 것은 여간 번거로운 일이 아니다. 다행히 C++는 특별한 멤버 함수, 생성자(Constructor)를 제공한다. 생성자는 객체의 생성과 동시에 멤버 변수를 초기화해주는 멤버 함수로 객체를 생성할 때 딱 한 번만 호출된다. 생성자를 정의하려면 다음과 같은 형식을 따르면 된다. ① 클래스의 이름과 같다. 생성자는 클래스의 이름과 완전히 같고, 보통 public으로 선언한다. class Overwatch { private: string name; int age; public: /* .. 2021. 8. 10.
C++ | 04-2 캡슐화(Encapsulation) 1. 캡슐화 1.1 캡슐화의 이해 캡슐화(Encapsulation)는 객체와 관련있는 필드(Field)와 메소드(Method)을 멤버 변수와 멤버 함수로 구현하여 하나로 묶고, 객체에서 구현한 내용을 외부로부터 감추어 은닉하는 것을 말한다. 2. 다양한 클래스의 정의 문제 풀이 2021. 8. 10.
C++ | 04-1 정보 은닉(Information Hiding) 1. 정보 은닉 1.1 정보 은닉의 이해 C++는 구조체 외부에서 구조체의 모든 멤버 변수와 멤버 함수에 쉽게 접근할 수 있다. 하지만 클래스는 객체지향 언어가 지향하는 정보 은닉(Information Hiding)을 고려해야 한다. 정보 은닉이란 클래스 외부에서 멤버 변수에 함부로 접근할 수 없게 하고 대신 클래스 내부에서 간접적으로 접근하는 멤버 함수를 정의하여, 안전하고 올바른 방향으로 멤버 변수에 접근할 수 있도록 유도하는 것을 말한다. 바로 이 정보 은닉을 위해 C++는 접근제어 지시자(Access Control Specifiers) 키워드를 제공하고, 클래스 외부에서 멤버 변수 또는 멤버 함수로 접근할 수 없게 한다. 접근제어 지시자 키워드는 private, protected, 그리고 publ.. 2021. 8. 9.
C++ | 03-2 클래스와 객체(Class and Object) 1. 클래스와 객체 2021. 8. 8.
C++ | 03-1 구조체(Structure) 1. 구조체 2021. 8. 8.
C++ | 02-3 C++에서 C언어 표준함수 호출하기(C Standard Library) 1. C++에서 C언어 표준 함수를 호출하기 1.1 C언어 표준 함수 C언어의 라이브러리는 매우 다양한 유형의 함수들이 정의되어 있다. 그런데 이러한 함수들은 C++ 표준 라이브러리에 역시 포함되어 있어 어렵지 않게 사용할 수 있다. C++에서 C언어의 표준 함수를 호출하기 위해서 헤더 파일의 확장자인 .h를 생략하고 가장 앞에 c를 붙이면 C++의 헤더 파일 이름이 된다. C언어 C++ 함수 #include #include printf, scanf, puts, gets, etc #include #include atoi, itoa, rand, srand etc #include #include time, clock, etc #include #include abs, sqrt, sin, cos, etc #in.. 2021. 8. 2.
C++ | 02-2 malloc과 free를 대신하는 new와 delete 1. malloc과 free를 대신하는 new와 delete 1.1 동적할당을 위한 new와 delete 데이터 영역과 스택 영역에 할당되는 메모리의 크기는 컴파일 타임(Compile Time)에 미리 결정된다. 하지만 힙 영역의 크기는 프로그램이 실행되는 도중인 런 타임(Run Time)에 사용자가 직접 결정하게 된다. 이렇게 런 타임에 메모리를 할당받는 것을 메모리의 동적할당(Dynamic Allocation)이라고 한다. C언어는 malloc과 free 함수를 통해 동적할당을 할 수 있으나, C++는 메모리의 동적할당을 위해 더욱 효과적인 new와 delete 연산자를 제공한다. 1.2 변수, 배열, 객체의 동적할당 동적할당에 사용되는 포인터의 가장 큰 목적은 이름없는 메모리를 포인터에 할당하여 할.. 2021. 8. 2.
C++ | 02-1 참조자(Reference) 1. 참조자(References) 1.1 참조자의 이해 참조자는 성격상 포인터와 비유되기 쉬운 개념으로, 참조자를 이해하기 위해서 먼저 변수의 개념을 살펴봐야 한다. 우선, 변수란 할당된 메모리 공간에 붙여진 이름으로, 사용자는 변수를 통해 해당 메모리 공간에 접근할 수 있다. 그런데 C++는 &연산자를 사용하여 할당된 메모리 공간에 둘 이상의 이름을 부여할 수 있는데 이것을 가리켜 참조자(Reference)라고 한다. int num1 = 2021; int& num2 = num1;/* 변수 num1에 대한 참조자 num2를 선언합니다. */ int* ptr = &num1/* 변수 num1의 주소를 포인터 ptr에 저장합니다. */ 참조자의 이해를 위해서 변수 num1과 참조자 num2를 선언하였다. 위의.. 2021. 8. 2.
C++ | 01-5 이름공간(Namespace) 1. 이름공간(Namespace) 1.1 이름공간의 등장 여러 사람이 공동으로 모여 규모가 큰 프로그램을 개발하면 변수와 함수의 이름이 중복되는 경우가 발생한다. 예를 들어, RPG 게임을 개발하는데 두 회사가 참여했다고 생각해보자. 두 회사는 열심히 프로그램을 작성하였고, 6개월 후 각각 맡은 부분을 하나로 통합하려고 한다. 그런데 주인공의 공격 함수의 이름과 몬스터의 공격 함수의 이름이 Attack으로 우연히 같다는 것을 알게 된다. 함수의 이름이 같으니 충돌이 발생하고, 결국 프로그램에서 Attack 함수를 사용하는 부분을 전부 수정해야하는 골치 아픈 문제가 발생한 것이다. C++는 이름공간(Namespace)을 통해 이러한 문제를 근본적으로 해결할 수 있다. 1.2 이름공간의 선언과 정의 이름공간.. 2021. 7. 31.