함수란, 간단하게 말해서 코드의 집합을 말한다. 이 함수는 용도가 꽤나 다양한데, 주로 코드 최적화, 특정 인자를 전달하여 값 계산 등의 용도로 사용된다. 함수를 선언할 때에는 반환 자료형, 함수 이름, 매개변수 등을 지정해주어야 하며, 이렇게 선언된 함수는 함수의 이름이 main이 아닌 이상 스스로 실행되지 않는다. 반드시 함수를 호출해 주어야만 코드를 실행한다. 함수의 끝부분을 알리기 위해서는 return 키워드를 사용하여 값을 반환하거나 반환하지 않고 함수를 종료한다.
다음은 기본적인 함수 선언의 예이다.
반환형 함수 이름 매개변수
v v v
int function(int x){
코드1...
코드2...
return x;
} ^
반환값
위와 같은 코드는 반환하는 자료형이 int이고 매개변수로 x를 받는 function함수
를 뜻한다.
함수를 호출하려면 function(1)
과 같이 적어 호출하며, 괄호 밖에 있는 것은 함수 이름, 괄호 안에 있는 것은 인자라고 한다. 함수가 호출되면 함수 안에 포함된 코드1, 코드2 등의 코드를 실행하고 마지막에는 x값을 함수를 호출했던 곳으로 반환하며 끝날 것이다. 인자와 매개변수, 반환 등에 대해 하나하나씩 알아보자.
매개변수에 대해 알아보기 위해서는 지역변수와 전역번수의 개념에 대해 알아볼 필요가 있다. 먼저 지역변수는, 이름처럼 특정 지역에서만 사용되는 변수를 말하는데, 그 지역의 단위는 함수이다. 함수 안에서 선언된 변수는 모두 지역변수이며, 다른 함수에서 사용하지 못하고 함수가 종료되는 순간 사라지게 된다. 그리고 만약 A라는 함수에서 x라는 지역변수가 선언되고, B라는 함수에서 x라는 지역변수가 선언되었다면, 각각의 변수는 아예 다른 변수로 취급되며 이름만 같지 각각의 함수에서 저마다의 값과 주소를 가지고 사용된다. 전역변수 또한 이름처럼 모든 지역(함수)에서 사용 가능한 변수를 말하며, 프로그램이 끝날 때 사라지게 된다. 지역변수끼리 이름 중복이 가능한 것과는 다르게, 전역변수와 지역변수의 이름은 같을 수 없다. 약간 심화 개념을 덧붙이자면 지역변수와 전역변수는 메모리에서 각각 차지하는 영역이 다른데, 지역변수는 stack, 전역변수는 heap이라는 영역에 저장된다.
함수를 호출할 때에는 꼭 호출할 함수의 매개변수의 자료형, 수 등에 맞게 값을 보내주어야 하는데, 이 값을 인자라고 한다. 인자는 함수에 그대로 전달되어 함수 내에서 매개변수라는 변수의 한 종류로 사용될 수 있는데, 이는 지역변수처럼 값을 읽거나, 수정하며 사용할 수 있다. 그리고 지역변수와 같이 함수가 끝나면 소멸하게 된다. 값을 수정한다고 해서 함수를 호출할 때 사용되었던 인자의 값이 수정되는 것은 아니다.
아까전에 함수의 끝부분을 알리기 위해서는 return 키워드를 사용하여 값을 반환할 수 있다고 했는데, return이라는 단어를 직역하면 돌려주다 등의 뜻이다. 말 그대로 return 키워드는 함수가 호출된 지점으로 값을 돌려주는 것을 말한다. 이해가 조금 힘들 수 있는데, 하나의 함수를 예시로 들어보겠다.
int plus(int a, int b){
return a + b;
}
위와 같은 함수는 반환하는 자료형이 int이고 매개변수로 a와 b를 받으며 a + b 값을 반환하는 plus함수
라고 말할 수 있다. 이제 이 함수를 호출하려면 plus(1, 2)
와 같은 형식으로 호출할 수 있는데, 이를 printf
로 출력하면,
#include <stdio.h>
//plus 함수 선언되었다고 가정
int main(void){
printf("%d", plus(1, 2));
return 0;
}
와 같이 사용할 수 있다. 이 코드가 실행되면 main함수에 있는 printf
가 실행되며, plus
함수가 호출된다. 1과 2를 인자로 보냈기에, plus
함수는 매개변수 a, b에 각각 1, 2가 들어가게 될 것이고, 1과 2를 더한 값인 3을 반환해 주어 결과적으로 화면에는 3이 출력된다.
글 잘 읽고 갑니다~