더듬이의 헬로월드

Hello, World!

프로그래밍 언어/C++ [기본]

[C++기본] 7.함수

더듬이 2021. 8. 25. 16:26
728x90

함수란?

프로그램의 정체는 바로 함수의 호출의 모임이다.

C++에서는 기본적으로 가장 먼저 main함수가 호출된다.

즉, main 함수가 종료되는 시점이 프로그램이 종료되는 시점이 된다.

함수는 특정 작업을 반복하는 것을 줄이기 위해 만들어진 공정이다!

⇒여러 함수들이 얽혀서 프로그램이 완성되는 것이다.

함수 안에 함수가 있는 경우에는 차례차례 진행되며 맨 마지막의 함수가 종료되어야

그전 함수가 종료, 또 그 전 한수의 종료, 결국에는 main함수가 종료되게 된다.

마치 STACK과 비슷한 자료구조이다.


함수가 사용하는 메모리 공간

함수가 사용하는 메모리의 영역을 "스택 메모리" 라고 한다.

#include <iostream>
using namespace std;

int Add(int a, int b) {
    return a + b;
}

int main()
{
    int a=500;
    int data = Add(a, 300);
    cout << data << endl;
}

함수가 리턴될 떄 값들은 레지스터 메모리에 임시 저장되고, 함수는 메모리 영역에서 해제된다.

위 코드의 경우를 생각해보자.

먼저, main함수가 쓸 메모리를 모두 계산하고

처음에는 main함수의 메모리가 스택 메모리에 할당된다.

다음, Add함수가 호출 되면 다시 Add의 메모리가 할당되고,

Add함수가 끝나면 스택 메모리에서 해제된다.

함수 호출 순서에 따라 차례차례 메모리에 할당되는 것이다.

그럼, main함수 안에 있는 a변수와 Add함수 안에 있는 a변수는 같은 변수일까?

⇒결론은 아니다. 각 함수에 따라 스택 메모리가 다르게 할당되기 떄문에 영역이 달라서

다른 변수로 취급된다.

즉, 코드 영역와 메모리 영역은 다르게 취급된다.

⇒코드는 명령어의 모임이고, 명령어를 통해 메모리 영역에서 연산이 실행되는 것!


함수 형식과 반환값

http://tcpschool.com/lectures/img_c_function_structure.png

반환해주는 값이 있다면 return문을 반드시 작성해야만 한다.

만일 반환값이 없는 함수라면 반환 자료형 공간에 void를 적어주면 된다.

int Add(int a, int b) {
    int c = a + b;
    return c;
}

매개변수와 반환값이 있는 함수

void Show(){
    cout << "Hello World" << endl;
}

매개변수와 반환값이 없는 함수


재귀 함수와 반복문

만약 팩토리얼 계산을 위해서는 어떤 로직을 짜야할까??

팩토리얼의 특징은 수가 하나씩 늘어나고, 줄어듬에 따라 원래 수와 계속 곱하는 것이다.

이를 반복문으로 작성한다면

int result = 1;
    for (int i = 1; i <=10; i++)
    {
        result *= i;
    }
    cout << result << endl;

이런 식으로 작성 할 수 있는 것이다.

하지만 이를 함수로 작성해보면 어떨까?

반복문처럼 자기 자신을 계속 반복하는 함수를 재귀함수라고 한다.

int Factorial(int num){
    if (num == 1) return 1;

    return num * Factorial(num - 1);
}

int main()
{
    cout << Factorial(10) << endl;
}

호출 스택은 이렇게 구성된다!

팩토리얼 5는 팩토리얼4 와 5을 곱한 것과 마찬가지이다.

이 재귀함수를 계속해서 아래 수의 팩토리얼을 구하고, 마지막에 1이 되면 1을 반활하면서

다시 반대로 호출스택이 종료된다.

Factorial이 자신 자신을 계속 호출하며 값을 계산하는 것이다


 

스택 메모리가 한계치를 도달한다면??

⇒Stack OverFlow

재귀함수를 사용할 때 자주 일어나는 오류이다.

무한 루프에 빠지지 않도록 조심해서 사용해야 한다.

재귀함수는 가독성이 좋고, 구현이 용이하지만, 속도가 느리다는 단점이 있다.

728x90

'프로그래밍 언어 > C++ [기본]' 카테고리의 다른 글

[C++기본] 9.구조체  (0) 2021.08.26
[C++기본] 8.배열  (0) 2021.08.25
[C++기본] 6.변수  (0) 2021.08.25
[C++기본] 5.반복문  (0) 2021.08.25
[C++기본] 4.조건문과 삼항연산자  (0) 2021.08.24