티스토리 뷰

프로그래밍 언어/C++

함수 기본 ( C++ )

거북이의 기술블로그 2024. 7. 1. 12:50
1. 함수 형식                    
2. 함수 오버로딩             
3. 함수 호출 스택            

 

 

함수 형식

[반환값] [함수이름] ( [ 인자값 ], ... )  
{
    
    [ 함수 몸체 ]    
    
    return [반환값];

}
  • 반환값 : int, double, string, 클래스 등.. , 함수의 계산 결과에 따른 결과값 반환
  • 함수이름 : 함수의 이름 ( 같은 함수를 재정의 하려면, 오버라이딩 혹은 오버로딩을 해야함 )
    • 오버로딩 : 서로다른 인자를 가진 같은 이름을 가진 함수
    • 오버라이딩 : 상위 클래스 존재하며, 해당 클래스의 함수를 재정의 ( 함수이름, 인자 동일 -> 함수 본체 내용만 다름 )
  • 인자값 : int, double, string, 클래스, 포인터, 참조 등.. , 함수 본체에서 사용될 값을 호출을 받은 부분에서 값을 받는 역할

 

함수 오버로딩

  • 함수 이름이 같아야한다. 
  • 인자 개수가 달라야한다. ( 만약 같을경우, 자료형이 달라야함 )
  • + 반환값 형태의 경우 영향 없음 (같아도 되고, 달라도 됨)
// 1. Test (int, int) 함수 기준
int Test(int number1, int number2)
{
    number1 = 5;
    number2 = -5;

    return number1 + number2;
}

// 2. int -> double 자료형 변환
double Test(double number1, int number2)
{
    number1 = 2;
    number2 = 2;
    return number1 + number2;

}

// 3. 인자의 순서가 다름 ( <double,int> -> <int, double> )
double Test(int number1, double number2)
{
    number1 = 4;
    number2 = 4;
    return number1 + number2;

}


// 안되는 경우
// 1. 자료형으로 나뉘므로 참조값은 관계없다.
/*
int Test(int& number1, int& number2)
{
    number1 = 5;
    number2 = -5;

    return number1 + number2;
}
*/

//2. 반환값의 경우 오버로딩과는 무관하다
/*
double Test(int number1, int number2)
{
    number1 = 5;
    number2 = -5;

    return number1 + number2;
}
*/

 

 

함수 호출 스택

  • Stack 메모리의 경우, 함수 호출과 관련된 지역변수와 매개변수가 저장되는 영역
  • LIFO(Last In First Out) 구조를 가짐
메모리 주소 영역 구조 내용
높은 주소 RAM 스택영역 컴파일시(기계어 코드로 변환)에 크기가 결정됨
- 함수와 관련된 지역변수, 매개변수 저장되는 영역
( main() 함수도 포함됨 )
~ 힙영역 런타임시(프로그램 구동시) 크기가 결정됨
BSS 초기화 하지 않은 변수
Data 초기화되어있는 변수
ROM 데이터영역 전역변수, 정적변수(static)
낮은 주소 코드영역 ( = 텍스트 영역) 실행할 프로그램의 코드 내용

 

  • LIFO 구조에 따라,  마지막에 불린 Func3 -> Func2 -> Func1 순으로 스택에서 제거됨
  • Func3(){}의 result 지역변수의 경우 해당 {} ("중괄호") 내부에서만 사용가능한 변수
    • (함수스택이 제거될경우 해당 지역변수도 사라짐)
#include <iostream>
using namespace std;

void Func3()
{
	int result = 10; // 해당 result라는 변수는 Func3() {}안에서만 유효함

    cout << "F3" << endl;
    cout << "Finish" << endl;
}

void Func2()
{
    cout << "F2" << endl;
    Func3();

}
void Func1()
{

    cout << "F1" << endl;
    Func2();
}

int main()
{
	Func1();
    
    return 0;
}

함수 호출 스택

 

함수 스택 오버플로우

  • 스택의 크기의 경우, 한계가 있기에 너무 많은 함수가 호출되고, 제거되지 않는다면 오버플로우가 발생함
  • 전형적으로, 재귀함수의 경우 오버플로우가 빈번하게 발생할 수 있음
#include <iostream>
using namespace std;

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

    return num * Factorial(num-1);
}



int main()
{
    Factorial(1000); // 스택 오버플로우 발생
    return 0;
}

스택 오버플로우

 

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

참조(&) 기초  (0) 2024.07.01
포인터 기초  (0) 2024.07.01
enum  (0) 2024.06.21
Define( + inline , constexpr)  (0) 2024.06.21
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함