dart는 특히 parameter가 특히 좋다고 한다.
(parameter는 함수에 전달해주는 매개변수)
문법적인 측면에서는 c, c++, java와 크게 다를바가 없다.
이건 만약 리턴 타입의 함수일 경우에
//원래 다른 언어에서
String sayHello(String name){
return "Hi, I'm $name ";
}
//Dart에서 Fat arrow syntax를 사용할 경우
String sayHello(String name)=>return "Hi, I'm $name ";
이런식으로 매우 간단하게 한 줄짜리의 리턴 타입의 함수를 사용해줄 수 있다.
코드를 주고 설명을 해보자면
String sayHello({String name, int age, String country}){
return "Hi, I'm $name, $age years old and live in $country .";
}
void main(){
print(sayHello(
age: 23,
country:'Korea',
name: 'Hwang gend',
));
}
이와같이 순서와 상관없이 안에 선언해주면 된다.
※!!!대신에 함수를 선언할때 파라미터를 중괄호로 감싸줘야한다.
여기서 만약 파라미터 변수에 아무것도 사용자가 입력하지 않는 경우가 생길 수도 있다.
물론 이 코드에서는 그렇지 않지만 실제 어플이나 웹에서 그런 경우가 생기면 dart는
null safety때문에 알아서 null값을 넣지 않는다.
그걸 위해서 default값을 넣어주면 된다.(c++에서처럼)
String sayHello({String name, int age ='50', String country = 'Swiss'}){
return "Hi, I'm $name, $age years old and live in $country .";
}
void main(){
print(sayHello(
age: 입력받은 값이라고 가정,
country:마찬가지,
name: 'Hwang gend',
));
}
이런식으로 default값을 정해주면 문제가 발생치 않는다.
위에서 설명했듯이 만약 사용자가 아무런 매개변수를 제공하지 않았다면
String sayHello({
required String name,
required int age,
required String country,
}){
return "Hi, I'm $name, $age years old and live in $country .";
}
이런식으로 변수형 앞에 required라는 수식언을 넣어주면
애초에 main함수에서 사용자가 필요한 파라미터를 제공하지 않을때 오류가 발생한다.
즉, 파라미터가 꼭 필요함을 선언하는 것이다.
명시적으로 파라미터를 받는 경우말고 한개만 따로 default값을 넣어주고 싶다면
String sayHello(
String name,
int age,
[String? country = 'Korea']
)=>"Hi, I'm $name, $age years old and live in $country .";
void main(){
print(sayHello('Hwang gend',23));
}
대괄호로 해당 변수를 감싸주고 ?를 넣어주면 전달 될 수도 있고 아닐 수도 있다는 것이다.
이 문법은 있다는 것 정도만 알면 될 것 같다.
우선 아래의 코드와 같은 3항 연산자로도 충분히 가능한 구현이다.
String capitalizeName(String? name) =>
name != null ? name.toUpperCase() : 'ANON';
만약 null값을 사용자가 보내왔다면 name != null이 false이므로 ANON이 return 될 것이고
그렇지 않다면 대문자로 변경된 name이 return 될 것이다.
이걸 만약에 QQ operator로 구현한다면?
String capitalizeName(String? name) =>
name?.name.toUpperCase() ?? 'ANON';
name에 null이 들어올 수도 있으니 ?를 넣어주었고
??를 기준으로 좌가 true일때 return값
우측일 때는 false일때 return값이다.
이렇게 했을 경우에 main에서는 어떻게 전달하냐면
void main(){
String? name;
name ??= 'Hwang Gend';
}
이렇게 해주면 된다.
flutter를 할 때 자주 사용하게 된다고 하니 기억하는게 좋을 듯 하다.
typedef는 자료형에 alias를 붙일 수 있게 해준다고 한다.
alias는 통로라는 뜻인 단어인데
실제 사용하는 코드를 보면 뭔지 감이 올 것이다.
typedef = UserName = String;
String sayHello(UserName name)=>return "Hi, I'm $name ";
특히 map같은 자료형을 사용할때 편할 듯 하다.