2.5.1 선택적 인자(Optional Arguments)
2.5.1 선택적 인자(Optional Arguments)
선택적 인자는 인자 식별자 앞에 물음표 ?를 붙여 선언해요:
class Main {
static public function main() {
// (?i : Int, ?s : String) -> String
$type(test);
trace(test()); // i: null, s: null
trace(test(1)); // i: 1, s: null
trace(test(1, "foo")); // i: 1, s: foo
trace(test("foo")); // i: null, s: foo
}
static function test(?i:Int, ?s:String) {
return "i: " + i + ", s: " + s;
}
}
함수 test는 두 개의 선택적 인자를 가져요: Int 타입의 i와 String 타입의 s. 이것은 4행에서 출력되는 함수 타입에 그대로 반영됩니다. 이 예제 프로그램은 test를 네 번 호출하고 그 반환값을 출력해요.
- 첫 번째 호출은 인자 없이 이뤄집니다.
- 두 번째 호출은 인자 하나
1로 이뤄집니다. - 세 번째 호출은 인자 두 개
1과"foo"로 이뤄집니다. - 네 번째 호출은 인자 하나
"foo"로 이뤄집니다.
출력은 호출에서 생략된 선택적 인자의 값이 null임을 보여줘요. 이는 이 인자들의 타입이 null을 값으로 허용해야 한다는 뜻이며, nullability에 대한 질문을 제기합니다. Haxe 컴파일러는 정적 대상으로 컴파일할 때 선택적 기본 타입 인자를 Null<T>로 추론해 null을 허용하도록 보장해요.
처음 세 호출은 직관적이지만 네 번째는 다소 놀라울 수 있어요. 선택적 인자는 제공된 값이 더 뒤쪽 인자에 할당 가능하다면 건너뛸 수 있습니다.
본문
선택적 인자의 선언
선택적 인자는 물음표 ?를 인자명 앞에 붙여 선언합니다. 생략하면 null 값으로 채워져요. 따라서 선택적 인자의 타입은 null을 허용해야 합니다.
Null 처리
정적 대상에서 선택적 기본 타입 인자는 컴파일러가 Null<T>로 추론해서 null을 허용하게 합니다. 동적 대상에서는 타 언어의 관대함 덕분에 null이 자연스럽게 허용됩니다.
인자 건너뛰기
선택적 인자의 특징 중 하나는, 제공된 값이 더 뒤쪽 인자에 들어맞으면 앞쪽 인자를 건너뛸 수 있다는 점이에요. 네 번째 호출 test("foo")가 그 예로, s에 "foo"가 전달되고 i는 null이 됩니다.