C++ - 함수, 재귀함수

이강민·2023년 8월 19일

C++

목록 보기
6/22
post-thumbnail

함수

함수를 설명하기 전 컴퓨터의 메모리 구조에 대해 간략하게 살펴보자
메모리는 다음과 같은 구조로 되어있다.

여기서 메모리는 컴퓨터의 주기억장치에 해당이 된다.
cpu에 작업처리명령(프로그램 실행)을 하게 되면 프로세스의 작업 우선순위에 따라 프로그램이 실행이 되고 주기억장치에 위 그림처럼 각각의 영역에 할당된다. 코드가 컴파일러에 의해 컴파일 되면서 코드에 따라 각 영역에 할당된다. 이 때 스택은 cpu의 스택 포인터 레지스터에 의해 주소가 참조되어 처리된다.

실행되는 함수는 스택영역에서 동작하게 된다.
다음 코드가 실행됨에 따른 스택영역의 동작을 그림으로 추상하면 다음과 같다.

int Add(int num1, int num2){
	return num1 + num2;
}
int main(){
	print("%d", Add(2,3))
    return 0; 
}

함수 사용 시 함수 내부에서 사용되는 변수들은 지역변수로써 만약 변수를 찾지 못하면 전역변수나 정적변수에서 찾아서 사용하고 그래도 없으면 컴파일 오류를 리턴한다.

재귀함수

재귀 함수는 자기 자신을 호출하는 함수로 그림으로 추상화 하면 다음과 같다.

int Factorial_Re(int num) {
	if (num == 1) {
		return 1;
	}
	return num * Factorial_Re(num - 1);
}
int main() {
	int result = Factorial_Re(4)
	printf("재귀함수 팩토리얼 결과 : %d\n", result);
	return 0;
}



함수호출이 끝나면 스택영역에서 해제되고 main 함수에서 선언한 result에 그 결과가 저장된다.
main함수도 프로그램이 종료되면 스택영역에서 해제된다.

재귀함수를 사용하는 이유는 가독성과 구현이 용이하다는 장점이 있으나 자칫 잘못 구현을 하게된다면 스택오버플로우 문제나 성능에 문제가 생길 수가 있으니 사용 시 충분한 고려를 하여야 한다.

위 팩토리얼 함수는 int형의 특징을 잘 볼 수 있다.
int형은 4byte로써 32bit를 가지며 2진수를 10진수로 표현 가능한 수는 unsigned의 경우 4,294,967,296 수를 표현할 수 있다.
따라서 팩토리얼 13은 6,227,020,800로 32bit로 표현 할 수 있는 수를 넘어버려서 표현하지 못하게 된다. 따라서 팩토리얼 12인 479,001,600까지 표현 할 수 있다.
만약 더 큰 수를 표현 하고 싶다면 long long 타입으로 8byte 64bit가 필요하다.

profile
AllTimeDevelop

0개의 댓글