언리얼 - C++ 35 : inline, enum

김정환·2025년 3월 26일

Unreal C++

목록 보기
35/37

1️⃣ inline

  • 컴파일러에게 판단을 맡겨 최적화 진행을 요청함.
  • 일반적으로 함수는 스택 메모리를 사용.
    • 재귀함수가 그래서 비효율적이었던 이유.
    • 함수 하나에서 다 해결하는 것이 아니라 여러번 호출해서 해결
  • inline 기능
    • inline 키워드가 붙은 함수가 다른 함수 내에서 호출될 때, 새로운 스택 영역을 만들지 않고
      하나의 함수 내에서 마치 같은 코드인 것처럼 컴파일러가 작동하는 것.
    • 코드를 복사 붙여 사용하는 처리와 작동이 유사함.

분할 구현 시 inline

  • 그간 템플릿을 사용해서 클래스르 만들다보니 헤더에 모든 구현이 들어갔음.
  • 일반 클래스는 본래대로 헤더, cpp 분할 구현
    • 만약 헤더에 구현한다면, inline 처리로 받아들임
    • 즉, 새로운 함수 호출 구역으로 처리하지 않음.

비효율

  • inline의 경우, 코드를 복사붙여넣기 하는 것이라 했는데 매번 그런 것은 아님.
  • 너무 큰 기능, 길이의 함수는 inline으로 처리하면 빌드 시 그만큼 용량을 차지할 것.
    • 이런 함수는 컴파일러가 알아서 복사 붙여넣기하지 않을 수도 있음. => 자체적으로 다른 최적화를 할 수 있음.

inline 사용처

  • 짧은 길이 + 빈번한 호출 : 이런 경우의 함수는 inline 처리하는 것이 효율적인 것.
    • 단순히 값을 한두줄로 반환하거나, begin(), end(), get, set 류의 함수들이 유리함.
  • 그래서 이런 getter, setter 등등은 inline처리해서 클래스에 바로 구현해두는 것.

2️⃣ 열거형 enum

enum MY_TYPE
{
	TYPE_1,		// 0
    TYPE_2,		// 1
    TYPE_3,		// 2
    TYPE_4 = 100, // 100 직접 지정
    TYPE_5, 	// 101
};
  • 정수를 문자 형태의 변수로 대응시킨 자료형
    • C#과 동일
int main()
{
	int a = TYPE_1; // 0
	
	return 0;
}

중복 선언

enum MY_TYPE
{
	TYPE_1,		// 0
    TYPE_2,		// 1
    TYPE_3,		// 2
    TYPE_4 = 100, // 100 직접 지정
    TYPE_5, 	// 101
};

enum OTHER_TYPE
{
	TYPE_1,		// 불가능
    TYPE_11,	// 가능
};
  • 위와 같이 명칭이 겹칠 경우 재정의 오류가 발생함.
    • 어떤 열거형의 값인지 모름.

enum class

  • cpp에 추후에 추가된 기능
enum class CLASS_TYPE
{
	TYPE_1 = 1,
}

int main()
{
	CLASS_TYPE::TYPE_1; // 1
    
	int a = (int)CLASS_TYPE::TYPE_1;
    
	return;
}
  • class 타입이 붙다보니 int로 바꾸기 위해선 명시적 형변환이 필요함.
  • 또한 class가 붙어서 다른 열거형의 변수와 이름이 겹쳐도 구분이 가능함.
    • 약간의 제한을 가하는 것도 기능임.

최근 컴파일러는 일반 enum을 쓰면 enum class를 사용하도록 경고를 보내기도 함.


enum vs 전처리기

#define CLASS_1 0

int main()
{
	int a = CLASS_1;
	return 0;
}
  • enum이 할 수 있는 것을 동일하게 할 수 있지 않나.
  • 이 기능은 전처리기라는 것에 집중.
    • 컴파일 전에 실행되는 것.
    • 이 코드의 사용은 사실 다음과 같음.
    int main()
    {
        int a = CLASS_1;
        // int a = 0;
        
        return 0;
    }
    • 코드상 그냥 0을 넣은 것.

enum class CLASS_TYPE
{
  TYPE_1 = 1,
}

int main()
{
    int a = (int)CLASS_TYPE::TYPE_1;

    return 0;
}
  • 이 코드는 디버깅을 해서볼 때, 1이란 숫자를 넣은 것이 아니라
    CLASS_TYPE 타입의 TYPE_1 값을 넣은 것으로 표시됨.
    • 정확한 타입이 명시되는 것.
    • 컴파일러에서 명확하게 인식할 수 있으므로 좀 더 많은 정보를 얻을 수 있음.

  • enum의 의의 자체가 단순한 숫자로 사용할 값이더라도
    코드의 사용을 이해하기 쉽도록 문자열에 대응시켜서 사용하는 것이
    • 즉, 유지보수 측면, 가독성의 편의성을 향상시키기 위한 것.
  • 그러므로 일반적인 define을 사용해서 값을 대신 사용하는 것에는 이런 차이가 있음.
profile
만성피로 개발자

0개의 댓글