컴퓨터 구조/C, C++

[C/C++] 함수란

JiHxxn 2024. 7. 31. 18:29

 반환 타입 / 함수 이름 / 파라미터 or 인자 or 매개 변수
 void Render (*void);
  • TMI : C언어 시절엔 파라미터값이 없을 때 void를 꼭 넣어줘야 했음. 지금은 안 해도 됨.
void Render(int _iNum); -> **함수 선언**

int main()
{
	return 0;
}

void Render(int _iNum) -> **함수 정의**
{
	std::cout << _iNum << endl;
}
  • main 함수를 기준으로 위쪽으로는 선언(변수 만들듯 세미 콜론으로 종결), 아래쪽으로는 구현
  • 컴퓨터 입장에서 함수의 이름은 함수의 메모리 공간의 첫 번째 주소로 인식한다.
  • () = 함수 호출 연산자

💈 함수 형태 4가지

  • 파라미터 : void 반환 : void
  • 파라미터 : 자료형 반환 : void
  • 파라미터 : void 반환 : 자료형(return)
  • 파라미터 : 자료형 반환 : 자료형(return)
void Render(int _iNum);
int GetNumber();

int main()
{
	Render(GetNum());
	return 0;
}
  • 함수 파라미터에 함수를 넣을 수 있다.
    • 매개 변수로 넣은 함수의 반환 값이 전달할 함수에 파라미터 자료형과 같다면 가능하다.
    • 함수에 매개 변수를 넣다(x) 전달한다(o)

call by value

  • 함수에 파라미터 값으로 변수를 보내거나, 리턴으로 변수의 값을 받는 경우
    • ⭐ 값 복사가 이루어진다.
  • 지역 변수를 리턴 시키면 임시 메모리(stack) 공간에 리턴 값이 저장됨.
    • 그 후 다음 라인으로 개행 시 메모리가 해제된다.
  • (포인터나 레퍼런스를 사용하지 않는 이상)매개 변수를 통해서, 반환을 통해서, 값 복사를 한다.

함수의 지향점

  • 함수는 여러 개의 기능을 한번에 가지고 있으면 안 된다.
    • 연산, 입력, 출력 등 따로따로 만들어야 된다.
  • 함수는 하나의 데이터만 입력받고 가공한다.

전역 변수

  • 지역 변수는 함수가 종료되면 메모리가 소멸되지만 데이터 영역은 프로그램이 종료될 때 소멸되기 때문에 전역 변수로 함수끼리 공유할 수 있다.
    • 파일 하나에서 전역적으로 사용이 가능하다.
  • static 키워드가 들어가 있는 것과 같다. static 변수와 구분 짓기 위해 쓰지 않는다.
  • 함수 외부에서 접근 가능한 정적 변수

정적 변수(static)

  • 메모리 data영역에 할당.
  • static 변수가 초기화되고 있는 함수를 여러 번 반복해 호출해도 static 변수는 한 번만 초기화된다.
  • 함수 안의 지역 변수지만 data영역에 할당되기 때문에 값이 계속 저장되어 사용이 가능하다.
  • 함수 내부에서 접근 가능한 정적 변수(C++ 기준)

함수 오버로딩

  • 함수 문법이다.
  • 이름이 같다는 전제로 아래 규칙에 해당되어야 함.
    • 파라미터의 개수와 자료형에 따라 호출될지 결정
int Add(int _iA, int _iB);
int Add(int _iA, int _iB, int _iC = 10);
  • 함수의 매개 변수가 default 값으로 세팅되어 있고, 또 하나는 매개 변수가 없는 함수일 때, 어떤 함수를 작동할지 모호하기 때문에 작동하지 않는다.

dafault 매개 변수

  • 같은 파라미터를 반복해서 넣을 가능성이 높을 때 사용한다.
    • 이유는 파라미터로 값을 전달할 때 값 복사가 이루어지기 때문에 안에서 초기화해주는 형태보다 메모리가 절약되기 때문이다.
  • 매개 변수의 값을 초기화해서 변수를 넣어주지 않고, 함수를 호출할 때 초기화된 값으로 기능이 실행된다.
  • 선언에만 초기화를 해주고, 정의에선 매개 변수만 입력해 준다. 이유는 선언에 초기화를 한번 해주는 걸로 초기화가 되기 때문에 두 번 초기화를 해준다는 의미와 같기 때문.(불가능함)
  • 필수 규칙 : 매개 변수의 개수가 2개 이상일 때, 마지막(맨 오른쪽) 매개 변수부터 default 설정해준다.

재귀 함수

void LevelDown()
{
  	static int iLevel(100);
  	--iLevel;
	cout << iLevel << endl;
	
	LevelDown(); -> 자기 자신을 호출
}
  • 함수가 자기 자신을 호출하는 행위.
  • 더 이상 쪼갤 수 없을 때까지 돌려라(이진 탐색)
  • 만약 재귀 함수로 기능이 잘 작동하도록 만들었을지라도, 반드시 반복문으로 코드 리팩토링 시켜주자.(*함수 테이블 사용 원리 때문)

재귀 함수 원칙

void LevelDown()
{
	static int iLevel(100);
	
	if(0 >= iLevel)
	return;
  
  	--iLevel;
	cout << iLevel << endl;
	
	LevelDown(); -> 자기 자신을 호출
}
  1. 탈출할 수 있는 조건을 걸어준다.
    • 걸어주지 않으면 무한 루프(stack over flow)에 걸려버린다.
  2. 감소하는 조건을 전제로 재귀 함수를 사용한다.
    • 코드는 작동되겠지만, 암묵적인 규칙에 위배된다.

함수 테이블

  • 함수가 만들어질 때 함수 테이블이 만들어진다.
  • 함수 테이블을 가져와서 재사용하는 구조.
  • 재귀함수는 가져와서 재사용하는 구조가 아닌, 새로 계속 생성하는 구조이다.
  • 할애해주는 메모리는 1MB이다.

순차 탐색

  • 한 방향으로 처음부터 끝까지 탐색한다.
  • 모든 내용을 메모리에 저장하고 진행해야 한다.

이진 탐색

  • 이진수의 이진(바이너리 서치)
  • 중간으로 자르고 잘라 탐색한다.
  • 쪼개고, 쪼갠 후 메모리에 저장하고 진행하여 나간다.
  • 반으로 쪼개고, 쪼개는 같은 행동을 반복할 때, 재귀함수를 사용한다.

C++, C# Static 변수 공통점과 차이점

  • 공통점
    • data영역에 저장되어 프로그램이 종료될 때까지 해제되지 않는다. 차이점
  • 차이점
    • C# : 함수 내부의 static 변수 자체가 없다.
      • 클래스에 종속되며 클래스의 모든 인스턴스가 공유한다.
    • C++ : 함수 내부의 static 변수는 함수가 호출될 때마다 새로 생성되지 않고, 값을 유지한다.
      • 파일 스코프 static 변수는 해당 파일에서만 접근이 가능한 전역 변수이다.

'컴퓨터 구조 > C, C++' 카테고리의 다른 글

다중 포인터란  (0) 2024.08.16
구조체 크기 계산법 및 최적화  (0) 2024.08.12
const와 포인터  (0) 2024.08.09
[C/C++]포인터 기초  (0) 2024.08.04
[C/C++] 분기문  (1) 2024.07.24