Dart: Funtions

Juppi·2024년 9월 17일
0

Flutter 개발 일지

목록 보기
7/7
post-thumbnail

Defining a Function

// String을 반환하는 함수 정의
String sayHello(String name) {
    return "Hello $name nice to meet you";
}

// fat arrow syntax
String sayHello(String potato) => "Hello $name nice to meet you";

num plus(num a, num b) => a + b;

// 함수 호출
void main() {
    print(sayHello('주삐'));
}

Named Parameters

Dart의 Function은 named parameter라는 것을 지원한다.


// 아래 정의된 함수는 named parameter를 지원하지 않음
String sayHello(String name, int age, String country) {
  return "Hello $name, you ar $age, and you come from $country";
}

void main() {
  print(sayHello('주삐', 25, 'Korea'));
 
}

메인 함수에서 sayHello를 호출할 때, 위와 같은 방법은 별로 좋은 방법이 아니라고 한다. 요소들의 순서를 까먹을 수도 있고, 인자만 봤을 때 뭐가 뭔지 잘 모를 수도 있기 때문이다.

그렇다면 positional parameter가 더 좋은 경우는 없을까 ? ➡️ sum 등의 간단한 함수는 오히려 positional parameter가 더 직관적이다. 또한, sub 처럼 인자의 순서가 일반적으로 정해져있는 함수 또한 positional parameter가 더 직관적이고 읽기도 쉽다. sub(a, b) 를 호출했을 때, 일반적으로 기대하는 내부 동작은 a - b 이지, b - a가 아니기 때문 ! 함수의 호출부에서 함수도의 동작을 예측 가능하다면, positional, named 둘 다 좋은 선택지이다.

다음처럼 named parameter를 지원하는 함수로 정의하고, named argument를 사용하자.


// named parameter 지원
String sayHello({String name, int age, String country}) {
  return "Hello $name, you ar $age, and you come from $country";
}

void main() {
  print(sayHello(
  	name: '주삐', 
    age: 25, 
    countryL 'Korea'
  ));
}

Dart에서는 null safety를 지원하기 때문에, 함수 호출부에서 필요한 모든 인자를 넘겨주지 않을 때를 고려해야한다.

아래 두 가지 옵션으로 위 문제를 해결할 수 있다.

  1. named parameter에 default value 정하기

    String sayHello({String name = '주삐', int age = 24, String country = "Korea"}) {
      return "Hello $name, you ar $age, and you come from $country";
    }
  2. required modifier 사용하기

    String sayHello({
    	required String name, 
        required int age, 
        required String country
    }) {
      return "Hello $name, you ar $age, and you come from $country";
    }

    파라미터에 앞에 required 키워드를 붙여서 해당 파라미터가 반드시 필요하다는 것을 명시해준다. 이렇게하면, 컴파일러가 호출부에서 필요한 인자를 입력하지 않은 경우에 알려줄 수 있다.

Optional Positional Parameters

String sayHello(String name, int age, String country) => 
	'Hello $name, you ar $age years old from $country';

위 함수의 parameter는 모두 required이며 순서가 정해져 있다.

만약, named parameter를 사용하지 않고, country는 optional로 설정하고 싶으면 아래처럼 수정할 수 있다.

String sayHello(String name, int age, [String? country = 'Korea']) => 
	'Hello $name, you ar $age years old from $country';

➡️ 대괄호([])로 감싸주고, nullable(?)임을 알려주고, default value 부여하기 !

QQ Operator (??, ??=)

Question Question Operator, ??

String capitalizeName(String name) => name.toUpperCase();

위와 같은 함수가 있을 때, 사용자가 null을 입력할 수 있게 해보자.

  1. nullable value 처리하는 조건문 만들기
String capitalizeName(String? name) {
	if (name != null) {
    	return name.toUpperCase();
    }
    return 'ANON';
  1. fat arrow 사용
String capitalizeName(String? name) 
	=> name != null ? name.toUpperCase() : 'ANON';
  1. question question operator 사용 ✨
String capitalizeName(String? name) 
	=> name?.toUpperCase() ?? 'ANON';

qq operator는 좌항이 null이면, 우항을 return 함 (위 경우에서는 name이 null이면 toUpperCase()를 호출할 수 없기 때문에 ? 를 추가 !)

javascript의 nullish 연산자 ??nullundefined를 둘 다 체크한다는 점에서 dart의 ?? 와 차이가 있다.

Question Question Eauals (Question Question Assignment Operator), ??=

void main() {
	String? name;
    name ??= 'juppi';
    name ??= '!!';
    print(name); // juppi

좌항이 null이면 할당하는 연산자이다. name이 null인 상태에서 juppi를 할당했기 때문에 !! 는 할당되지 않는다.

Typedef

자료형이 헷갈릴 때 도움이 될 alias를 만드는 방법 ! 자료형이 복잡해질 때 유용하다.

typedef ListOfInts = List<int>;

List<int> reverseOfNumbers(List<int> list) {
	var reversed = list.reversed;
    return reversed.toList();
}

ListOfInts reverseOfNumbers(ListOfInts list) {
	var reversed = list.reversed;
    return reversed.toList();
}
typedef UserInfo = Map<String, String>;

String sayHi(Map<String, String> userInfo) {
	return "Hi ${userInfo['name']}";
}

String sayHi(UserInfo userInfo) {
	return "Hi ${userInfo['name']}";
}
해당 글은 노마드 코더의 [Dart 시작하기] 무료 강의를 듣고 정리한 글입니다.
profile
잠자면서 돈버는 그날까지

0개의 댓글