오답노트

[Dart] 함수 본문

Dart

[Dart] 함수

권멋져 2023. 5. 9. 19:46
 

Dart 시작하기 – 노마드 코더 Nomad Coders

Flutter 앱 개발을 위한 Dart 배우기

nomadcoders.co

함수 정의

void sayHello(String name){
  print("Hello $name nice to meet you");
}

String sayHellopotato(String potato){
  return "Hello $potato nice to meet you";
}

String sayHellopotato_fatarrow(String potato) => "Hello $potato nice to meet you";

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

void main() {
  print(sayHellopotato('ksw'));
}

보통의 언어들과 같이 함수를 선언할 수 있다.

함수 내부의 간단한 로직 같은 경우 {}를 통해 만들지 않고 => 를 통해 직접 실행시키도 반환할 수 있다.

 

Named Parameters

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

String sayHello_named_default({String name = 'anon', int age = 19, String country = 'usa'})
{
  return "Hello $name, you arr $age, and you come from $country";
}

String sayHello_named({String name, int age, String country})
{
  return "Hello $name, you arr $age, and you come from $country";
}

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


void main() {
  print(sayHello('ksw',20,'korea'));
  
  print(sayHello_named(age:12,
                country:'korea',
                name:'ksw'));
  
   print(sayHello_named_default(
                name:'ksw'));
  
  print(sayHello_named_required(age:12,
                country:'korea',
                name:'ksw'));
}

함수 선언 항목에서 선언한 함수들을 사용할 때, 인자에 어떤 정보를 넣어야하는지 알 수 없다.

그래서 이를 명시하기 위한 것이 Named Parameters다.

사용법은 매우 간단한데, 함수 선언시 인지 부분에 모두 {}로 감싸주면 해당 함수를 사용할 때 Name을 지정해서 인자를 입력할 수 있다.

 

Optional Positional Parameters

String sayHello(String name, int age, [String? country = 'usa']) =>
  "Hello $name, you are $age, you come from $country";

// Optional Positional Parameters func([String? str = 'str'])

void main() {
  
  sayHello('ksw',10);

}

optional positional parameters는 null이 될 수도 있는 인자를 명시한다.

문법이 가장 중요한 부분인데 해당 인자를 대괄호로 감싸고, 자료형에 null이 될 수도 있는 것을 명시하는 ?를 붙힌다.

마지막으로 default value를 입력한다.

 

함수를 사용할 때 해당 인자는 사용해도되고 안해도 되는 optional한 인자다.

 

QQ Operator

// ??  left ?? right (left가 null 이면 right 반환, left가 null이 아니면 left 반환)

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

String capitalizeName_null(String? name)
{
  if (name != null){
    return name.toUpperCase();
  }
  return 'anon';
}

String capitalizeName_null_fatarrow(String? name) => 
  name != null ? name.toUpperCase() : 'anon';

String capitalizeName_QQ(String? name) => 
    name?.toUpperCase() ?? 'anon';

void main() {
  
  capitalizeName('ksw');
  capitalizeName_null(null);
  capitalizeName_QQ(null);
  capitalizeName_QQ('ksw');
  
  String? name;
  name ??= 'name'; // name이 null 이면 값을 할당해라
  name = null;
  name ??= 'another';

}

?는 삼항연산자에서 사용되는 연산자인데 dart는 그 이상의 극한의 효율을 자랑한다.

?? 연산자를 통해 연산자의 왼쪽이 실행 가능 하면 그대로 실행하고 아니면 right를 실행한다.

그리고 ??= 는 변수를 확인하고 값을 할당하는데 사용한다.

만약 변수가 null이라면 값을 할당하고 그렇지 않으면 할당하지 않는다.

 

typedef

typedef ListOfInts = List<int>;

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

typedef UserInfo = Map<String,String>;

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

void main() {
  
  print(reverseListOfNumvers([1,2,3]));
  sayHi({'name':'ksw'});
  

}

복잡(?)한 자료형을 사용자가 임의로 별칭을 메기는 것을 의미한다.

라이브러리나 오픈소스를 만들때, 혹은 API를 만들 때 사용하면 유용할 것 같다.

'Dart' 카테고리의 다른 글

[Dart] Data Type  (0) 2023.05.09
[Dart] 기본적인 자료형  (0) 2023.05.09