공부/C++

c++ 함수

샤샤샤샤 2025. 11. 10. 22:21

c++ 는 컴파일러가 main을 가장 마지막에 컴파일 하지 않는다. 따라서 main에서 사용된 함수가 main 아래에서 선언된 경우, 컴파일 되지 않은 함수를 인식하지 못해 오류가 발생한다.

#include <iostream>

using namespace std;

int main()
{
	hello();
}

void hello() {
	cout << "hello world";
}

이때 hello 는 main아래에 있어서 컴파일 시점에 오류가 발생한다.

이를 막기 위해 함수 선언만 main위에 먼저 하고, 아래에서 다시 구현할 수 있다.

void hello();

int main()
{
	hello();
}

void hello() {
	cout << "hello world";
}

 

파라미터와 전달 인자
함수를 호출할때 전달되는 값이 전달 인자, 함수 내부에서 사용되는 변수가 파라미터다. 전달인자란 실제 값, 파라미터는 함수 내부 변수라고 이해하면 편하다.

#include <iostream>

using namespace std;

void hello(int);

int main()
{
	hello(3);
}

void hello(int n) {
	cout << "hello world: " << n ;
}

함수의 선언에서는 파라미터의 이름을 생략해도 문제가 없다.

 

함수와 배열

함수는 배열을 직접 return 해줄수 없다.

 

함수와 구조체
함수는 내부에서 구조체를 직접 파라미터로 받을수도 있고, 직접 구조체를 return할수도 있다. 그러나 이때 복사본을 만들어서 이로 작업하기 때문에 메모리를 많이 소모하게 되고, 복사 시간도 오래 걸리게 된다.
이를 피하기 위해서는 아래와 같이 값이 아니라 메모리 주소(포인터) 로 넘길수 있다.

#include <iostream>

using namespace std;

struct Human {
    int age;
};

void increaseAge(Human* h) {  // 포인터로 전달
    h->age += 1;              // 원본에 직접 접근
}

int main() {
    Human person;
    person.age = 20;

    increaseAge(&person);     // 주소 전달
    cout << person.age << endl;  
}

 

함수와 포인터
함수 역시 특정 메모리에 저장되며, 메모리 주소를 가지고 있다. 따라서 포인터 변수에 함수를 담을 수 있다.

#include <iostream>

using namespace std;

string func(string);

int main() {
    string(*p)(string);
    p = func;
    cout << (*p)("hello");
}

string func(string a) {
    return a;
}

이때 string(*p)(string); 은 함수의 포인터가 된다. 앞에서 부터 분석해보면 string을 반환값으로 받으며 p라는 이름의 * 포인터인, (string) 을 매개변수로 받는, 함수의 포인터라는 의미다.
그리고 이 포인터를 함수처럼 호출하는 것이 바로 (*p)("hello"); 인 것이다.

'공부 > C++' 카테고리의 다른 글

c++ 포인터  (0) 2025.11.09
c++ 기본 문법  (0) 2025.11.09