[Effective C++] 2. define보다 const, enum, inline을 써보자

나우히즈·2024년 11월 4일

CXX

목록 보기
10/11

C에서 주로 사용하는 방법인 define은 디버깅 과정에서 혼란을 줄 수 있어서 피하는 것이 좋다.

#define 매크로 대신 const, enum, 그리고 inline을 사용하는 것이 더 권장되는 이유는 안전성가독성에서 많은 이점을 제공하기 때문이다.

1. const 상수 사용

  • #define을 통해 상수를 정의할 수 있지만, 이는 형 검사를 거치지 않으며 단순히 텍스트 치환만 수행함. 이로 인해 발생하는 디버깅 어려움이나 타입 관련 문제가 생길 수 있다.
  • const로 상수를 정의하면 타입 안전성이 확보되고, 디버거에서 확인 가능하며, 스코프를 가지기 때문에 코드의 유지 관리가 용이함.
// #define을 사용한 경우
#define PI 3.14159

// const를 사용한 경우
const double Pi = 3.14159;

혹시나 포인터에 대한 상수 처리를 한다면, 포인터가 가리키는 그 위치에까지 상수처리를 하여 사용하는 것이 좋다.

// 내용과 더불어 그 내용을 가리키는 포인터도 상수 처리 해주자.
const char * const Name = "sihkang";

클래스 상수를 정의한다면, static을 두어 상수에 대한 여러 개의 메모리 주소가 사용되지 않게끔 하자.

class CostEstimate
{
private:
	// 선언 (*.h)
	static const double FudgeFactor;
    ...
};


// 구현 (*.cpp)
const double CostEstimate::FudgeFactor = 1.35;

선언과 구현은 분리하여 주도록 하자.

2. enum을 통한 상수 그룹 관리

  • #define으로 여러 상수를 정의하는 대신, 관련 상수들을 묶어서 표현할 수 있는 enum을 사용하는 것이 좋다.
  • enum가독성을 높여줄 뿐만 아니라, 네임스페이스를 제공해 상수 값이 어떤 맥락에 속하는지 분명하게 함.
  • 특히 enum class를 사용하면 더 높은 타입 안정성을 제공.
// #define을 사용한 경우
// #define RED 0
// #define GREEN 1
// #define BLUE 2

// enum을 사용한 경우
enum Color { Red, Green, Blue }; // RED 0, GREEN 1, BLUE 2.

// enum class를 사용한 경우 (C++11 이후)
enum class ColorSafe { Red, Green, Blue };

3. inline 함수 사용

  • #define으로 간단한 매크로 함수를 정의하는 경우가 있지만, 이 역시 타입 안전성이 보장되지 않고, 매크로 함수 내부에서의 부작용을 예측하기 어려울 수 있다.
  • inline 함수를 사용하면 타입 검사를 통과하며, 인라인 확장이 필요한 곳에서만 적용되어 효율성을 확보
// #define을 사용한 경우
#define SQUARE(x) ((x) * (x))

// inline 함수를 사용한 경우
inline int square(int x) { return x * x; }

요약

  • const를 통해 상수를 정의하면 안전하게 타입을 지정할 수 있고, 디버깅이 용이
  • enum 또는 enum class는 관련 있는 상수들을 하나의 그룹으로 관리할 수 있으며, 가독성을 높임.
  • inline 함수는 함수 호출의 타입 안정성을 유지하면서도 매크로 함수의 단순성을 가져올 수 있다.

0개의 댓글