**C++**에서 inline 키워드는 컴파일러에게 함수 호출을 함수의 실제 코드로 치환(인라인 전개)할 것을 제안하는 키워드입니다. 함수 호출의 오버헤드를 줄이고 성능을 향상시키기 위해 사용됩니다.

1. inline의 기본 개념

일반 함수 호출 vs 인라인 함수

// 일반 함수
int add(int a, int b) {
    return a + b;
}

// 인라인 함수
inline int addInline(int a, int b) {
    return a + b;
}

int main() {
    int result1 = add(5, 3);        // 함수 호출 오버헤드 발생
    int result2 = addInline(5, 3);  // 컴파일러가 인라인으로 치환할 수 있음
    return 0;
}

인라인 전개 결과

// addInline(5, 3) 호출이 다음과 같이 치환될 수 있음:
int main() {
    int result1 = add(5, 3);  // 여전히 함수 호출
    int result2 = 5 + 3;      // 인라인으로 치환됨
    return 0;
}

2. inline 사용법

함수 정의에서 inline

// 선언과 정의를 분리한 경우
inline int multiply(int a, int b);  // 선언

inline int multiply(int a, int b) {  // 정의
    return a * b;
}

// 또는 선언과 동시에 정의
inline int divide(int a, int b) {
    return a / b;
}

클래스 내부 정의 (암시적 inline)

class Calculator {
public:
    // 클래스 내부에서 정의된 함수는 자동으로 inline으로 간주됨
    int add(int a, int b) {
        return a + b;
    }

    int subtract(int a, int b);  // 선언만
};

// 클래스 외부에서 정의하면서 inline 지정
inline int Calculator::subtract(int a, int b) {
    return a - b;
}

3. inline의 장점과 단점

장점

// 성능 향상 예시
inline int square(int x) {
    return x * x;
}

void performCalculations() {
    for (int i = 0; i < 1000000; ++i) {
        int result = square(i);  // 함수 호출 오버헤드 제거
        // 실제로는 int result = i * i; 로 치환됨
    }
}

단점

// 코드 크기 증가 예시
inline void complexFunction() {
    // 복잡한 로직 (50줄의 코드)
    for (int i = 0; i < 100; ++i) {
        // 많은 계산들...
    }
}

void callingFunction() {
    complexFunction();  // 이 호출마다 50줄의 코드가 복사됨
    complexFunction();  // 또 50줄 복사
    complexFunction();  // 또 50줄 복사
    // 결과: 코드 크기가 급격히 증가
}

4. 컴파일러의 inline 결정

컴파일러가 inline을 무시하는 경우

// 너무 복잡한 함수
inline void tooComplex() {
    for (int i = 0; i < 1000; ++i) {
        // 복잡한 계산들
        std::cout << "Complex operation " << i << std::endl;
    }
}

// 재귀 함수
inline int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);  // 재귀 호출
}

// 가상 함수
class Base {
public:
    inline virtual void func() {  // 가상 함수는 inline이 어려움
        std::cout << "Base function" << std::endl;
    }
};

컴파일러가 자동으로 inline하는 경우