포스팅 환경
- Dart 2.18.2
개요
함수는 특별한 코드의 묶음 단위입니다.
자바, 코틀린, 자바스크립트 같은 경우 함수의 기본적인 문법뿐만 아니라
람다식, 익명함수 등등 다양한 함수형태로 사용할 수 있습니다.
다트에서도 다양한 함수 문법을 사용 할 수 있는데요
다트에서는 어떤식으로 함수를 정의하고 함수를 사용할 수 있는지 알아보겠습니다.
함수의 형태
함수의 기본적인 형태는 다음과 같은 형태로 작성합니다.
값을 반환할 때는 return 키워드를 사용합니다.
int f(int x) {
return x + 10;
}
void main() {
var result = f(10);
}
위 함수에서 함수명은 f, 매개변수는 int 타입이고 매개변수명은 x, 반환값은 int 타입입니다.
다음은 매개변수가 둘 인 함수 입니다.
inf f(int x, int z) {
return x + z + 10;
}
다음은 매개변수가 없는 함수입니다.
String f() {
return "안녕하세요";
}
다음은 반환값이 없는 함수 입니다.
함수명 앞에 있는 void 는 반환 값이 없다는 키워드입니다.
자바에서의 void 와 동일하고 kotlin 에서는 Unit 이라고 보면 되겠네요.
void f(int x) {
print(x);
}
kotlin 처럼 반환 값을 생략할 수도 있습니다.
f() {
return "안녕하세요";
}
위 코드는 정상실행됩니다.
이유는 다트에서 함수의 반환타입 역시 타입 추론에 의해 생략이 가능해서 입니다.
함수 접근 제한자
다트도 함수에 접근 제한을 걸 수 있는 키워드가 있습니다.
다만 자바, 코틀린 처럼 public, protected, private 형태가 있는 것이 아니라
public, private 제한자만 있습니다.
방법은 아주 간단합니다.
함수명 앞에 _ 만 붙여주면 private 이 됩니다.
외부파일 혹은 외부 클래스에서 이 함수를 호출 할 수 없게 됩니다.
_f() {
return "안녕하세요";
}
최상위 함수
클래스 밖에 작성하는 함수를 최상위 함수라고 합니다.
최상위 함수는 어디에서나 호출 할 수 있는 함수입니다.
bool isEven(int number) {
return number % 2 == 0;
}
void main() {
print(isEven(10));
}
익명 함수
다트에서는 이름 없는 익명함수도 정의해서 사용할 수 있습니다.
다음과 같은 형태가 됩니다.
(인수명) { 동작 또는 반환값 };
아래 익명함수는 number 가 짝수면 true, 홀수면 false 를 반환합니다.
(number) {
return number % 2 == 0;
};
익명함수를 실행하는 방법은 () 를 사용하여 즉시 호출 할 수 있습니다.
void main() {
print(
(number) {
return number % 2 == 0;
}(10)
);
}
람다식
다트에서는 람다(lamda) 표현식이라는 함수 표현방식도 지원합니다.
람다함수를 만들고 여러가지로 호출하는 방법을 알아보겠습니다.
다트에서 람다식을 만들면 다음과 같은 형태가 됩니다.
(인수명) => 동작 또는 반환값
앞에서 익명함수로 구성한 짝수를 구하는 함수를 람다식으로 표현하면 다음과 같습니다.
(number) => number % 2 == 0
람다함수를 호출하려면 어떻게 해야 할까요??
람다식에 isEvenFuc 이라고 함수명을 정하고 호출해주는 방법을 사용할 수도 있습니다.
void main() {
isEvenFuc(number) => number % 2 == 0;
print(isEvenFuc(10));
}
다음과 같이 람다함수를 () 로 한번 더 감싸주고
(10) 처럼 매개변수를 전달하고 호출하는 방식으로도 함수를 실행할 수 있습니다.
void main() {
print(
((number) => number % 2 == 0)(10)
);
}
또는 다음과 같이 람다식을 함수형 인자로 전달하고
isEven 함수내부에서 람다식을 호출하는 방법도 사용할 수 있습니다.
void main() {
isEven(
(number) => number % 2 == 0
);
}
void isEven(Function f) {
print(f(10));
}
선택 매개변수
다트에서는 선택 매개변수라는 것이 있는데요
조금 이해하기 어려울 수도 있습니다.
말그대로 “선택”하여 매개변수를 전달하는 것을 의미합니다.
함수의 매개변수를 정의할 때 {} 를 감싸서 “이 매개변수를 선택 매개변수로 사용하겠다” 라고 정의할 수 있습니다.
이런 매개변수 형태를 “Named Parameter” 라고도 부릅니다.
다음과 같은 코드를 보겠습니다.
void main() {
greeting(name: "kyu");
}
greeting({String? name, int? count}) {
print("hello, $name! message count: $count");
}
// 실행 결과
// hello, kyu! message count: null
위 코드에서 name, count 는 선택 매개변수로 정의되었습니다.
따라서 greeting 함수를 호출하는 곳에서 인자로 name 혹은 count 만 인자를 넣어주고 호출할 수 있습니다.
만약 선택 매개변수가 아니라면 name, count 에 인자를 넣지 않는다면 컴파일 에러가 발생할 것 입니다.
또한 count 에 기본 값을 정의하지 않았기 때문에 함수 호출 시 null 이 찍히는 것을 확인할 수 있습니다.
count 가 null 이 되지 않게 하려면 어떻게 해야 할까요?
선택적 매개변수에서는 매개변수에 기본 값을 지정할 수 있습니다.
아래 코드 처럼 1이라는 기본 값을 정의해주면 count 에 인수를 전달하지 않을 시
기본값으로 찍히는 것을 알 수 있습니다.
void main() {
greeting(name: "kyu");
}
greeting({String? name, int? count = 1}) {
print("hello, $name! message count: $count");
}
// 결과
// hello, kyu! message count: 1
선택 매개변수라면서 인수를 모두 넣어야 하는 것일까요?
그렇지 않습니다.
아래 코드에서는 name 과 count 매개변수 모두 nullable 입니다.
따라서 인수로 아무것도 전달하지 않고 호출 할수도 있습니다.
void main() {
greeting();
}
greeting({String? name, int? count}) {
print("hello, $name! message count: $count");
}
// 결과
// hello, null! message count: null
하지만 선택 매개변수라고 해도
기본값을 지정해주지 않으면 필수적으로 인수로 전달해야합니다.
인수를 전달하지 않으려면 non null 한 형태로 기본 값이 정의 되어있거나
nullable 하게 만들어서 “선택적”으로 인수를 전달할 수 있도록 해야합니다.
// 컴파일 에러 발생
greeting({String name, int count}) {
print("hello, $name! message count: $count");
}
// 컴파일 통과
greeting({String name = "kyu", int count = 1}) {
print("hello, $name! message count: $count");
}
// 컴파일 통과
greeting({String? name, int? count}) {
print("hello, $name! message count: $count");
}
또한 부분적으로 선택적 매개변수로 만들 수도 있습니다.
아래 코드에서는 count 만 부분 선택매개변수로 정의하였습니다.
void main() {
// count 는 nullable 이기에 선택적으로 생략가능
greeting("kyu");
// count 는 선택적 매개변수이기 때문에 name 을 명시하여 인수로 전달
greeting("kyu", count: 1);
// 컴파일 에러
greeting("kyu", 1);
}
greeting(String? name, {int? count}) {
print("hello, $name! message count: $count");
}
정리하자면 선택매개변수를 사용할 수 있는 조건은 아래와 같습니다.
- 함수의 매개변수가 nullable 이거나 혹은 default 값이 정해져 있어야 한다.
- 선택적으로 사용하려는 매개변수는 {} 로 감싸서 정의한다.
- 함수를 호출할 때 인자로 선택적 매개변수를 전달하는 경우 매개변수의 이름을 반드시 명시하여 인자로 전달해야 한다.
선택적 매개변수를 쓸때가 있을까? 라는 생각이 들지만
매개변수가 많은 함수의 경우 필요한 매개변수만 선택적으로 전달할 수가 있으므로
가독성이 높아지는 장점이 있을 것 입니다.
이런 경우에 선택적매개변수를 사용하지 않을까? 생각합니다.
여기까지 다트에서 여러가지 함수를 정의하는 방법과 사용하는 방법을 살펴보았습니다.
이상으로 다트문법에서 함수에 관한 포스팅을 마치겠습니다.
감사합니다 :)
https://linitial.tistory.com/47?category=1050635
'Develop > Flutter' 카테고리의 다른 글
[Dart] 배우기 - 4. 컬렉션 (0) | 2022.10.26 |
---|---|
[Dart] 배우기 - 3. 분기와 반복 (0) | 2022.10.26 |
[Dart] 배우기 - 1. 기본 문법 (0) | 2022.10.24 |
[Flutter] - 앱 실행 도중 멈춤 현상(IOS, 신뢰하지 않는 개발자) (0) | 2022.10.24 |
[Flutter] - flutter SDK 자주 쓰는 명령어 모음 (0) | 2022.10.21 |