함수에 대해 다루기에 앞서, 이미 이전 강좌에서 한 함수를 보았습니다. 바로 모든 D 언어 프로그램의 실행 시작점인 main()
입니다.
함수는, 몇가지 값을 매개변수(argument)로 입력 받고 함수 내에서 일련의 작업을 수행한 다음 결과값을 반환합니다. void
를 결과값의 타입으로 지정한 경우, 아무것도 반환하지 않습니다.
int add(int lhs, int rhs) {
return lhs + rhs;
}
void welcome() {
writeln("Welcome!");
// 여기에서 아무 것도 반환하지 않고 함수가 끝났습니다.
}
auto
return types )함수의 결과값 타입을 auto
로 지정하면, D 언어 컴파일러가 적절한 타입이 무엇인지 예상해서 지정합니다. return
문이 여러개가 있고, 여러 타입이 반환되는 경우 그 모든 타입들을 아우를 수 있는 어떠한 타입으로 추론하게 됩니다.
auto add(int lhs, int rhs) { // int와 int의 덧셈이므로 명백히 `int` 타입이 추론됩니다.
return lhs + rhs;
}
auto lessOrEqual(int lhs, int rhs) { // int와 double 중 더 큰 표현범위를 가진 `double` 로 추론합니다.
if (lhs <= rhs)
return 0;
else
return 1.0;
}
함수를 작성할 때 특정한 입력값에 대해 기본값을 미리 지정해놓고, 실행될 때 참조되도록 할 수도 있습니다.
void plot(string msg, string color = "blue") {
...
}
plot("D 언어 최고");
plot("D 언어 최고", "blue");
함수 입력값에 기본값을 지정할 때 한 가지 주의할 사항이 있습니다. 한번 기본값을 지정한 뒤에는, 이후에 오는 모든 입력값에 대해서 기본값을 지정해야한다는 것입니다.
// 괜찮습니다
void plot_good(string msg, string color = "blue", string linetype="solid") {
...
}
// 오류가 발생합니다
void plot_error(string msg, string color = "blue", string linetype) {
...
}
함수는 함수 내에서 선언될 수 있습니다. 이를 로컬 함수라고도 부릅니다. 이때 안에 선언된 함수는 외부에 노출되지 않아, 외부에서 직접 호출할 수 없습니다. 안에 선언된 함수는 바깥 함수에 선언된 변수들을 이용할 수 있습니다.
void fun() {
int local = 10;
int fun_secret() {
local++; // 잘 동작하며, fun() 내에서 fun_secret()이 실행되면 바깥의 local이 증가합니다.
}
...
이러한 내재된 함수들을 델리게이트(delegate)라고 부릅니다. 해당 강좌 에서 좀 더 자세히 다루겠습니다.