🐣함수란?

함수는 총 선언, 정의, 호출로 나뉜다. 위의 자료는 함수 정의 방법이다.

  • 선언: 프로토타입, 이후에 설명
  • 정의: 함수가 어떻게 이루어졌는지 정의
  • 호출: 정의한 함수를 사용함

argument(인자) vs parameter(매개변수)

함수를 정의하고 호출할 때, 인자와 매개변수가 사용된다.

  • 인자(argument): 함수에 값을 전달해주는 역할을 한다,
  • 매개변수(parameter): 인자를 통해 받은 값을 저장할 공간을 제공하고, 이를 가지고 함수의 코드를 실행시키는 역할을 한다.
    아래 코드 기준 int num1 = 2라고 생각하면 편한다.
#include<iostream>
using namespace std;

double avg(int num1, int num2); //함수 선언(프로토타입)


int main() {

	cout << avg(2, 12) << endl; //함수 호출
	//2,12 는 인자

	return 0;
}

double avg(int num1, int num2) { //함수 정의
	//num1, num2는 매개변수
	return (num1 + num2) / 2.0; 
}

함수 prototype (함수선언)

이는 메인함수 앞에서 미리 함수를 선언하는 것이다. 이때 중괄호 안에 내용은 쓰지 않으며, 함수의 헤더와 세미콜론만 조합된 구문이다.


그렇다면 쓰는 이유는 무엇일까?🤔
1. 우선 메인함수 뒤에 함수 정의만 한다면, 메인함수는 이 식별자를 알아차리지 못하여 함수를 사용하지 못한다. 그렇다면 메인함수 앞에 정의하면 되는것 아니냐?


2. 예시를 하나 들어보겠다. 함수1, 함수2가 메인함수 앞에서 정의되었다. 이때 함수1안에서 함수2번을 호출한다면 에러가 뜰 것이다. 또한 함수2번 안에서도 함수 1번을 호출해도 에러가 뜰 것이다. 이렇듯 프로토타입을 쓰지 않는다면, 함수의 순서를 고려해가며 이를 배치해야 하는 번거로움이 있다.


프로토타입은 어떤 함수인지 사전정보만 주고, 내용은 뒤에 나온다. 무슨 함수인지는 적지 않고, 사전정보만 주는 것이기 때문에 순서가 중요하지 않다.

pass by value VS pass by reference

2. pass-by-reference

참조(reference)란 무엇인가?

reference는 객체의 또 다른 이름(별칭)을 말한다. 더 자세히 말하면 하나의 공간을 부르는 또 다른 이름이다.
이는 변수자료형& 변수명 = 변수로 일반적으로 정의한다.

#include<iostream>
using namespace std;

int main() {
	int a{ 5 };
	int b{ 7 };

	int& ref1 = a; //참조 선언 a의 또 다른 이름 ref1
	cout << ref1 << endl; //5

	ref1 = b; //ref1이 바뀌면서 a도 같이 바뀜.
	//참조는 한번 선언하면 바꾸지 못함. 그래서 이는 그냥 b의 값을 ref1에 대입해주는 것이다.
	cout << a << endl; //7
	cout << b << endl; //7


	//const는 const로 참조를 선언해줘야 한다.
	const int c{ 9 };
	const int& ref2 = c;


	// 리터럴에는 참조x, const를 붙인다면 가능
	const int& ref3 = 5;

	return 0;
}

아래에 코드가 pass by reference의 대표적 예시이다.
int& y = x;와 같은 의미로 함수 안에서 y값이 변하면 x값도 같이 변한다.


#include<iostream>
using namespace std;

int main(){
	int x = 10;
    fun(x);
    ...
}

void fun(int& y)
{
...
}

pass-by-value

이는 참조와 달리 단지 값만 전달하는 방법이다. 쉽게 말해, 호출한 함수가 인자를 건드릴 수 없고 값만 읽을 수 있다는 뜻이다.

#include<iostream>
using namespace std;

void fun(int y);

int main() {
	
	int x = 10; //x변수 선언
	fun(x); //x값 전달(pass by value)
	cout << "main함수 내부의 x값 = " << x << endl;

	return 0;
}

void fun(int y) {
	y++;
	cout << "함수 내부의 y값: " << y << endl;
}

이는 y값이 변한다고, x값이 변하지 않는다. 이는 값만 전달한 것으로 pass-by-value의 대표적 예시가 될 수 있다.
만약, int y => int& y가 된다면 아래와 같이 출력된다.
이렇게 쓴다면 int &y = x와 같다. 그렇기 때문에 pass-by-reference 자료 전달 방법으로 y와 x둘다 같은 저장소를 사용한다.

profile
집돌이 FE개발자의 노트

0개의 댓글