dart - 람다식과 함수 표현 방법들

jokil·2023년 12월 12일
0

플러터

목록 보기
10/15

ㅁ 람다식이란?

람다 함수, 람다 표현식은 함수를 익명 형태로 정의하는 방법이다.

람다 함수는 주로 다른 함수의 인자로 사용되거나 짧은 수명의 함수가 필요할 때 사용된다.


ㅁ 표현 방법
// 전통적인 함수 선언 방식

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가 아니면 에러가 난다.

본문이 단일 표현식인 경우에 사용할 수 있는 간결한 방법이다.

복잡한 함수인 경우에는 전통방식으로 사용하는게 가독성이 더 좋을 수 있다.


- Named parameters {}를 사용하여 파라미터에 이름을 붙이도록 강제한다

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로 필수 파라미터로 지정

    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(메서드)의 이름이 다를 수는 없다.

(출처 : 오준석의 생존코딩에서 코드 부분과 몇몇 설명 발췌)

profile
주니어 개발자에서 점핑점핑

0개의 댓글