void sayHello(String name) {
print("hello $name!)
}
함수를 정의할 때 파라미터의 자료형과 파라미터명을 적음
함수 앞의 void는 함수가 어떤 것도 리턴하지 않는 다는 뜻임(타스랑 똑같음)
그런데 지금 문자열을 리턴하고 있으니 다음과 같이 고치면 됨
sayHello(String name) {
return 'hello $name';
}
void main () {
print(sayHello('haha'));
}
혹은
String sayHello(String name) {
return 'hello $name';
}
void main () {
print(sayHello('haha'));
}
String sayHello(String name, String nickname, int age){
return 'hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!'
}
void main () {
print(sayHello('haha', 'one', 1);
// hello i am haha, people call me one and i am 1 years old. nice to meet you!
}
하지만 전달해야할 요소가 많아지면 유저가 요소의 순서를 헷갈릴 수도 있고 값을 넣지 않는 상황이 생길 수도 있음
이를 방지하기 위해 다음과 같은 방법을 사용할 수 있음
named argument
String sayHello({String name, String nickname, int age}){
return 'hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!';
}
void main () {
print(sayHello(
age: 1,
name: 'haha',
nickname: 'one',
));
}
함수의 파라미터 적는 곳에 중괄호를 추가한 후,
함수를 호출 할 때 순서에 상관없이 argument의 이름들을 적으면 됨
그런데 dart가 에러메세지를 띄움
각 파라미터가 null을 가질 수 없는데 지금 보면 null이 들어올 수도 있어~ (유저가 값을 안 보내는 경우가 있을 수 있음)
default value 설정하든가 아니면 require modifier 설정해~라고 친절하게 메세지를 보냄
String sayHello({String name = 'orange', String nickname = 'two', int age = 5,}){
return 'hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!';
}
void main () {
print(sayHello(
age: 1,
));
}
//hello i am orange, people call me two. and i am 1 years old. nice to meet you!
default value를 설정해 유저가 까먹고 다른 값들을 안 적어 보냈을 때 기본값을 적용함
근데 만약 default value를 설정하기 싫거나 혹은 실제 data를 받아야하기 때문에 default value를 사용하지 못한다면 어떻게 할까?
바로 required를 사용하면 됨
String sayHello({
required String name,
required String nickname,
required int age,
}) {
return 'hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!';
}
void main () {
print(sayHello(
age: 1,
name: 'haha',
nickname: 'one',
));
}
String sayHello(
String name,
String nickname,
int age,
) => 'hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!';
void main () {
print(sayHello('hh', 'one', 1,));
}
named argument를 적용하고 싶지 않은데 parameter 중 하나를 require 하지 않게 하려면 다음과 같이 하면 됨
String sayHello(
String name,
String nickname,
[int? age = 5]
) => 'hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!';
void main () {
print(sayHello('hh', 'one',));
}
// hello i am hh, people call me one. and i am 3 years old. nice to meet you!
하지만 자주 사용하는 방법은 아님
String lowercaseName(String name) {
return name.toLowerCase();
}
void main () {
print(lowercaseName('ABC'));
} // abc
그런데 사용자가 null을 입력할 수 있게 하고싶음
String lowercaseName(String name) {
return name.toLowerCase(null);
}
void main () {
print(lowercaseName());
}
값이 null이 될 수도 있다는 걸 알려주기 위해서 다음과 같이 파라미터 넣는 곳에?
을 사용해보자
String lowercaseName(String? name) =>
name != null? name.toLowerCase() : 'haha';
void main () {
print(lowercaseName());
} // haha
삼항 연산자를 사용해 name이 null이 아니라면 name.toLowerCase()를 리턴하고 null이면 'haha'를 리턴하게 함
하지만 ??(QQ Operator)
를 사용해 더 간결하게 작성할 수 있음
String lowercaseName(String? name) =>
name?.toLowerCase() ?? 'haha';
void main () {
print(lowercaseName());
} // haha
??
를 기준으로 좌측이 null이면 우측을 리턴
??
를 기준으로 좌측이 null이 아니라면 그대로 좌측을 리턴함
??=(QQ equals or QQ assignment operator)
void main() {
String? name;
name ??= 'haha';
// name이 null이면 우측의 값을 할당하라는 뜻
}
typedef는 자료형에 alias를 사용할 수 있게 해줌
하지만 좀 더 구조화된 데이터는 class를 사용하는 것이 일반적임
typedef는 간단한 데이터의 alias를 만들 때 사용함(List나 Map, set 등)
List<int> reverseNumbers(List<int> list) {
var reversed = list.reversed;
return reversed.toList();
}
위의 List 예시를 typedef를 통해 바꾸어보자면 다음과 같음
typedef ListOfInts = List<int>
ListOfInts reverseNumbers(ListOfInts list) {
var reversed = list.reversed;
return reversed.toList();
}
void main() {
print(reverseNumbers([1,2,3,4]));
}
// [4,3,2,1]
ListOfInts라는 alias를 만들어 List<int>
대신 사용함
dart는 둘 다 같은 자료형으로 받아들이기 때문에 잘 작동함
자바스크립트하다가 다트하니까 재밌다... 헤헤
자료형을 저렇게 써주는 것도 재밌음...(물론 자바스크립트도 ts쓰면 되지만 ㅎ...)
내일은 드디어 class 듣는다 예이 너무 재밌을듯