본문 바로가기

IT 일기/Flutter!

Dart를 빠르게 알아보자 - function!

728x90

1. Defining Fuction! (fat arrow syntax)

void hihi(String name) {
  print("hihi my name is $name");
}

String hihi2(String name) => "hihi my name is $name 22";
void main() {
  hihi("hyun!");
  print(hihi2("hyun22!"));
}

C와 유사한 형식의 함수 꼴을 사용한다. return 타입을 함수명 앞에서 정의한다. 단순히 return만 하는 함수인 경우 위와 같이 => 을 사용해 한줄로 정의할 수 있다. 

 

2. named parameter!

String hihi2({String? name, required int age, String country = "korea"}) {
  return "hihi my name is $name and $age year's old and froem $country";
}

void main() {
  print(hihi2(
    age: 25,
    name: "gyu",
    country: "korea",
  ));
}

인자가 여러개 있는 함수를 호출할때 인자의 순서에 관계없이 인자의 이름을 이용해 값을 넘기는 방법이다. 이 방법의 장점은 방금 말했듯이 순서가 무관하다.

 

하지만 사용에 조심해야 하는 점이 있다. 우선 인자들을 {}으로 묶어줘야 한다. 그리고 named parameter의 값을 사용자가 넘겨주지 않을 수 있기 때문에(null을 참조 할 수 있기 때문에) 몇가지 방법을 통해 이 부분을 해결해줘야 한다.

  • ?를 사용해 해당 type이 null일 수도 있음을 알리기
  • required를 사용해 만약 사용자가 인자를 넘기지 않으면 오류를 뱉게 만들기
  • default value를 사용해 만약 사용자가 인자를 넘기지 않으면 해당 값을 사용하게 만들기

이 세가지 방법을 사용해 null을 참조하는 문제를 해결한다.

 

3. optional Positional Parameters!

String hihi3(String name, int age, [String? country = "korea"]) {
  return "hihi my name is $name and $age year's old and froem $country";
}

void main() {
  print(hihi3("hung", 12));
}

특정 값을 넘겨주고 싶지 않을때 사용할 수 있는 방법이다. 해당 방법을 사용해주기 위해선 넘겨주고 싶지 않은 인자에 []와 default value를 넣어주면 된다. 그렇다고 값을 넘겨주면 안되는건 아니다. hihi3("hung",12,"japan");으로 함수를 호출하면 default value인 korea가 아닌 japan으로 출력 되는 것을 확인 할 수있다. 

 

4. QQ Operator

String toUpper(String name) {
  var newName = name.toUpperCase();
  return newName;
}

String toUpper1(String? name) {
  if (name != null) {
    var newName = name.toUpperCase();
    return newName;
  }
  return 'ANON';
}

String toUpper2(String? name) => name != null ? name.toUpperCase() : 'ANON';

String toUpper3(String? name) => name?.toUpperCase() ?? 'ANON';
void main() {
  print(toUpper("g"));
  print(toUpper1("g1"));
  print(toUpper2("g2"));
  print(toUpper3(null));

  String? name;
  name ??= 'hyun';
  print(name);
}

만약 함수의 인자로 null값을 넘기고 싶은 경우 위와 같이 여러 방법으로 문제를 해결할 수 있다. if를 이용한 처리, 삼항연산자와 비슷한 방법으로의 처리 그리고 QQ(??)를 이용한 처리가 있다.

 

QQ(??)는 단순하게 ?? 기준 좌항(name?.toUpperCase())의 값이 null 이면 우항('Anon')을 return 하는 기호임.

 

그리고 메인 함수 밑에 ??= 기호가 존재하는데 얘는 "만약 해당 값이 null 이면 이 값으로 초기화 해라"라는 의미임. 

 

5. Type def!

typedef ListOfInts = List<int>;

ListOfInts reverseListOfNumbers(ListOfInts list) {
  var reversed = list.reversed;
  print("Data type of reversed: ${reversed.runtimeType}");
  return reversed.toList();
}

void main() {
  print(reverseListOfNumbers([1, 2, 3]));
}

typedef를 통해 특정 data type의 alias를 만들 수 있다! 위와 같이 사용할 수 있음!

728x90