[Dart] 3. Functions

Speedwell🍀·2023년 9월 7일
0
post-thumbnail

[출처] Nomadcoders - Dart 시작하기

Defining a Function

String sayHello(String name){
  return "Hello $name, nice to meet you!";
}

// fat arrow syntax
String sayHello2(String name) => "Hello $name, nice to meet you!";

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

void main() {
  print(sayHello2('atlns'));
  print(plus(1, 3));
}

parameter 종류 2가지

positional parameter (클린코드 측면에서 추천하지 않음)

  • 모든 parameter를 전달해야 함
  • parameter의 순서를 지켜야 함

named parameter

  • parameter 리스트 전체를 중괄호로 감싸기
  • 자동 완성이 가능해짐
  • 순서 상관없음
  • null error 대비해야 함 (두 가지 옵션)
    1. default value 지정
    2. required modifier

Named Parameters

String sayHello({String name = 'name', int age = 0, String country = 'somewhere'}) {
  return "Hello $name, you are $age, and you come from $country";
}

void main() {
// print(sayHello('atlns', 16, 'France'));
// 위는 좋지 않은 방법. 사용자가 순서를 잊어버릴 수 있고, 가독성이 좋지 않음.
// => Named Parameters
  print(sayHello(
    age: 12,
    country: 'France',
    name: 'atlns',
  ));
}

Named argument를 사용하는 방법

: 함수의 arguments 앞뒤로 중괄호 추가해주기


(Error!!) Null Safety

스크린샷 2023-09-06 오후 2 03 45

Dart는 Null safety이기 때문에, named argument가 null이 될 수 있는 경우에 대한 에러를 보냄


해결 1) default value를 지정해주기!

String sayHello({
  String name = 'name',
  int age = 0,
  String country = 'somewhere',
}) {
  return "Hello $name, you are $age, and you come from $country";
}

해결 2) required modifier

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

Optional Positional Parameters

많이 사용되지는 않음

[사용 방법]

  1. 해당 파라미터에 대괄호
  2. ?로 해당 파라미터가 null일 수도 있다는 걸 표시
  3. default value 부여
String sayHello(
  String name,
  int age,
  [String? country = 'France']) =>
    "Hello $name, you are $age, and you come from $country";

void main() {
  print(sayHello('atlns', 16));
}

QQ Operator

?? 좌항이 null이면 우항을 return, null이 아니면 그대로 좌항을 return

아래 3가지는 동일하게 동작

String capitalizeName(String? name) => name?.toUpperCase() ?? 'ANONYMOUS';
String capitalizeName(String? name) => name != null ? name.toUpperCase() : 'ANONYMOUS';
String capitalizeName(String? name){
  if(name != null){
    return name.toUpperCase();
  }
  return 'ANONYMOUS';
}

QQ equals (= QQ assignment operator)

??= 좌항이 null이면 우항 값을 대입

void main() {
  String? name;
  name ??= 'atlns';
  name ??= 'another'; // 실행될 일 없음
  print(name); // atlns 출력
}

Typedef

자료형에 alias를 붙일 수 있게 해줌
integer List, Map, Set같은 간단한 자료형에 alias를 만들 때 사용

나중에 큰 파일이나 긴 코드를 사용할 때 유용


[typedef 사용 안하는 경우]

// integer List를 전달받고, 똑같이 integer List를 리턴
List<int> reverseListOfNumbers(List<int> list) {
  var reversed = list.reversed;
  // list가 reverse되면 iterable로 바뀌어서 다시 toList() 해줌
  return reversed.toList();
}

위의 예시처럼 같은 타입을 전달받고 리턴하는 경우, 아래와 같이 typedef를 사용해서 만들 수 있음

[typedef 사용하는 경우]

typedef ListOfInts = List<int>;

ListOfInts reverseListOfNumbers(ListOfInts list) {
  var reversed = list.reversed;
  return reversed.toList();
}

Map을 typedf를 사용해서 아래처럼 만들어줄 수 있지만, 구조화된 data의 형태를 지정하고 싶다면 class를 만들어야 함

typedef UserInfo = Map<String, String>;

String sayHi(UserInfo userInfo){
  return "Hi ${userInfo['name']}";
}

0개의 댓글