함수
C언어는 함수가 기본단위인 언어이다. 함수는 프로그램에서 자주 수행될 동작을 미리 정의하고 재사용 가능하게 해줌으로써 전체 생산성을 향상시킨다.
함수의 구조
반환자료형 함수이름 ( 매개변수 ) { return 반환값; }
1. 반환 자료형 : 함수가 어떤 연산의 결과로 값을 반환한다면, 반환하는 값의 자료형
2. 함수 이름 : 프로그램 내에서 함수를 식별할 수 있는 이름
3. 매개변수 : 함수가 연산을 실행하기 위해 입력값이 필요할 때, 그 입력받는 값을 의미한다. 자료형과 함께 별명을 지정해주어야 한다.
4. 몸체 : 함수가 호출되었을 때 실제로 수행할 작업들이 정의된 블록 {}.
5. 반환값 : 함수가 몸체의 작업들을 모두 수행하고, 연산의 결과로써 시스템에 반환하고자 하는 값이 있다면 return 키워드를 이용하여 표현식 내지는 값을 반환한다.
*함수의 이름은 결코 생략할 수 없다.
함수의 시작주소와 실제로 인수로 전달받은 대상은 스택 메모리에서 저장되고, 따라서 함수를 벗어나면 메모리가 반환된다.
함수의 선언
C언어는 프로그램이 실행되면 main함수부터 메모리에 올려 위에서부터 아래로 읽어들인다. 컴파일러마저도 기본적으로 단일패스 컴파일은 진행하기 때문에 함수가 어디에 선언되어 있는가는 C언어에서 굉장히 중요한 문제이다.
대부분 사용하는 VScode는 다중패스 방식을 지원하는 컴파일러로, 알 수 없는 식별자(ex. 함수명)가 나와도 우선 에러를 발생시키지 않고 남은 소스코드를 훑어 알 수 없는 식별자가 정의된 내용이 있는지 찾는다. 그러나 공식적으로 C99의 표준사양은 단일 패스이므로 컴파일러가 앞선 곳에서 식별자의 존재여부를 알 수 없다면 컴파일 에러가 발생한다.
그렇기 때문에 함수의 구체적인 구현부를 main함수 밑에 두고 싶다면, 함수의 원형을 main함수 앞에서 선언해야 한다.
스택프레임
스택 메모리 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다. 스택 영역은 함수의 호출ㄹ과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장된다. 이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임이라고 한다.
스택 프레임을 통해 호출 스택이 관리되기 때문에, C 프로그램상에서 함수의 호출이 모두 끝난 뒤에 해당 함수가 호출되기 이전 상태로 되돌아갈 수 있다.
'2학년 > C' 카테고리의 다른 글
[C]문자와 문자열(1) (0) | 2023.08.01 |
---|---|
[C]함수(2) (0) | 2023.07.31 |
[C]사용자 지정 타입 (0) | 2023.07.29 |
[C]사용자 지정타입(1) (0) | 2023.07.28 |
[C]배열(2) + 동적할당 (0) | 2023.07.27 |