C++

10. Function (1)

Kelvin의 게임개발 2024. 1. 25. 00:01
728x90
반응형

1. What is Function?

 

C++개발을 할 때는 C++ STL의 함수나 클래스, Third-party Library (Unity, Unreal, Cocos2D 등), 직접 만든 함수나 클래스를 사용하여 개발을 한다

 

함수를 사용하여 기능들을 모듈화 하고 여러 부분에 동일한 기능을 사용해야 할 때 사용하며 이를 통해 크고 복잡한 프로젝트를 관리하기 쉽게 개발 할 수 있다 (디버깅, 가독성 등에 좋다)

 

함수는 추상화 하는것이 중요하다, 함수 내부의 코드가 어떻게 돌아가는지 상관없이 함수 호출시 함수 이름 의미 그대로 실행되어야 한다

 

#include <iostream>
#include <cstdlib> //standart library 함수를 사용하기 위한 헤더파일
#include <cmath> //C++에서 수학관련 함수를 사용하기 위한 헤더파일
#include <ctime> //time관련 함수를 사용하기 위한 헤더파일

using namespace std;

int main()
{
	//math <cmath>
	sqrt(a); //a의 제곱근
	cbrt(a); //a의 3제곱근
	
	sin(a); //sin(a)
	cos(a); //cos(a)

	ceil(a); //a올림
	floor(a); //a내림
	round(a); //a반올림

	//random <cstdlib>, <ctime>
	srand(time(nullptr)); //rand함수에 사용될 수를 초기화 한다 (이때 매개변수로 들어온 seed값을 이용하기 때문에 seed값을 매번 다르게 넣어야 한다 그래서 time(nullptr) 사용)
	int a = rand(); //rand()로 srand()의 seed값과 매칭되는 숫자를 return하여 난수를 만든다 (srand가 없다면 계속 같은 수를 return한다)
}

 

 

2. Function Definition

 

함수의 이름은 유의미해야 하며 기능의 의도를 제공해야 한다 ex) Func1, Func2 이런 이름 사용 금지 동사형태로 작성하는게 좋다 ex) OpenDoor(), ClickButton()

 

매개변수는 없을수도 있고 여러개가 있을수도 있다 여러개일 경우에는 ,로 구분한다 (매개변수는 (타입 이름) 형태로 작성한다)

 

반환형은 함수가 반환하는 value의 type이다 반환값이 없다면 void로 작성한다

 

반환값이 있다면 return 반환값; 으로 반환해주어야 한다 (return하지 않는다면 컴파일 에러 발생)

 

함수는 return을 만나게 되면 즉시 종료한다

 

함수 내부에서 return은 logic에 따라 여러개가 존재할 수 있다 ex) if()별로 return이 존재할 수 있다

 

함수이름(매개변수);로 함수 호출이 가능하다, 호출 순서를 잘 신경 써야 한다

//함수를 정의하는 방법
반환형 함수이름(매개변수)
{
	함수구현
    
    return 반환값;
}

//함수를 호출하는 방법
함수이름(매개변수);


//함수 선언부가 함수 호출부보다 밑에 있으면 컴파일 에러가 발생한다(매개변수의 타입과 개수를 모르기 때문에) 따라서 전방선언을 해주어야 한다
//전방선언은 반환형 함수이름(매개변수); 로 선언한다 이때 매개변수에는 타입만 작성해도 괜찮다
void Area_Circle(); //전방선언
double Calc_Area_Circle(double InRadius); //전방선언

const double pi{ 3.141592 };

int main()
{
	Area_Circle(); //함수 호출
}

void Area_Circle() //함수 정의
{
	double Radius{};

	cout << "\nEnter the radius of the circle : ";
	cin >> Radius;

	cout << "The area of a circle with radius " << Radius << " is " << Calc_Area_Circle(Radius) << endl;
}

double Calc_Area_Circle(double InRadius) //함수 정의
{
	return pi * InRadius * InRadius; //value return
}

 

 

3. Function Parameters

 

함수의 인자로 데이터를 넘기게 되면 해당 데이터의 사본이 함수로 전달되게 된다

 

따라서 함수에서 받은 인자를 변경한다고 해도 전해준 원본 데이터는 변경되지 않는다 (사본이기 때문, 원본/사본 데이터는 서로 메모리 주소가 다르다)

 

이는 좋은점도 있고 안좋은점도 있다, 실수나 의도적으로라도 원본 데이터는 변경되지 않는다는것이 바로 장점이자 단점이고 사본을 만들기 때문에 메모리 비용이 든다는것이 단점이다 (나중에 객체를 인자로 넘길 때 사이즈가 큰 객체는 사본 생성에 큰 비용이 든다)

void ParamTest(int Input);

int main()
{
	int Test{ 50 };

	ParamTest(Test); //인자로 넘긴 Test의 사본이 전달

	cout << Test << endl; //사본이 변경되었기 때문에 원본은 100이 아닌 그대로 50이다
}

void ParamTest(int Input)
{
	Input = 100; //전달된 인자의 사본이 100으로 변경 -> 원본은 변하지 않음
}

 

 

4. Default Argument Value

 

기본적으로 함수를 호출할 때 매개변수의 개수, 타입에 맞춰서 인자를 넘기며 호출해야 한다

 

하지만 매개변수에 default값을 지정하여 함수 호출 시 인자를 넣지 않아도 호출하게 만들 수 있다 (함수 호출 시 인자로 넘기지 않아도 지정한 default값이 넘어가게 된다)


매개변수 default값은 항상 매개변수의 끝에 작성해야 한다 -> 매개변수가 여러개일때 default로 지정한 매개변수가 항상 끝이어야 한다는 의미

 

매개변수의 default값은 함수 선언시만 작성하고 정의할때는 작성하지 않는다
매개변수를 default로 지정하고 호출시 다른 값을 넘겨도 상관 없다 -> default값은 무시되고 넣은 다른값이 인자로 전달되게 됨

 

이 default 매개변수를 사용하는 이유는 함수를 사용하는 곳 대부분이 같은 인자값을 넘기는 case일때 많이 사용한다 (일부만 다른 인자를 넘길 때) 하지만 자주 사용하는건 별로 좋은 습관이 아니다

 

//반환형 함수이름(매개변수 = 값); 으로 매개변수 default값을 지정할 수 있다

int TestFunc1(int a = 100); //가능
int TestFunc2(int a, int b = 200); //가능
int TestFunc3(int a = 100, int b); //default로 지정한 매개변수가 끝에 있지 않기 때문에 불가능

int main()
{
	TestFunc2(10); //10만 넣어도 default값인 200이 인자로 전달되기 때문에 10, 200이 콘솔창에 출력된다
}

int TestFunc2(int a, int b) //선언시에만 default값 작성, 정의할때는 작성하지 않는다
{
	cout << a << b << endl;
}

 

 

5. Overloading Function

 

C++에서는 원래 함수 이름의 중복을 금지하지만 매개변수의 목록이 다르다면 함수 이름을 중복으로 사용이 가능한데 이를 함수 오버로딩이라 한다

 

컴파일러가 함수 정의 시 선언된 매개변수, 호출 시 전달된 인자를 통해 같은 이름의 함수중 어떤 함수를 사용할 지 결정한다 (반환형은 영향을 주지 않는다)

 

함수 오버로딩은 추상화의 좋은 예이다 (함수 내부의 코드가 어떻게 돌아가는지 상관없이 함수 호출시 함수 이름 의미 그대로 실행되기만 하면 된다)

 

함수 오버로딩은 다형성 (Polymorphism)에 해당한다 이는 같은 개념의 여러 형태를 의미한다 (같은 이름의 함수지만 각각 다른 일을 한다)

 

함수 오버로딩 시 매개변수 default값을 함수별로 지정하면 문제가 될 수 있다 (어떤 함수를 호출해야 할 지 컴파일러가 모르기 때문에 컴파일 에러 발생)

int AddNumbers(int a, int b);
double AddNumbers(int a, int b); //반환형만 다른건 오버로딩이 불가능하다
double AddNumbers(double a, double b); //매개변수의 타입이 다르기 때문에 오버로딩 가능
int AddNumbers(int a, double b); //매개변수 중 하나만 달라도 오버로딩 가능
int AddNumbers(int a); //매개변수의 개수가 달라도 오버로딩 가능


// 매개변수 default값을 함수별로 지정하면 문제가 될 수 있다
 int AddNumbers(int a = 100);
 int AddNumbers(double a = 100.f);
 AddNumbers(); //컴파일러가 어떤 함수를 호출해야 할 지 모르기 때문에 컴파일 에러를 발생시킨다

 

728x90
반응형

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

12. Pointer And Reference, Memory Allocate (1)  (107) 2024.01.30
11. Function (2)  (108) 2024.01.26
9. Character & String  (134) 2024.01.08
8. Control Program Flow (2)  (113) 2023.12.21
7. Control Program Flow (1)  (89) 2023.12.20