본문 바로가기
C++/기초

C++ 기초 : 함수 (2)

글: 시플마 2024. 2. 25.

우리는 기본적으로 main 함수 안에 

명령어를 입력합니다.

 

이 main 함수 안에는 다른 함수가 추가적으로 호출될 수 있습니다.

 

이 호출된 함수를 A 함수라고 하였을 때,

A 함수 안에는 B라는 함수를 또 호출할 수도 있죠.

 

 

이렇게 구성된 함수들의 작동 순서를 살펴보면,

 

main 함수에서 A 함수를 호출하면 A 함수로 갑니다.

 

A 함수 안에 코드를 실행하다가

B 함수를 만나면 B 함수로 가서

B 함수 안 코드를 실행하고 B 함수를 종료합니다.

 

다시 A 함수로 돌아와서 A 함수 안 나머지 코드를 실행하고 종료합니다.

 

그리고 다시 main 함수로 돌아와서 main 함수의 나머지 코드를 실행하게 됩니다.

 

 

그림으로 표현하면 처음 호출할 때는 아래와 같이 작동하고,

main 함수

             

                    ↓ (호출)

A 함수

             

                     ↓ (호출)

B 함수

 

 

가장 나중에 호출한 함수를 먼저 종료하면서 

다시 가장 먼저 호출한 함수로 돌아옵니다.

main 함수

             

                    ↑ (종료)

A 함수

             

                     ↑ (종료)

B 함수

 

 

가장 나중에 호출한 함수가 먼저 종료되고

가장 먼저 호출한 함수가 마지막에 종료됩니다.

 

즉 후입선출(선입후출) 방식으로 작동하는 것이죠.

 

 

자료구조(Data Structure)에서

이러한 후입선출(선입후출) 방식을 "스택(Stack)"이라고 합니다.

 

함수는 후입선출(선입후출) 방식으로 작동하기 때문에

함수가 사용하는 메모리 공간을 스택 메모리 영역이라고 하는 이유입니다.

 

 

반대로 자료구조에서 선입선출(후입후출) 방식을 "큐(Queue)"라고 합니다.

 

 

 

 

 

 


 

 

 

 

 

 

 

컴파일을 하면 컴파일러가 명령어들을 실행하기 전에 

명령어에 사용될 메모리 공간을 미리 잡아 놓습니다.

 

 

아래와 같은 코드를 실행하려고 한다고 합시다.

 

컴파일러는 위 코드를 실행하기 전에,

스택 메모리 영역에 main 함수가 들어갈 공간과 

변수 iData의 공간을 미리 잡아 놓을 것입니다.

 

 

 

아래 그림처럼 말이죠.

 

 

 

 

그리고 int iData = Add(100, 200); 가 실행되면

 

Add 함수와 변수 num1, num2이 들어갈 공간을 확보할 것입니다.

int형 변수 두 개이므로 4byte + 4byte, 총 8byte의 공간을 잡아 놓겠네요.

 

 

그리고 main 함수로부터 넘겨받은 100과 200이 각각,

 

확보한 num1과 num2 자리에 들어가겠죠.

 

 

이후 num1과 num2를 더한 300이라는 값을

 

main 함수에 반환합니다.

 

 

그러면 main 함수의 변수 iData에는 300이 대입되고,

Add 함수는 메모리 영역에서 사라집니다.

 

 

 

그리고 다시 main 함수로 돌아가,

그 다음 줄에 있는 명령인 iData = Add(111, 222); 을 실행하며 

위와 같은 과정을 반복할 것입니다.

 

Add 함수는 호출되는 순간, 스택 메모리 영역에 할당되고

Add 함수가 종료되는 순간, 스택 메모리 영역에 제거됩니다.

 

호출될 때마다 할당되고, 사라지고를 반복하는 것이죠.

 

 

 

 


 

 

 

 

 

여기서 명심할 점은

우리가 코드에 써 놓았다고 해서 실제 메모리에 할당되었다는 것은 아닙니다.

 

Add 함수 같은 경우도 보면

코드에는 작성해 놨지만 항상 존재하는 것이 아니며,

호출될 때만 생성되었다가 값을 반환하면 메모리에서 사라지는 것처럼 말이죠.

 

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB