c, git, 컴퓨터/c++

Function (함수)

컴맹학자 2022. 10. 3. 21:49
728x90

정의

 

main 함수 별개로 독립적으로 설계된 코드의 집합 이며 c++함수는 캡슐화 하는데 유용하게 사용


사용 이유

 

1. 반복적인 프로그래밍을 회피

 ex) 특정 작업을 반복 해야할 때 코드로 작성 하는게 아닌 함수를 만들어서 해당 작업용 함수를 호출

2. 모듈화로 인한 코드의 가독성

3. 문제 발생, 기능 변경시 해당 함수만 변경으로 손쉬운 유지보수


특징

 

1. 반환값이 있는 형태와 반환값이 없는 형태의 2가지 형태로 선언

2. 반환 타입을 모든 타입을 사용이 가능


사용 예제

01_Function.cpp

더보기
#include "Global.h"
#include "01_Function.h"

//1. Class 에서 정의 해서 쓰는 함수
void test1(){ cout << "함수 호출" << endl; }

int main()
{
	test1();

	cout << test2() << endl;

	int a = 20;

	test3(a);
	cout <<"메인 함수 val값(test3)" << a << endl;

	test4(a);
	cout <<"메인 함수 val값(test4)" << a << endl;

	//5. 함수 포인트
	cout << "test4 의 주소 값 : " << test1 << endl;
	void (*test5)(int&);
	
	test5 = test4;
	test5(a);
	cout <<"메인 함수 val값(test5)" << a << endl;

	test6(5);
	test6(5.5f);

	test7();

	test8();
	test8(100);

	system("pause");
	return 0;
}

int test2(){return 10;}

void test3(int val)
{
	cout << "call by value 값 : "<< val + 20 << endl;
}

void test4(int& val)
{
	val += 50;
	cout << "call by reference 값 : "<< val << endl;
}

void test6(int val)
{
	cout << "정수형 호출 " << val << endl;
}

void test6(float val)
{
	cout << "실수형 호출 " << val << endl;
}

void test8(int val)
{
	cout << "test8 값" << val <<endl;
}

 

01_Function.h

더보기
#pragma once

//2. 반환값 있는 함수
int test2();

//3. call by value (값만 복사)
void test3(int val);

//4. call by reference (값 주소 복사)
void test4(int &val);

//6. 오버로딩
void test6(int val);
void test6(float val);

//7. In Line
inline void test7() { cout << "인 라인 함수"<<endl; };

//8. Default 함수
void test8(int val = 10);

1. cpp 선언 & void 형

함수 선언 방식은 2가지 형태로 cpp 안에서 함수 생성시 Main() 함수위에 몸체를 작성 하거나, 전방 선언 후 몸체는 아래 이미지 처럼 몸체를 구현을 해야 Main() 함수에서 호출이 가능 하다.


2. h 선언 & type형

test1() 함수와 반대로 헤더 파일에 해당 함수를 선언 하고 .cpp 에서 몸체를 정의 하는 형태

int 형식의 반환값 있는 형태의 함수를 선언을 하면 반드시 return에 선언한 타입 값을 반환 해야 한다.


3. call by value, call by reference

 

call by value : 값만 전달 하는 형식

call by reference : 값의 주소를 참조 하는 형식

이게 무슨 차이 냐면 call by value는 지역 변수 형태로 해당 함수에서 사용 후 사라지는 형태 이면 call by reference는 해당변수의 주소를 참조를 함으로서 변경시 참조 하고 있던 값도 같이 변경 하는 형태이다

 

실행

call by value형태의 함수 에선 20 + 20 한 값이 40이 되지만 main 함수에 있는 a 값이 영향이 없는걸 확인

call by reference형태의 함수 에선 20 +50 한 값이 70이 되고 main 함수에서도 a 값이 영향 받아 변경이 된걸 확인


5. 함수 포인터

함수도 각각의 주소를 가진 변수처럼 취급이 똑같고 함수 몸체의 선언은 참조 할려는 함수의 타입, parameter과 똑같이 선언 하고 포인터 변수 처럼 해당 함수를 대입 시켜 사용 하면 된다.


6. 오버로딩

오버 로딩 같은 경우는 같은 이름의 형태로 선언 하지만 받는 타입, parameter에 따라 호출이 달라진다.

 

실행

같은 이름으로 main 함수에 호출은 하지만 parameter값에 따라 호출 하는걸 확인


7. InLine

인라인 함수 같은 경우는 함수 앞에 붙여서 사용.

함수 호출 과정은 살짝 복잡한 과정을 통해서 호출을 한다면 인라인 선언된 함수는 해당 과정을 생략하고 사용 하는 형태 이지만 단점은 기존 복잡한 과정을 통해서 여러 이점을 포기한 빠른 실행 방법 이기에 코드는 짧게 작성 해야 좋다.


8. Default 인수

해당 함수의 parameter 선언시 특정 값을 안넣게 되면 선언된 값으로 자동으로 넣고 실행 하는 형태