함수 선언 위치 알아보기
다트에서 함수는 톱 레벨과 클래스의 멤버 그리고 다른 함수 내에 선언할 수 있습니다.
// 함수 선언 위치
void some1() {
}
void some2() {
void some3() {
}
some3();
}
class MyClass {
void some4() {
}
}
또한 다트에서는 함수 오버로딩을 제공하지 않습니다.
// 함수 오버로딩 지원 안 함
class MyClass {
void some() {
}
void some(int a) { // 함수 이름 중복 오류
}
}
함수 오버로딩은 왜 지원하지 않는 거죠?
함수 오버로딩은 매개변수의 타입이나 개수를 다양하게 만들어서 이름이 같은 함수를 여러 개 만드는 방법입니다. 그런데 다트는 잠시 후에 다룰 '옵셔널 매개변수'라는 기능을 제공하므로 굳이 이름이 같은 함수를 여러 개 만들 필요가 없습니다.
매개변수 타입
함수의 매개변수는 타입을 명시하거나 var로 선언할 수 있습니다. 또는 타입을 생략할 수도 있습니다. 오른쪽 코드에서 some1() 함수에는 int? 타입의 매개변수를 하나 선언했습니다. 따라서 이 함수를 호출할 때는 int?에 대입할 수 있는 데이터를 입력해 호출해야 합니다.
// 매개변수 타입에 맞는 데이터로 호출
void some1(int? a) {
}
main() {
some1(10);
some1(null);
some1('hello'); // 오류
}
또한 다음처럼 함수의 매개변수를 var로 선언할 수도 있습니다. 04장에서 알아본 바와 같이 var로 선언한 변수는 대입한 값에 따라 컴파일러가 타입을 유추합니다. 그런데 함수의 매개변수에 값이 대입되는 시점은 이 함수를 호출할 때이므로 컴파일 시점에는 타입을 유추할 수 없습니다. 따라서 함수의 매개변수를 var로 선언하면 dynamic 타입이 됩니다.
// var 타입 매개변수
void some2(var a) {
a = 20;
a = 'world';
a = true;
a = null;
}
main() {
some2(); // 매개변수에 값을 전달하지 않아서 오류
some2(10);
some2('hello');
}
다트에서는 함수의 매개변수 타입을 생략하고 변수 이름만으로 선언할 수도 있습니다. 이처럼 매개변수의 타입을 생략하면 var로 선언한 것과 같습니다. 즉, dynamic 타입이 됩니다.
// 매개변수 이름 생략 -> dynamic 타입
void some3(a) {
a = 20;
a = 'world';
a = true;
a = null;
}
main() {
some3(); // 오류
some3(10);
}
함수의 반환 타입
함수를 선언할 때 반환 타입을 지정할 수 있으며 반환할 데이터가 없으면 void로 선언합니다.
// 반환 타입
void some1() {
}
int some2() {
return 10;
}
그런데 함수의 반환 타입은 생략해도 됩니다. 반환 타입을 생략하면 dynamic 타입이 됩니다.
즉, 반환 타입을 생략하면 모든 타입의 데이터를 반환할 수 있는 dynamic 타입이 됩니다.
다음 코드에서 some3() 함수는 반환 타입을 생략했습니다. 그러면 dynamic으로 선언한 것과 같습니다. 그런데 some3() 함수에는 데이터를 반환하는 return 문이 없습니다. 이처럼 반환 타입이 dynamic인 함수에서 return 문으로 데이터를 반환하지 않으면 자동으로 null을 반환합니다.
// 반환 타입이 dynamic인 함수에서 return 문 생략
dynamic some1() {
return 10;
}
some2() {
return 10;
}
some3() {
}
main() {
print('some1 result : ${some1()}');
print('some2 result : ${some2()}');
print('some3 result : ${some3()}');
}
▶ 실행 결과
some1 result : 10
some2 result : 10
some3 result : null
화살표 함수
함수를 선언할 때 실행 영역인 본문은 중괄호로 묶어주어야 합니다. 그런데 함수의 본문이 한 줄일 때는 한 줄 함수로 선언할 수 있습니다. 한 줄 함수는 본문을 중괄호로 묶지 않고 화살표 기호(=>)로 나타내는 방법입니다.
다음 코드에서는 printUser1()과 printUser2()라는 함수를 선언했습니다. printUser1() 함수는 본문을 중괄호로 묶었습니다. 그런데 본문이 한 줄이라면 printUser2()처럼 중괄호를 사용하지 않고 화살표를 이용해서 선언할 수 있습니다.
// 화살표 함수 사용
void printUser1() {
print('hello world');
}
void printUser2() => print('hello world');
main() {
printUser1();
printUser2();
}
▶ 실행 결과
hello world
hello world
'Flutter' 카테고리의 다른 글
옵셔널 위치 매개변수 (0) | 2024.11.12 |
---|---|
명명된 매개변수 (0) | 2024.11.12 |
널 안전성 연산자 (0) | 2024.11.12 |
널 포인트 예외 관리하기 (1) | 2024.11.12 |
컬렉션 타입 - List, Set, Map (0) | 2024.11.11 |