diff --git "a/hong/flutter/\354\275\224\353\223\234\355\214\251\353\217\204\353\246\254\354\235\230 \355\224\214\353\237\254\355\204\260 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/ch01.md" "b/hong/flutter/\354\275\224\353\223\234\355\214\251\353\217\204\353\246\254\354\235\230 \355\224\214\353\237\254\355\204\260 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/ch01.md" index a96e700..8dc4336 100644 --- "a/hong/flutter/\354\275\224\353\223\234\355\214\251\353\217\204\353\246\254\354\235\230 \355\224\214\353\237\254\355\204\260 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/ch01.md" +++ "b/hong/flutter/\354\275\224\353\223\234\355\214\251\353\217\204\353\246\254\354\235\230 \355\224\214\353\237\254\355\204\260 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/ch01.md" @@ -360,4 +360,171 @@ bool result = 12 > 10 && 1 > 0; // true bool result2 = 12 > 13 || 1 > 0; // true ``` -### +### 1.6. 제어문 + +제어문으로는 if, switch, for, while을 사용할 수 있다. + +사용 방식은 다른 언어와 같음. + +### 1.7. 함수와 람다 + +함수의 일반적인 특징 + +- 다트 함수에서 매개변수를 지정하는 방법으로 순서가 고정된 매개변수(positional parameter, 위치 기반 매개변수)와 이름이 있는 매개변수(named parameter, 명명된 매개변수)가 있음. +- named parameter를 지정하려면 중괄호 { } 와 required 키워드를 사용해야 함. + +```dart +int addTwoNumbers({ + required int a, + required int b, +}) { + return a + b; +} + +void main() { + print(addTwoNumbers(a: 1, b: 2)); +} +``` + +- required 키워드는 매개변수가 null 값이 불가능한 타입이면 기본값을 지정해주거나 필수로 입력해야 한다는 의미. +- 기본값을 갖는 positional parameter는 [ ] 기호를 사용함. + +```dart +int addTwoNumbers(int a, [int b = 2]) { + return a + b; +} + +void main() { + print(addTwoNumbers(1)); +} +``` + +- 입력값이 하나뿐이라서 두 번째 매개변수에 기본값 2를 적용해 계산한 결과를 반환함. + +```dart +// named parameter에 기본값 적용 +int addTwoNumbers({ + required int a, + int b = 2, // required 키워드를 생략하고 값 입력 +}) { + return a + b; +} + +// positional & named parameter 섞어 사용 +int addThreeNumbers( + int a, { + required int b, + int c = 4, +}) { + return a + b + c; +} + +void main() { + print(addTwoNumbers(a: 1)); + print(addThreeNumbers(1, b: 3, c: 7)); +} +``` + +익명 함수와 람다 함수 + +- 익명 함수(anonymous function)와 람다 함수(lambda function)은 함수 이름이 없고, 일회성으로 사용됨. +- 통상적으로 익명 함수와 람다 함수를 구분하지만 다트에서는 구분하지 않음. +- 익명함수와 람다 함수 표현 방식 + +```dart +// 익명 함수 +(매개변수) { + 함수 로직 +} + +// 람다 함수 +(매개변수) => 단 하나의 statement +``` + +- 익명 함수에 { } 를 빼고 ⇒ 기호를 추가한 것이 람다 함수 +- 매개변수는 아예 없거나 하나 이상이어도 됨. +- 코드 블록을 묶는 { } 가 없는 람다는 함수 로직을 수행하는 statement가 딱 하나인 경우만 사용 가능. +- 람다 함수는 이름을 정하고 미리 선언할 필요가 없어서 global scope로 다룰 필요가 없고, statement가 하나이기 때문에 적절히 사용하면 간결하게 코드를 작성할 수 있어서 가독성이 좋음 (실행하는 위치에 로직 코드가 있기 때문에) +- 때문에 콜백 함수나 list의 map(), reduce(), fold() 함수등에서 일회성이 높은 로직을 작성할 때 주로 사용함. +- 익명 함수 예시: + +```dart +void main() { + List numbers = [1, 2, 3, 4, 5]; + + // 일반 함수로 모든 값 더하기 + final allMembers1 = numbers.reduce((value, element) { + return value + element; + }); + print(allMembers1); + + // 람다 함수로 모든 값 더하기 + final allMembers2 = numbers.reduce((value, element) => value + element); + print(allMembers2) +} +``` + +typedef와 함수 + +- typedef 키워드는 함수의 시그니처를 정의하는 값으로 보면 됨. +- 여기서 시그니처는 반환값 타입, 매개변수 개수와 타입 등을 말함. +- 즉 함수 선어부를 정의하는 키워드 + +```dart +typedef Operation = void Function(int x, int y); + +void add(int x, int y) { + print(`결과값 : ${x + y}`); +} + +void substract(int x, int y) { + print(`결과값 : ${x - y}`); +} + +void main() { + // typedef는 일반적인 변수의 type처럼 사용 가능 + Operation oper = add; + + oper(1, 2); // 결과값 : 3 + + oper = substract; + oper(1, 2); // 결과값 : -1 +} +``` + +- 다트에서 함수는 일급 객체(first-class citizen)이므로 함수를 값처럼 사용할 수 있음. +- 그래서 flutter에서는 typedef으로 선언한 함수를 다음과 같이 매개변수로 넣어 사용함. + +```dart +typedef Operation = void Function(int x, int y); + +void add(int x, int y) { + print(`결과값 : ${x + y}`); +} + +void calculate(int x, int y, Operation oper) { + oper(x, y); +} + +void main() { + calculate(1, 2, add); // 결과값 : 3 +} +``` + +### 1.8. try … catch + +- 다른 언어와 사용 방식 같음. + +```dart +void main() { + try{ + final String name = 'roo'; + + throw Exception('wrong name'); + + print(name); + }catch(e){ + print(e); // Exception: wrong name + } +} +```