오늘은 다트의 간단한 함수 내용들에 대해 포스팅을 해 볼 것이다!
앞에서 다른 문법들을 다루면서 우리는 기본적인 main함수를 기준으로 봤다.
void main(){}
이런 형태로 함수가 생겼었는데 여기서 void
는 뭘까?
void : 함수가 아무것도 값을 반환하지 않음을 명시해주는 것이다.
그럼 반환해주는 값이 있다면 그 반환값의 타입을 함수 앞에 명시해주면 된다!
함수가 간단히 한 줄이라면 단순히 fat arrow syntax
를 사용해서도 표현할 수 있다.
void potato(String thing) {
print("This is $thing");
}
void main() {
potato('potato');
}
potato라는 함수는 void
로 선언되었기 때문에 return을 넣어주면 에러가 발생한다.
위의 함수를 main에서 실행해주면
이렇게 출력되는 것을 확인할 수 있다.
그럼 함수가 값을 리턴하게 하려면 어떻게 할까?
반환할 값의 타입을 void
대신 함수 앞에 명시해주면 된다
String potato(String thing) {
return 'This is $thing';
}
void main() {
print(potato('potato'));
}
이렇게 해주면 potato라는 함수는 문자 타입의 값을 반환하는 함수가 된다.
위의 함수처럼 한 줄 짜리의 단순히 값을 리턴해주기만 하는 경우 fat arrow syntax
를 활용해서도 표현이 가능하다
String potato(String thing) => 'This is $thing';
이렇게 해주면 위의 코드와 똑같은 의미이다.
파라미터가 하나가 아니라 두 개여도 위의 예시들처럼 각 파라미터의 타입을 명시해서 넣어주면 된다.
간단히 더하기를 구현한 함수의 예시로 작성해보면 아래와 같이 코드를 작성할 수 있다.
num plus(num a, num b) => a + b;
파라미터가 많아지면 해당 파라미터들의 순서를 모두 기억해야 하는 것이 번거로울 수 있다.
이러한 불편함을 해소하는데에 매우 좋은 기능이 named argument
이다!
즉, 파라미터들의 순서를 기억하지 않아도 함수의 정의를 보고 파라미터들의 이름에 따라서만 데이터를 넣어주면 된다.
named arguments
를 사용할 거라는 것을 함수에 알려주는 것은 파라미터들을 {}
로 감싸주기만 하면 된다.
원래였으면 우리는 함수를 작성하고 호출할 때 아래와 같이 했을 것이다.
String sayHello(String name, int age, String city) {
return "My name is $name. I'm $age. I'm from $city";
}
void main() {
print(sayHello('sso', 23, 'Korea'));
}
이러한 경우 함수 호출 시 argument들의 순서가 바껴서 타입이 달라지거나 하면 에러가 발생할 수도 있고 모든 순서를 기억하는 것이 힘들다.
위의 코드를 named argument
를 활용해서 바꿔보자.
String sayHello({String name = 'name', int age = 0, String city = 'USA'}) {
return "My name is $name. I'm $age. I'm from $city";
}
void main() {
print(sayHello(name: 'sso', city: 'Korea', age: 23));
}
이렇게 수정해주면 함수를 호출할 때 인자들의 순서가 달라도 에러가 발생하지 않는다.
하지만 위와 같이 named argument
를 사용할 경우 다트는 null safety기능을 가지고 있으므로 null값이 들어와 에러가 발생할 것을 대비해서 함수의 파라미터들의 default값을 꼭 지정해줘야 한다.
함수에 값을 넣지 않고 호출을 하면 default값을 넣어 출력되는 것을 확인할 수 있다.
만약 우리가 데이터 값을 넣어주는 것이 아닌 사용자로부터 받아와야 하는 경우라면 혹은 default값을 지정해주고 싶지 않다면 어떻게 해야 할까?
그때는 각 파라미터의 맨 앞에
required
를 붙여주면 된다!
String sayHello(
{required String name, required int age, required String city}) {
return "My name is $name. I'm $age. I'm from $city";
}
이렇게 해주면 함수에 인자가 들어오지 않았을 경우 다트는 이를 감지하고 함수를 컴파일하지 않는다!
함수를 호출할 때 인자를 넣어주지 않더라도 함수가 잘 작동하도록 하려면 어떻게 해야 할까?-?
그때는
[]
로 파라미터를 감싸주고 타입 뒤에?
를 붙여주고 해당 파라미터의 default값을 지정해주면 된다.
String sayHello(String name, int age, [String? city = "Korea"]) {
return "My name is $name. I'm $age. I'm from $city";
}
위처럼 함수를 작성해주면 city
파라미터는 함수를 호출할 때 전달되는 인자 값이 없다면 알아서 default값인 Korea가 들어가서 함수가 작동한다.
우리는 함수를 작성하면서 간단한 조건문의 경우 삼항연산자를 자주 사용하고는 한다.
삼항 연산자란?
조건이조건 ? 참 : 거짓
이런 형태로 조건이 참이라면참
에 해당하는 것을, 거짓이라면거짓
에 해당하는 코드를 실행한다.
이런 코드를 더 간략하게 줄일 수 있는게 바로 ??
연산자다!
하나 예시를 들어보자.
문자 타입의 name
을 받아 대문자로 바꿔주는 함수를 만든다.
null
값이 들어올 경우 Not
을 리턴하도록 삼항 연산자를 사용해 함수를 작성했다.
String capitalize(String? name) => name != null ? name.toUpperCase() : 'Not';
void main() {
capitalize('sso');
capitalize(null);
}
그럼 이제는 위의 함수를 ??
연산자를 사용해 작성해보자.=
우선
??
연산자의 의미부터 알아보자.left ?? right
??
를 기준으로 좌항이 null일 경우 우항을 리턴하고, null이 아니라면 좌항을 그대로 리턴한다는 의미이다.
위의 코드를 바꿔보면 아래와 같이 바꿀 수 있다.
name
이 null
일 경우에도 toUpperCase()
함수를 실행할 수 있도록 name
뒤에 ?
를 붙여 name?.toUpperCase()
와 같이 작성해준다.
String capitalize(String? name) => name?.toUpperCase() ?? 'Not';
void main() {
capitalize('sso');
capitalize(null);
}
이렇게 작성해주면 인자로 null
이 들어갔을 때 함수를 실행해보면 좌항의 값이 null
이므로 Not
을 리턴한다.
(에고 이미지가 너무 크게 들어가넹,,)
??=
연산자는 변수의 값이 null
일 경우 null
대신의 값을 설정해주는 연산자이다.
void main(){
String? name; //null이 될 수 있는 변수
name ??= 'sso';
name = null; //name의 값이 null이 됨
name ??= 'another'; //name의 값이 null이므로 대신 another이라는 값을 넣어준다
}
위의 코드에서 name
을 출력해보면 another
이 출력되는 것을 확인할 수 있다.
다트의 함수 관련 내용은 매우 많지만 간략한 내용들에 대해서 다뤄보았다👩🏻💻
다음 포스팅에서는 다트의 클래스에 대해서 기본적인 내용들을 알아볼 예정이다!
-끝-