본 게시글 작성 시점은 Null safety 가 적용된 이후 시점이라 Named Optional Parameters 부분이 다른 블로그/구글자료와 다를 수 있다.
- Edit the package’s pubspec.yaml file, setting the minimum SDK constraint to 2.12.0:
environment:
sdk: '>=2.12.0 <3.0.0'
|
Dart는 객체 지향 언어이다. Dart에서는 모든 것이 객체이기 때문에 함수도 객체이다.
함수가 객체이기 때문에 변수가 함수를 참조할 수 있다. 함수의 인자로 함수를 전달할 수 있다.
int add(int a, int b) {
return a + b;
}
void main() {
int x = 4;
int y = 5;
var z = add(x, y); // 객체이기 때문에 함수를 참조할 수 있다.
print("Output: $z");
}
|
int add(int a, int b) {
return a + b;
}
// return_type func_name(parameters) => expression;
int sub(int a, int b) => a - b; // 람다식 표현
// Lambda functions are also called Arrow functions.
int mul(int a, int b) => a * b ;
void main() {
int x = 10;
int y = 5;
var z = add(x, y); // 객체이기 때문에 함수를 참조할 수 있다.
print("Output: $z"); // Output: 15
print('${x + y} X ${x - y} = ${mul(add(x,y), sub(x,y))}');
// 15 X 5 = 75
}
|
변수 앞에 $ 기호를 붙여 문자열 내에 변수를 삽입할 수 있다.
또한 $ 기호 뒤에 {}로 둘러싸 수식을 포함한 각종 표현식을 사용할 수 있다.
함수의 인자로 함수를 전달한 것을 확인할 수 있다.
선택 매개변수
함수 호출 시 매개변수명을 이용하여 인자 값을 넘겨줄 수 있다. 매개변수명으로 인자 값을 넘겨줄 때 {매개변수명: value}로 해줘야 한다.
// Ordered Optional Parameters
void printSomething(int a, int b, [int c = 99]){
// 필수 매개변수와 선택 매개변수를 함께 사용하고 싶다면
// 필수 매개변수를 앞에 둔다.
print(a + b + c);
}
// Named Optional Parameters
void namedSomething(int a, int b, {int c = 99}){
print(a + b + c);
}
// Named Optional Parameters
void person({required String name, int age = 0}){
print('${name}, ${age}');
}
class Person {
String name;
int age;
Person({required this.name, required this.age });
}
main(){
printSomething(2,3);
printSomething(2,3,5);
namedSomething(2,3);
namedSomething(2,3,c : 10);
person(name: '홍길동', age: 25); // OK
person(name: '홍길동'); // OK
// person(); // error
// Class 에 객체 할당
Person p = Person(name: '홍길동', age: 30);
print('${p.name}, ${p.age}');
}
|
Java 는 선택 인자를 제공하지 않는다. 따라서 선택 인자를 구현하기 위해서는 오버로딩으로 별도로 2개 함수를 작성해야 한다.
이름 있는 인자는 Python 에서도 제공하는데 필수 인자와 선택 인자 모두 이름을 넣을 수 있는 반면,
다트에서는 선택 인자에만 이름을 넣을 수 있다.
null safety 가 적용되어 Named Optional Prameters를 사용하고자 한다면
String 지시어에 ? 가 없으면 반드시 required 를 붙이도록 하고 있다.
// Named Optional Parameters
void person({required String name, int age = 0}){
print('${name}, ${age}');
}
void person1({String? name, int? age}){
print('${name}, ${age}');
}
void person2(String name, {int? age}){
// 다트에서는 모든 것이 객체이기 때문에
// 초기값이 설정되지 않는 것은 0 이 아니라 null 이다.
print('${name}, ${age}');
}
main(){
person(name: '홍길동', age: 25); // 홍길동, 25
person(name: '홍길동'); // 홍길동, 0
// person(); // error
person1(name: '홍길동', age: 30); // 홍길동, 30
person1(name: '홍길동'); // 홍길동, null
person1(age: 30); // null, 30
person1(); // null, null
person2('홍길동'); // 홍길동, null
person2('홍길동', age: 28); // 홍길동, 28
}
|
// Named Optional Parameters
void person({String name='', int age = 0}){
// {} 파라미터를 사용하면 반드시 초기화된 값이나 required 가 필요하다.
print('${name}, ${age}');
}
main(){
person(name: '홍길동', age: 25); // 홍길동, 25
person(name: '홍길동'); // 홍길동, 0
person(age: 25); // , 25
person(); // , 0
}
|
익명함수 및 람다식
익명함수의 기본 형태는 다음과 같다.
(매개변수명) { 표현식; }
람다식의 형태는 다음과 같다.
(매개변수명) => 표현식; // Javascript 에서는 화살표 함수라고 한다.
다트에서 대부분의 함수는 이름을 가지고 있다. 이름 없는 함수로 알려진 익명 함수를 생성할 수 있다.
다트에서 이름이 없는 함수를 익명함수, 람다, 또는 클로저(closure)라고 부른다.
void printElement(int element) {
print(element);
}
main(){
var list = [1, 2, 3];
// Pass printElement as a parameter.
list.forEach(printElement); // 함수명을 매개변수로 전달
/* 익명함수(Anonymous Functions) 문법
(parameter_list){
statement(s); // 함수 구현부
}
*/
const List = ['apples', 'bananas', 'oranges'];
List.forEach((item) {
print('${List.indexOf(item)}: $item');
});
// 만약 익명함수가 한줄이거나 return문이 한줄일 경우 중괄호를 화살표로 바꿔줄 수 있다.
// (파라미터) => 한줄짜리 함수문장;
list.forEach((item) => print('${list.indexOf(item)}: $item'));
// The above example defines an anonymous function with an untyped parameter, item.
// The function, invoked for each item in the list,
// prints a string that includes the value at the specified index.
}
|
'Flutter 앱 > Dart 언어' 카테고리의 다른 글
Dart Class(클래스) (0) | 2022.06.27 |
---|---|
Dart Asynchronous programming(비동기 프로그래밍) (0) | 2022.06.23 |
Dart Type 검사(is, is!) (0) | 2022.06.22 |
Dart const, final (0) | 2022.06.22 |
Dart 변수 var, dynamic, num, int, double (0) | 2022.06.22 |