ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++ 인라인 함수 및 디폴트 매개변수
    C++ 2025. 3. 25. 23:24

    일반적으로 함수의 호출은 함수의 주소로 점프하는 과정이다.

    인라인 함수는 컴파일된 함수 코드가 프로그램의 다른 코드에 삽입

    컴파일러의 인라인 함수 호출은 점프하는 것이 아닌 그에 대응하는 함수 코드로 대체되는 것이 인라인 함수이다.

    #include <iostream>
    using namespace std;
    
    inline float square(float x) {
        return x * x;
    }
    
    int main() {
        // 인라인 함수
        int a = 5;
        cout << "한 변의 길이가 " << a << "인 정사각형의 넓이는?" << endl;
        float b = square(a);
        cout << b <<endl;
    }

    inline 함수를 사용하려면 원형 앞에 inline을 붙여주면된다. inline 함수를 사용할때의 장점은 프로그램의 실행속도 향상에 이점이 있다.

    그러나 코드가 복잡해진다면 Inline함수를 사용하나 안하나 실행 시간은 비슷하다고 한다.

     

    디폴트 매개변수란 기본값이 제공된 함수 매개 변수이다.

    #include <iostream>
    using namespace std;
    
    void printValues(int x, int y=10) {
        cout << "x: " << x << endl;
        cout << "y: " << y << endl;
    }
    
    int main() {
        printValues(1);
        printValues(3,4);
    }

     해당 코드를 보면, x의 값은 정해지지 않았고, y는 10으로 초기화했다.

    출력 결과 printValues(1)의 결과로는 1과 10이 출력됐다. y의 인자값은 비워놨다.

    또한 모든 default parameter는 오른쪽부터 지정해야 한다. void printValues(int x = 10, int. y); 는 허용되지 않는다.

    또한 디폴트 매개변수를 여러개 지정할 수 있다.

    void printValues(int x = 1, int y = 2, int z = 3) {
        cout << "x: " << x << ", y: " << y << ", z: " << z << endl;
    }
    
    int main() {
        printValues();        // x=1, y=2, z=3 (모두 기본값 사용)
        printValues(5);       // x=5, y=2, z=3 (y, z만 기본값 사용)
        printValues(5, 6);    // x=5, y=6, z=3 (z만 기본값 사용)
        printValues(5, 6, 7); // x=5, y=6, z=7 (기본값 사용 안 함)
    }

    또한 기본값을 두 번 지정할 수 없다.

    참조 변수

    참조(reference)란? 미리 정의된 변수의 실제 이름 대신 사용할 수 있는 대용 이름

    #include <iostream>
    using namespace std;
    
    // 참조로 전달하는 방식
    void swapA(int& a, int& b) {
        int temp;
        temp = a;
        a = b;
        b = temp;
    }
    
    // 포인터로 전달하는 방식
    void swapB(int* a, int* b) {
        int temp;
        temp = *a;
        *a = *b;
        *b = temp;
    }
    
    // 값으로 전달하는 방식
    void swapC(int a, int b) {
        int temp;
        temp = a;
        a = b;
        b = temp;
    }
    int main () {
    
        int wallet1 = 100;
        int wallet2 = 200;
    
        cout << "최초 상태" << endl;
        cout << "wallet1 = " << wallet1 <<", wallet2 = " << wallet2 << endl;
    
        cout << "참조를 이용한 값의 교환" << endl;
        swapA(wallet1, wallet2);
        cout << "참조 교환 이후 상태\n";
        cout << "wallet1 = " << wallet1 <<", wallet2 = " << wallet2 << endl;
        
        cout << "포인터를 이용한 값의 교환" << endl;
        swapB(&wallet1, &wallet2);
        cout << "포인터를 이용한 교환 이후 상태\n";
        cout << "wallet1 = " << wallet1 <<", wallet2 = " << wallet2 << endl;
    
        cout << "값 이용한 값의 교환" << endl;
        swapC(wallet1, wallet2);
        cout << "값을 이용한 교환 이후 상태\n";
        cout << "wallet1 = " << wallet1 <<", wallet2 = " << wallet2 << endl;
        
        return 0;
    }

    여기보면 참조로 전달하는 방식, 포인터로 전달하는 방식, 값으로 전달하는 방식에 대해 공부하였다.

    먼저 참조로 전달하는 방식같은 경우, 해당 값을 넘기는게 아닌 해당 값의 주소값을 전달한다. 따라서 값은 서로 교환이 된다.

    포인터도 마찬가지로 주소를 참조하기때문에 값은 서로 교환이 된다.

    반대로 값을 이용한 일반 변수를 통해 스왑을 하게 되면, 원본이 아닌 복사본의 값을 건들게 된다.

    이는 영향을 끼치지 않기때문에 값의 교환은 하지 않는다.

    참조(&)와 포인터(*) → 원본을 직접 수정 가능 (교환 O)
    값으로 전달 → 복사본만 수정됨 (원본 변경 X)

    🔥 따라서 swapC는 원본 값을 변경하지 못하고, swapA, swapB는 변경 가능! 🚀

    'C++' 카테고리의 다른 글

    C++ 분할 컴파일  (0) 2025.03.27
    C++ 함수 오버로딩과 템플릿  (0) 2025.03.26
    C++ 함수(2)  (0) 2025.03.22
    C++ 함수 (1)  (0) 2025.03.21
    C++ if구문과 if else 구문 , switch 구문과 break/continue  (0) 2025.03.21
Designed by Tistory.