오답노트
[Dart] 함수 본문
함수 정의
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 |