Skip to content

Commit

Permalink
[24주차 1] Flutter 공부: Chapter 2. 다트 객체지향 프로그래밍 (#235)
Browse files Browse the repository at this point in the history
* Update ch01.md

* Create ch02.md

* Create 학습 계획.md
  • Loading branch information
deepbig authored Jul 28, 2024
1 parent b55ddd4 commit 52b064f
Show file tree
Hide file tree
Showing 3 changed files with 532 additions and 1 deletion.
169 changes: 168 additions & 1 deletion hong/flutter/코드팩도리의 플러터 프로그래밍/ch01.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<int> 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
}
}
```
Loading

0 comments on commit 52b064f

Please sign in to comment.