/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 컴파일러는 해당 변수를 그냥 지역변수로 선언하게 된다.
재귀 호출은 추후 다시 공부하는 걸로....!