Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[24주차 1] Flutter 공부: Chapter 2. 다트 객체지향 프로그래밍 #235

Merged
merged 3 commits into from
Jul 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading