함수에 대하여!
함수의 존재 이유
함수를 하나의 기능으로 취급이 가능합니다.
그 기능이 여러부분에서 필요하다면 함수가 없다면
매번 그 기능을 구현해야하는 불편함이 있습니다.
그러하기에 함수로 그 기능을 묶어서 사용하면
함수를 부르는 행위로 그 기능을 수행할 수 있게 됩니다!
함수는 한가지 기능으로만 만드는게 좋다
여러가지 기능을 하나의 함수에 다쑤셔넣으면 그 일부의 기능만
사용하고 싶을때 다시 함수를 쪼개야하기 때문에 기능 단위로
만드는 것이 프로그래밍을 할때 유리합니다!
함수의 구조
밑에 그림처럼 함수는 반환형태 / 함수이름 / 입력형태 / 함수의 몸체의
구조로 이루어져 있습니다.
함수명은 대문자로 시작해야 하며 함수명을 왠만하면 함수의 기능을 의미하는
동사의 형태로 짓는게 좋습니다.
함수는 입력과 출력도 반환해줍니다.
return문은 함수에서 값을 반환하는 것과 함수의 종료의 기능이 있다.
F12 : 정의되어 있는 함수 호출
함수의 구분
- 유형 1: 전달인자 O / 반환 값 O
- 유형 2: 전달인자 O / 반환 값 X
- 유형 3: 전달인자 X / 반환 값 O
- 유형 4: 전달인자 X / 반환 값 X
함수의 정의와 선언
main()함수 위에서 선언을 하지 않고 아래에서 선언을 하면
main()함수에서 그 함수를 실행하는 순간에 에러가 발생한다.
컴파일이 위에서 아래로 진행이 되기에 함수의 배치 순서는 중요하다. 컴파일 되지 않은
함수는 호출이 불가능하다. 이후에 등장하는 함수에 대한 정보를 컴파일러에게 제공해서
이후에 등장하는 함수의 구현부를 컴파일 가능하게 도울 수 있습니다.
main()함수 위에서 선언을 하고 그 밑에서 구현부를 작성하는게 좋은 예시이다.
main()함수 위에서 선언과 구현부를 같이 작성해도 정상적으로 작동한다.
헤더 파일 또한 선언부로, 해당 헤더에 있는 소스코드는 구현부로 라고 생각할 수 있습니다.
아래의 코드처럼 선언부에 인자 타입부분만 써도 됩니다.
void Func(int numX, int); // 선언부
int main()
{
Func();
}
int Func(int num1, int num2) // 구현부
{
printf("Hello");
return num1 + num2;
}
전역변수 지역변수 static변수
변수는 어디에 위치하는지 키워드가 붙는지에 따라서
전역인지 지역인지 static변수인지 알 수 있습니다.
전역변수 지역변수 static변수의 차이점
- 메모리에 언제 올라가고 언제 내려가냐?
- 어디에서 접근 가능하냐?
지역변수란?
지역변수는 함수 내에서 선언되는 것이 지역변수입니다.
지역변수 특징
- 프로그래밍을 하면서 지역변수를 많이 사용하게 됩니다.
- 지역변수는 함수 내에서만 사용과 접근이 가능합니다.
- 한 지역 내에 동일한 이름의 변수를 중복 선언이 불가능합니다.
- 하지만 다른 지역에 동일한 이름 변수는 선언 가능합니다.
- 해당 지역을 빠져나가면 지역변수 소멸 / 메모리 해제
지역변수는 스택 메모리 영역에 할당되어서 해당 변수가 있는
함수(코드블럭)가 종료될 때 메모리가 해제 됩니다.
스택 메모리는 해당 변수가 있는 함수(코드블럭)가 종료될 때 메모리가
해제가 됩니다. 그러한 이유로 외부에서는 이 변수를 이용할 수 없습니다.
지역변수는 호출될 때마다 새롭게 할당됩니다.
1. 지역변수는 외부에서 선언된 동일한 이름의 변수를 가린다.(선언은 되지만 헷갈리니 지양하자)
2. 지역변수와 전역변수의 이름이 같을때 지역에서 쓸때는 지역변수가 사용되며 그 지역을 벗어나면
전역변수를 사용한다.
예 ) 반복문 안에서 선언하는 변수들
예 ) main이 아닌 다른 함수에서 선언하는 변수들
매개변수도 지역변수다.
매개변수는 함수에 입력값을 의미한다.
들여쓰기로 판단하기 쉽다
전역변수
전역변수는 함수 외부에 선언된다.
프로그램의 시작과 동시에 메모리 공간에 할당되어 종료시 까지 존재
전역변수는 프로그램 전체 영역 어디서든 접근이 가능하다
별도의 값으로 초기화하지 않으면 0으로 초기화한다.
지역변수의 이름이 전역변수의 이름을 가린다.
전역변수는 많이 쓰면 좋지 않다.
전역변수는 프로그램 전체에서 접근이 가능하기에 전체 프로그램의 변경으로 이어질 수 있기에
전역변수에 의존적인 코드는 프로그램 전체 영역에서 찾아야 한다. 수정이 용이하지 않다.
static 변수
static 붙은 애들은 프로그램 시작할때 메모리에 올라가고 끝날때 해제된다.
지역변수에 붙은 static은 선언된 함수 내에서만 접근이 가능한 지역변수의 특성과
딱 1회 초기화되고 프로그램 종료시 까지 메모리 공간에 존재하는 전역변수의 특성을
같이 가지고 있습니다.
전역변수, 지역변수, static변수 필요한 이유
전역변수가 필요한 이유
선언된 변수가 함수 밖에서도 계속 사용할 필요가 있을때
지역변수가 필요한 이유
- 함수내에서만 활용할 변수가 필요할 때
- 필요할 때만 메모리가 사용된다
- 메모리의 빠른 순환
함수밖에서도 사용하기 위해 계속 메모리 공간에 존재하는 변수
- 전역변수
- static 지역변수
static지역변수를 쓰는 이유
- 전역변수처럼 쓰고 싶지만 접근을 제한하고 싶을때 사용됩니다.
- static 지역변수는 접근의 범위가 전역변수보다 훨씬 좁기 때문에 안정적이다.(전역변수의 단점을 최소화)
- static 지역변수를 사용하여 전역변수의 선언을 최소화하자.
레지스터(register) 변수
레지스터는 힌트를 제공하는 키워드입니다.
컴파일러는 이를 무시하기도 한다.
레지스터는 CPU내부에 존재하기에 접근이 가장 빠른 메모리 장치입니다.
레지스터 변수를 사용하는 이유는 빈번히 사용하는 메모리를 가장
접근이 빠른 레지스터에 저장하므로 성능향상에 도움이 됩니다.
레지스터변수는 이런게 있다고 이해만 하고 넘어갑시다!
이미지 출처 : 윤성우의 열혈 C 프로그래밍