>
## 변수 종류
- int : 정수 ex) int age = 20;
- double : 실수 ex) double height = 168.9;
- String : 문자열 ex) String name = "봉드로이드";
- bool : 참/거짓 ex) bool isStudent = false;
- List
- Set
- Map
## 반복문(for문)
```example
for( [반복 시작 시점] ; [반복 종료 시점] ; [증감값] ){
로직
}
```
```dart
void main() {
var sum =0;
for(var i = 0; i < 1000; i++){
sum+=i;
}
print(sum); // 499500
}
```
## 함수
```example
반환타입 함수이름(매개변수1, 매개변수2, ...) {
// 비즈니스 로직 구현부
return 반환값;
}
```
- 반환타입 : 함수가 반환하는 값의 타입을 명시함. 반환값이 없는 경우 void 사용.
- [[부트캠프_Flutter 앱개발 - 반복문, 함수, 조건문, 동기-비동기, 클래스#변수 종류]]
#### 예시
```dart title:"두 수의 뺄셈 예제 (포지셔널 파라미터 - 기본 형태)"
int substract(int a, int b) {
int sum = a - b;
return sum;
}
void main() {
int result = substract(3, 5);
int result2 = substract(5, 3);
print('결과: $result'); // 출력: 결과: -2
print('결과: $result2'); // 출력: 결과: 2
}
```
- 포지셔널 파라미터 (positional parameters) : 파라미터의 순서를 의미한다. 위 substract 라는 함수의 int a, int b라는 파라미터의 고정된 순서를 의미한다.
```dart hl:7-8 title:"네임드 파라미터의 두 수의 뺄셈 예제"
int substract({required int frontValue,required int endValue}) {
int sum = frontValue - endValue;
return sum;
}
void main() {
int result = substract(frontValue : 3 , endValue : 5);
int result2 = substract(endValue : 5 , frontValue : 3);
print('결과: $result'); // 출력: 결과: -2
print('결과: $result2'); // 출력: 결과: -2
}
```
- 네임드 파라미터(named parameters) : 파라미터 전달 시 이름을 지정해서 전달하는 것. 그렇기에 위치가 변해도 상관없다. 위 예제처럼 frontValut, endValut를 네임드 파라미터라 하며, 위치가 변해도 해당 파라미터로 값이 지정되어 들어간다.
```dart hl:7-8 title:"네임드 파라미터의 옵셔널한 예제"
int add({required int frontValue,required int endValue, int? expansionValue}) {
int sum = frontValue + endValue + (expansionValue??0);
return sum;
}
void main() {
int result = add(frontValue : 3, endValue : 5);
int result2 = add(frontValue : 3, endValue : 5, expansionValue : 3);
print('결과: $result'); // 출력: 결과: 8
print('결과: $result2'); // 출력: 결과: 11
}
```
- 옵셔널한 파라미터(optional parameters) : 말 그대로 옵션 값이라는 의미다. 전달해도 되고, 전달하지 않아도 되는 파라미터다. 그렇기에 필수인 네임드 파라미터는 required 라는 '필수' 표시가 되어있지만, 옵셔널 파라미터는 물음표를 붙여넣은 것이다.
1. 옵셔널한 파라미터값은 변수타입에 물음표를 붙이면 된다.
2. 옵셔널한 파라미터값은 값이 없어도 함수가 작동된다. 즉, 유동적으로 값이 있는 경우와 없는 경우 작동하도록 할 수 있다. 조금 더 가변적이다라고 볼 수 있다. 확장성이 좋다고도 볼 수 있다.
## 조건문(if/else문, switch문)
### if/else문
```example
if( 조건 비교 ){
참인 경우 실행될 로직
} else {
위 조건이 거짓일 경우 실행될 로직
}
```
```dart title:"if/else 예시"
void main() {
int number = 3;
if (number > 5) {
print('number는 5보다 큽니다.');
} else {
print('number는 5보다 크지 않습니다.');
}
}
```
### switch문
```example
switch( 확인할 변수 ) {
case [환인할 변수에 해당되는 값] :
실행로직;
break;
case [환인할 변수에 해당되는 값2] :
실행로직;
break;
case [환인할 변수에 해당되는 값3] :
실행로직;
break;
default:
모든 case에 해당되지 않는 경우 실행 로직 ;
}
```
```dart title:"switch 예시"
void main() {
int number = 2;
switch (number) {
case 1:
print('number는 1입니다.');
break;
case 2:
print('number는 2입니다.');
break;
case 3:
print('number는 3입니다.');
break;
default:
print('number는 1, 2, 3 중 하나가 아닙니다.');
}
}
```
#### switch문 참고
- enum 타입인 경우에는 switch문이 훨씬 낫다. enum이란 enumerated type의 줄임말로, 열거형이라 부른다. 예를 들어, 행동을 정의할 때, walk, run, jump, sit, sleep 이란 타입이 있다고 치자.
```dart title:"enum 참고 : 1단계"
enum Action {
walk,
run,
jump,
sit,
sleep,
}
void main() {
var action = Action.jump;
switch (action) {
}
}
```
1. 위와 같이 쓰면 switch 구문에 에러창이 뜸
2. 그 때 [command+.(쩜)] 누르면 "Add missing switch cases"라는 문장이 뜸
3. 그걸 누르면 아래와 같이 자동 완성됨.
```dart title:"enum 참고 : 2단계"
enum Action {
walk,
run,
jump,
sit,
sleep,
}
void main2() {
var action = Action.jump;
switch (action) {
case Action.walk:
// TODO: Handle this case.
throw UnimplementedError();
case Action.run:
// TODO: Handle this case.
throw UnimplementedError();
case Action.jump:
// TODO: Handle this case.
throw UnimplementedError();
case Action.sit:
// TODO: Handle this case.
throw UnimplementedError();
case Action.sleep:
// TODO: Handle this case.
throw UnimplementedError();
}
}
```
## 동기/비동기(async, await)
```dart title:"동기 방식 소스코드"
void main() {
print('print1');
performTask();
print('print3');
}
void performTask() {
print('print2');
}
```
- void main 함수 내에 있는 순서대로 작업 수행. print1 > print2>print3
```dart title:"비동기 방식 소스코드"
void main() {
print('print1');
performTask();
print('print3');
}
Future<void> performTask() async {
await Future.delayed(Duration(seconds: 2));
print('print2');
}
```
- void main 함수 내에 완료되는 순서대로 작업 수행. print1 > print3 > print2
- print2은 2초 딜레이를 걸어놨기 때문에 print3보다 먼저 시작되었지만, 출력은 나중에 된다.
```dart hl:3 title:"비동기를 동기 방식으로 처리하는 코드"
void main() async{
print('print1');
await performTask();
print('print3');
}
Future<void> performTask() async {
await Future.delayed(Duration(seconds: 2));
print('print2');
}
```
- void main 함수 내 순서대로 실행된다. print1 > print2 > print3
- 단, print2 실행 되기 전 2초 딜레이 후 실행된다.
- 3번째 줄에 await을 붙여야만 동기방식으로 순서대로 처리된다. 그렇지 않으면(await을 지우면) print1 > print3 > print2 순서대로 실행된다.
## 클래스(객체)
```example
class [클래스명] {
생성자()
맴버변수//특성
메서드(){
//기능
}
}
```
```dart title:"클래스 예시"
class Human {
// 특성특성
final String id;
final String name;
int age;
final Gender gender;
// 생성자
Human({
required this.id,
required this.name,
required this.age,
required this.gender,
});
// 기능 addAge라는 함수(메서드) 넣은 것.
void addAge(){
age++;
}
}
enum Gender { M, W} // Gender의 경우 남자인지 여자인지 표시해줘야해서 따로 넣음.
```
- final 은 한번 값을 넣으면 바꿀 수 없음을 선언함. 즉, 나이는 매년 변경되기 때문에 final로 설정하지 않은 것임.
```dart title:"클래스 활용 예시"
void main() async {
var totalYears = 10;
print('프로그램 시작');
var man = Human(
id: '860319-xxxxxxx',
name: '김성덕',
age: 39,
gender: Gender.M,
);
for (var currentYear = 1; currentYear < totalYears; currentYear++) {
await Future.delayed(Duration(seconds: 1));
print('$currentYear년이 흘렀습니다.');
man.addAge();
print('${man.name}은 ${man.age} 나이입니다.');
}
print('프로그램 종료');
}
```
[부트캠프] 1일차 (0) | 2025.03.03 |
---|---|
[부트캠프] 사업계획서 목차 (0) | 2025.02.21 |
[부트캠프] 관련 용어 정리 (0) | 2025.02.20 |
[부트캠프] 2주차 강의 (0) | 2025.02.19 |
[부트캠프] 창업을 하고 싶은 이유 및 10가지 질문(w. 스파르타코딩클럽) (0) | 2025.02.10 |