학습 기록/C

(5) 함수

romi__ 2024. 11. 9. 19:35

/C

 

📌 C언어 함수

- 함수란 하나의 특별한 목적이 있는 작업을 수행하기 위해 독립적으로 설계된 프로그램 코드의 집합이다. 표준함수, 사용자 정의 함수가 있다. 함수를 사용함으로써 반복적인 프로그래밍을 피하고 코드의 가독성을 높일 수 있다. 이 점은 유지/보수에도 유리하다.

 

- 함수의 정의

int sum (x, y)
{
	//명령문
}

 

반환 타입: 함수의 결과로 반환할 타입을 지정한다. 위의 예시에서는 int이다.

함수 이름: 함수를 호출할 수 있는 이름이다. 위의 예시에서는 sum

매개변수 목록: 함수 호출 시 전달되는 인수의 값을 저장할 변수들을 의미한다. 여러 인수를 전달할 수 있지만 반환값은 0개이거나 1개뿐이다. 위의 예시에서는 (x, y)

함수 몸체: 함수에서 수행할 명령문을 의미한다. 중괄호 부분

 

#include <stdio.h>

int bigNum(int num01, int num02)		// 함수의 정의
{
	if (num01 >= num02)
	{
		return num01;
	}
	else
	{
		return num02;
	}
}

int main(void)
{
	int result;

	result = bigNum(3, 5);	// 함수의 호출
	printf("두 수 중 더 큰수는 %d입니다.\n", result);
	result = bigNum(3, 1);	// 함수의 호출
	printf("두 수 중 더 큰수는 %d입니다.\n", result);
	result = bigNum(7, 5);	// 함수의 호출
	printf("두 수 중 더 큰수는 %d입니다.\n", result);
	return 0;
}

 

입력받은 두 개의 정수 중에서 어떤 수가 더 큰지 판별해주는 함수를 예로 들어볼 수 있다. 반환 타입은 Int, 함수의 이름은 bigNum이며 매개변수로 정수 num01과 num02를 받는다.

 

 

 

📌 변수의 유효 범위

- 변수는 선언 위치에 따라 유효 범위, 메모리 반환 시기, 초기화 여부, 저장되는 장소 등이 변경된다. 지역변수, 전역변수, 정적변수, 레지스터 변수가 있다.

 

- 지역변수: 블록 내에서 선언된 변수를 의미한다. 블록이 종료되면 메모리에서 사라진다. 스택 영역에 저장되며, 매개변수도 지역변수의 한 종류이다.

#include <stdio.h>

void local(void);

int main(void)
{
	int i = 5;
	int var = 10;
	printf("main() 함수 내의 지역 변수 var의 값은 %d입니다.\n", var);

	if (i < 10) {
		local();
		int var = 30;
		printf("if 문 내의 지역 변수 var의 값은 %d입니다.\n", var);
	}

	printf("현재 지역 변수 var의 값은 %d입니다.\n", var);
	return 0;
}

void local(void)
{
	int var = 20;
	printf("local() 함수 내의 지역 변수 var의 값은 %d입니다.\n", var);
}

//main() 함수 내의 지역 변수 var의 값은 10입니다.
//local() 함수 내의 지역 변수 var의 값은 20입니다.
//if 문 내의 지역 변수 var의 값은 30입니다.
//현재 지역 변수 var의 값은 10입니다.

 

위의 예시 코드에서 사용된 변수 var는 모두 다른 블록 안에서 정의되었으며, 다른 값을 가진다. (바람직하지 못한 변수 활용 방식)

 

- 전역 변수: 함수 외부에서 선언된 변수이다. 프로그램 어디서나 접근이 가능하고, 프로그램 종료시 메모리에서 사라진다. 데이터 영역에 저장된다.

 

#include <stdio.h>

void local(void);

int var; // 전역 변수 선언 

int main(void)
{
	printf("전역 변수 var의 초기값은 %d입니다.\n", var);
	
	int i = 5;
	int var = 10; // 지역 변수 선언 
	printf("main() 함수 내의 지역 변수 var의 값은 %d입니다.\n", var);
	
	if (i < 10)
	{
		local();
		printf("현재 변수 var의 값은 %d입니다.\n", var); // 지역 변수에 접근 
	}
	
	printf("더 이상 main() 함수에서는 전역 변수 var에 접근할 수가 없습니다.\n");
	return 0;
}

void local(void)
{
	var = 20; // 전역 변수의 값 변경
	printf("local() 함수 내에서 접근한 전역 변수 var의 값은 %d입니다.\n", var);
}

//전역 변수 var의 초기값은 0입니다.
//main() 함수 내의 지역 변수 var의 값은 10입니다.
//local() 함수 내에서 접근한 전역 변수 var의 값은 20입니다.
//현재 변수 var의 값은 10입니다.
//더 이상 main() 함수에서는 전역 변수 var에 접근할 수가 없습니다.

 

전역 변수는 따로 초기화해주지 않더라도 초기값이 0으로 자동 초기화된다. 또한, 전역변수 var와 같은 이름의 지역 변수가 함수 안에서 선언된 것을 볼 수 있다. 이 이후로는 해당 함수 내에서 전역 변수 var에 접근할 수 없다. 블록 내에서 선언된 지역 변수는 같은 이름의 전역 변수를 덮어쓰기 때문이다. 때문에 전역 변수와 같은 이름으로 지역 변수를 지정하는 것은 좋은 생각이 아니다.

 

 

- 정적 변수: static 키워드로 선언한 변수를 의미한다. 지역 변수와 전역 변수의 특징을 모두 갖게 되는데, 전역 변수처럼 단 한 번 최초 실행 시에만 초기화되며, 프로그램이 종료되어야 메모리상에서 사라진다. 지역 변수처럼 해당 함수 내에서만 접근할 수 있다.

#include <stdio.h>

void local(void);
void staticVar(void);

int main(void)
{
	int i;

	for (i = 0; i < 3; i++)
	{
		local();
		staticVar();
	}

	return 0;
}

void local(void)
{
	int count = 1;
	printf("local() 함수가 %d 번째 호출되었습니다.\n", count);
	count++;
}

void staticVar(void)
{
	static int static_count = 1;
	printf("staticVar() 함수가 %d 번째 호출되었습니다.\n", static_count);
	static_count++;
}

//local() 함수가 1 번째 호출되었습니다.
//staticVar() 함수가 1 번째 호출되었습니다.
//local() 함수가 1 번째 호출되었습니다.
//staticVar() 함수가 2 번째 호출되었습니다.
//local() 함수가 1 번째 호출되었습니다.
//staticVar() 함수가 3 번째 호출되었습니다.

 

 

 

- 레지스터 변수: 지역 변수를 선언할 때 register 키워드를 붙여 선언한 변수를 의미한다. 이렇게 선언된 레지스터 변수는 CPU의 레지스터(register) 메모리에 저장되어 빠르게 접근할 수 있다. 컴퓨터의 레지스터는 매우 작은 크기의 메모리이므로, 이 영역에 변수를 선언하기 힘든 경우도 많은데 이때 C 컴파일러는 해당 변수를 그냥 지역변수로 선언하게 된다.

 

 

재귀 호출은 추후 다시 공부하는 걸로....!

'학습 기록 > C' 카테고리의 다른 글

(7) 포인터  (0) 2024.11.11
(6) 배열  (0) 2024.11.10
(4) 제어문  (0) 2024.11.08
(3) 연산자  (0) 2024.11.07
(2) 타입  (1) 2024.11.06