ㅁ 람다식이란?
람다 함수, 람다 표현식은 함수를 익명 형태로 정의하는 방법이다.
람다 함수는 주로 다른 함수의 인자로 사용되거나 짧은 수명의 함수가 필요할 때 사용된다.
ㅁ 표현 방법
// 전통적인 함수 선언 방식
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber]) != null;
}
// 람다식
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
=> 이건 화살표 문법이다.
전통적인 함수 선언 방식에서 return _nobleGases[atomicNumber] ! null 이 부분을
람다식에서 _nobleGases[atomicNumber] ! = null 간결하게 표현했다.
함수 내용을 바로바로 정의해서 사용하고 싶다면 이렇게 쓰자.
var loudify = (msg) => '!!! $(msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');
print(loudify('hello')); // 결과 !!! HELLO !!!
loudify는 msg를 문자열로 받아 대문자로 바꾼다.
assert는 괄호 안의 표현식이 참인지 확인한다.
입력받은게 hello가 아니면 에러가 난다.
본문이 단일 표현식인 경우에 사용할 수 있는 간결한 방법이다.
복잡한 함수인 경우에는 전통방식으로 사용하는게 가독성이 더 좋을 수 있다.
void enableFlags({bool? bold, bool? hidden}) {}
void main(List<String> arguments) {
enableFlags(bold: true, hidden: false);
enableFlags(bold: null, hidden: null);
enableFlags();
enableFlags(bold: true);
enableFlags(bold: false);
enableFlags(bold: false, hidden: true);
}
몇몇 매개변수는 선택적으로 사용할 수 있다. ( 선택적 매개변수 )
그 중 하나가 Named parameters이다.
매개변수의 이름을 특정하여 값을 전달하는 방식이다.
enableFlags는 두개의 네임드파리미터를 가지고있다.
bold, hidden
둘중 하나만 써도 되고 둘다 써도된다.
순서는 고려하지 않아도 된다.
= 으로 기본값을 지정할 수 있다.
void enableFlags({bool bold = false, bool hidden = false}) {} // 파라미터에 값을 지정해줌
void main(List<String> arguments) {
enableFlags(bold: true);
enableFlags();
}
required 키워드를 붙이면 반드시 값을 지정해야한다.
default값을 지정할 수 없다.
Nullable 가능 (null 값을 반드시 전달해야함)
void enableFlags({
required bool? bold,
required bool hidden,
}) {}
void main(List<String> arguments) {
enableFlags(hidden: false, bold: true); // 필수로 hidden과 bold를 써줘야한다.
}
- Optional positional parameter
> [ ] 를 사용하여 위치를 지정하는 옵션 파라미터를 사용할 수 있다.
> device는 선택적 매개변수임.
> default 값 지정 가능
void say (String from, String msg, [String? device]) {} // from, msg는 무조건 써줘야함
void main(List<String> arguments) {
say('Bob', 'Howdy');
say('Bob', 'Howdy', 'smoke signal');
}
코드를 보면
device는 두번째 say에만 있는걸 볼 수 있다.
[ ] 대괄호로 감싸져 있으면 선택적 매개변수라는 뜻이다.
필요할 때 쓰면 된다.
입출력 타입만 같다면 같은 함수로 볼 수 있다.
void printElement(int element) {
print(element);
}
var list = [1, 2, 3];
// printElement는 매개변수로 전달
list.forEach(printElement);
list는 1, 2, 3 리스트 입력값을 갖고있다.
forEach로 printElement에 list를 인자로 보내면
1, 2, 3이 출력된다.
printElement에는 void라는 타입이 정해진게 없고
인자는 int타입을 받기 때문에 입출력의 타입이 갖다고 볼 수 있다.
메서드는 이름이 있지만, 함수에게 이름은 중요치 않다
// 람다식
void main(List<String> arguments) {
final list = [1, 2, 3];
// 람다식으로 전달
list.forEach((element) { print(element); }); // ((element) { print(element); }) 이 부분이 익명함수
}
void printElement(int element) {
print(element);
}
void main(List<String> arguments) {
final list = [1, 2, 3];
// 미리 정의된 함수 사용
list.forEach(printElement);
}
list.forEach부분만 보자.
두코드 다 동일한 작업을 수행하지만 forEach에 전달되는 함수의 형태가 다르다.
함수는 형태가 달라도 되지만 forEach(메서드)의 이름이 다를 수는 없다.
(출처 : 오준석의 생존코딩에서 코드 부분과 몇몇 설명 발췌)