카테고리 없음

c++ 함수2

샤샤샤샤 2025. 11. 12. 21:34

인라인 함수
컴파일시, 함수가 저장된 메모리 주소를 가르키는 것이 아닌, 함수 자체가 해당 부분에 삽입되도록 하는 함수다. 즉, 프로그램이 실행되며 메모리 주소 00001 에서 a라는 함수를 호출할때, a가 저장된 01000 으로 이동하는 대신, 컴파일 시점에 00001의 a호출 부분에 아예 a함수를 삽입해버리는 것이다. 그러면 00001에서 01000 으로 이동하는 대신, 그냥 순서대로 코드를 실행시키면 된다.
인라인 함수는 성능 향상의 이점이 있지만 함수가 간단하면 차이는 미미하다.

#include <iostream>

using namespace std;

inline int func(int);

int main() {
    cout << func(5);
}

int func(int a) {
    return a*a;
}

함수 선언 앞에 inline을 붙여 만들수 있다.

 

디폴트 매개변수
매개변수의 기본값을 지정해준다. 매개변수가 들어오지 않을때 해당 값이 매개변수로 인식된다.

#include <iostream>

using namespace std;

 int func(int a = 3);

int main() {
    cout << func() << std::endl; // 9
    cout << func(5) << std::endl;  // 25
}

int func(int a) {
    return a*a;
}

디폴트 매개변수는 함수의 선언 시점에 매개변수 이름을 정의해주며 값을 넣어주면 된다.
디폴트 매개변수는 여러 매개변수의 가장 오른쪽에 선언해야 한다. 

 

참조 변수
c++ 에서 새롭게 도입한 변수. 참조 변수를 사용하면 함수 내부에서 구조체를 사용해도 복사본이 아닌 원본을 가르키게 된다. 일찍이 사용한 주소 연산자 & 를 사용한다. 즉, &는 코드 문맥에 따라 주소연산자가 되거나 참조연산자가 된다.

#include <iostream>

using namespace std;

 void funcA(int* a, int* b);
 void funcB(int& a, int& b);
 void funcC(int, int);

int main() {
    int a1 = 100;
    int b1 = 200;

    cout << "처음: " << endl;
    cout << "a1: " << a1 << ", b1: " << b1 << endl;
    cout << endl;
    cout << "포인터를 이용한 값 교환" << endl;
    funcA(&a1, &b1);
    cout << "포인터를 이용한 값 교환한 뒤:" << endl;
    cout << "a1: " << a1 << ", b1: " << b1 << endl;
    cout << endl;
    cout << "참조를 이용한 값 교환" << endl;
    funcB(a1, b1);
    cout << "참조를 이용한 값 교환한 뒤:" << endl;
    cout << "a1: " << a1 << ", b1: " << b1 << endl;
    cout << endl;
    cout << "값 이용한 값 교환" << endl;
    funcC(a1, b1);
    cout << "값 이용한 값 교환한 뒤:" << endl;
    cout << "a1: " << a1 << ", b1: " << b1 << endl;
}

// 포인터로 전달
 void  funcA(int* a, int* b){
     int temp;
     temp = *a;
     *a = *b;
     *b = temp;
}


 // 참조로 전달
 void funcB(int& a, int& b) {
     int temp;
     temp = a;
     a = b;
     b = temp;
 }

 // 값으로 전달
 void funcC(int a, int b) {
     int temp;
     temp = a;
     a = b;
     b = temp;
 }

두 매개변수 값을 바꾸는 함수다. 이를 실행한 결과는 다음과 같다.

이때 처음 포인터를 이용해서 값이 바뀌었고, 이후 다시 참조를 이용해서 값이 다시 바뀌었다.
반면 값을 매개변수로 받은 함수는, 함수 내부에서 복사본을 만들어 사용하기 때문에 값이 그대로인 것을 볼 수 있다.
따라서 함수 내부에서 원본에 접근하고자 하면, 참조변수, 또는 포인터를 매개변수로 받아야 한다.

 

함수의 오버로딩
매개변수를 달리해서 같은 이름의 함수를 여러개 만드는 기능. 이때 매개변수는 같지만 리턴값이 다른 두 함수로 오버로딩하는 것 역시 안된다.

 

함수의 템플릿
c++ 은 템플릿이라는 기능을 제공한다. 다른 언어의 제네릭과 비슷한 개념으로, 매개변수 타입을 미리 지정해두지 않고, 런타임에 들어오는 형식에 맞게 지정되는 기능이다.
아래의 코드를 보자.

#include <iostream>

using namespace std;

template <class ANY>
ANY sum(ANY, ANY);

int main() {
    int a = 100;
    int b = 200;

    float aFloat = 1.1;
    float bFloat = 2.1;

    cout << sum(a, b) << endl;  // 300
    cout << sum(aFloat, bFloat);  // 3.2
}

template <class ANY>
ANY  sum(ANY a, ANY b){
     return a + b;
}

하나의 함수가 각기 다른 타입의 매개변수를 받아, 각기 다른 타입의 결과를 리턴한다.
다만 이때 하나 주의할건, ANY는 하나의 타입만 될 수 있다는 거다. 아래와 같은 코드는 불가능하다.

#include <iostream>

using namespace std;

template <class ANY>
ANY sum(ANY, ANY);

int main() {
    int a = 100;

    float aFloat = 1.1;

    cout << sum(a, aFloat) << endl;
}

template <class ANY>
ANY  sum(ANY a, ANY b){
     return a + b;
}