Dart 기초 문법
Updated:
1.변수 선언법
void main() {
var name = 'test code';
print(name);
}
- 변수 선언은
var
이름은name
value 는test code
가 됩니다.
2.변수 타입
var
로 변수 선언할때 타입을 모를때 쓰는거고, 각 타입별로 변수 타입이 있습니다.
정수 선언
void main() {
int number1 = 12;
print(number1);
int number2 = 38;
print(number2);
print(number1 + number2);
print(number1 - number2);
print(number1 * number2);
print(number1 / number2);
}
실수 선언
-
실수는 정수와 다르게 소수점을 사용할 수 있는 숫자
-
주의 할 점은 정수는 실수에 포함되기 때문에
double
은 int 대시에 사용해도 된다 단! int 인 정수는 소수점이 있는 실수로 사용이 안됩니다.
void main() {
double number3 = 2.5;
double number4 = 0.5;
print(number3);
print(number4);
double number5 = 12;
}
문자 선언
-
String
은 시작할때 대문자로 시작해야 합니다 -
기본적으로 사칙연산은 안되지만, + 하게 되면 string 을 합칩니다
void main() {
String name = 'hello';
String name2 = ' world';
print(name + name2);
// + 말고도 $ 사용해서 변수로 인식해서 붙일 수 있음
print('$name$name2'); // hello world
// string 말고도 number 도 $ 를 이용해서 붙여서 사용할 수 있습니다
int age = 30;
String sentence = '나의 나이는 $age 입니다';
print(sentence); // 나의 나이는 30 입니다
}
Boolean 선언
- dart 에서는 줄여서
bool
이라고 쓰입니다
void main() {
// Boolean
bool isTrue = true;
bool isFalse = false;
print(isTrue); // true
print(isFalse); // false
}
var, dynamic 타입 선언
-
타입을 선언하지않고서 자유롭게 사용할 수 있는 type을
var
입니다. -
처음 var 가 선언이 되면 그 타입으로 인식하기 때문에 나중에 다른 타입으로 바꾸려고 하면 type error 가 발생됩니다.
void main() {
var name = 'Jacob';
print(name);
var number = 5;
// 이미 var number 는 int 타입으로 지정되기 때문에 type error
number = 'Mike' // 타입 error
// dynamic 은 var 와 다르게 type을 저장하지 않기 때문에 나중에 선언된 타입으로 변수의 타입이 전환 됨
dynamic name2 = 'John';
name2 = 5;
print(name2); // 5 로 잘 출력이 됨
// 참고! dymamic 은 type 에 혼선이 있기 때문에 flutter 에서는 dynamic 은 거의 안쓰임 var 도 잘 안쓰임
// 만약 var 가 value 값이 선언이 안될을 경우, 나중에 값을 넣을때 string, int 등 상관없이 value 값이 사용될 수 있다 (마치 dynamic 처럼.) 거의 사용되지 않긴 함
var name3;
name3 = 'Emma';
name3 = 1;
print(name3); // 1
}
- 모든 변수를 type 에 상관 없이 var 로 진행 해도 상관 없긴 하지만, 실제 프로젝트에서는 var 는 거의 사용되지 않는다. 왜냐하면, 코드의 양이 많이 질 경우 type 에 혼선이 되기 때문에 직접적으로
int, double, String, bool
으로 사용함
3.List
void main() {
// list 선언하는 2가지 방식
List number1 = [];
// List number2 = new List();
// list 에 값 넣기
number1.add(1); // 1추가
number1.add(2); // 2추가
number1.add(3); // 3추가
print(number1[1]); // 2 출력
// list 에 값 빼기
number1.removeAt(2); // number1 의 2번 인덱스 인 3이 삭제
print(number1); // [1, 2] 출력
// list 에 값 수정
number1[0] = 99;
print(number1); // [99, 2] 출력
// list 에 type 선언 어떠한 type 이 들어갈지 미리 지정을 해놓으면 그 타입만 들어가게 됨
List<String> name = [];
name.add('Jacob');
print(name); // [Jacob] 출력
// name.add(1); // parameter 가 String 만 되어야 되서 error 발생
// value 값을 지정해서 선언
List<String> people = ['Jacob', 'Emma', 'John'];
print(people);
// list 의 길이
print(people.length); // 3
}
4.Map
-
key, value 의 값을 가지고 pair 의 구조입니다.
-
값을 변경할때는 list 는 index를 사용하지만, map 은 key 값을 사용합니다
void main() {
// Map 선언
Map dic = {'apple': '사과', 'bananna': '바나나', 'melon': '멜론'};
print(dic); // {apple: 사과, banana: 바나나, melon: 멜론}
print(dic['apple']); // 사과
// empty map 생성 후에 값 집어 넣기
Map dic2 = {};
dic2.addAll({'apple': '사과', 'bananna': '바나나', 'melon': '멜론'});
print(dic2);
// map 에서 지우기
dic2.remove("apple");
print(dic2); // {banana: 바나나, melon: 멜론}
// map 에서 값 변경하기
dic2['banana'] = '바나나 아님';
print(dic2); // {banana: 바나나 아님, melon: 멜론}
// map 선언하는 다른 방법
Map dic3 = new Map.from({
'apple': '사과',
'banana': '바나나',
});
print(dic3); // {apple: 사과, banana: 바나나}
// key, value 값만 출력하기 (list로 변환)
print(dic3.keys.toList()); // [apple, banana]
print(dic3.values.toList()); // [사과, 바나나]
// Map 에서 type 지정
// list나 map 에서 아래와 같이 항상 type 을 지정해 주고 사용하는 것을 추천함
Map<String, int> price = {
'apple': 2000,
'bananna': 4000,
'melon': 6000,
};
print(price); // {apple: 2000, bananna: 4000, melon: 6000}
// map 에서의 key 는 절대적으로 unique 해야 됨, 똑같은 key 값이 중복되서 사용될 수 없다. 즉 map 에서 key 값은 고유 하나의 값밖에만 있어야 함
}
5.변수에 대한 몇가지 rule
-
변수의 타입이 같던 다르던 같은 이름의 변수는 선언할 수 없습니다
-
변수의 시작은 소문자로 시작합니다
-
변수안에는 띄어 쓰기가 안됩니다 (camelCase 로 사용)
-
변수명에 _ (underscore) 를 앞에 사용해서 선언 할 수 있는데, class 에서 private 변수가 있는데 사용됩니다
-
class 를 선언할 때는 대문자로 시작해서 변수를 선언합니다
6.Final, Const
-
둘다 공통적으로 변수를 선언하고나서, 선언된 변수가 변경되지 않도록 하는 기능입니다.
-
두가지의 큰 차이점은
const
컴파일 타임에 값이 지정이 되어 있어야 하고,final
은 런타임 상태에서도 값이 지정되어 있어야 합니다 -
일반적인 상황에서는 런타임 상태에서도 사용이 가능한
final
을 주로 사용합니다.
void main() {
// final: 변수의 값이 변경되지 않게 하는것
final String name = 'Jacob';
// name = 'Emma'; // error 발생 변수 마꾸는것 못함
// final 은 런타임의 값이 지정이 되어도 상관이 없음
// dateTime 함수 코드가 실행되는 순간에 시간을 나타냄
final DateTime now = DateTime.now();
print(now);
// 1초뒤에 실행 하는 함수
Future.delayed(Duration(milliseconds: 1000), () {
final DateTime now2 = DateTime.now();
print(now2);
});
// const는 compile 할때 시점을 알아야 되기때문에 현재 DateTime.now() 의 값을 현재 시점에서 알수 없기 때문에 const는 사용할 수 없음
// dateTime 함수 코드가 실행되는 순간에 시간을 나타냄
const DateTime now3 = DateTime.now();
print(now3);
// 1초뒤에 실행 하는 함수
Future.delayed(Duration(milliseconds: 1000), () {
const DateTime now4 = DateTime.now();
print(now4);
});
}
7.Operator
void main() {
// 사칙 연산
int number = 2;
print(number + 2); // 4
print(number - 2); // 0
print(number * 2); // 4
print(number / 2); // 1.0
print('---------');
// 나머지 값 (배수 값 구할때 사용 나머지값이 0일경우에 사용)
print(number % 3); // 2
// ++, --
number++;
print(number); // number + 1 = 3
number--;
print(number); // number - 1 = 2
print('---------');
// += , -=, *=,
number += 3;
print(number); // number + 3 = number
// /= 나누기를 하게되면 dart 에서는 변수 타입이 double 로 인식을 하게 됨 그래서 나누기를 하려면 int 를 사용하면 안됨
// 비교 연산자
int number1 = 1;
int number2 = 2;
print(number1 <= number2); // true
print(number1 >= number2); // false
print(number1 == number2); // false 같은거 비교
print(number1 != number2); // true 다른거 비교
// type 비교
print(number is int); // ture 타입의 같은것을 비교
print(number is String); // False
print(number is bool); // False
print(number is! String); // ture 다른것 비교
// 논리 operator
// && and , || or
bool result = 2 > 10 && 1 > 0;
print(result); // false
bool result2 = 2 > 10 || 1 > 0;
print(result2); // true
}
8.조건문(if, switch)
if문
void main() {
// 4의 배수인지의 조건문
int number = 21;
if (number % 4 == 0) {
print('4의 배수 입니다');
} else if (number % 4 == 1) {
print('나머지가 1입니다');
} else {
print('해당조건에 맞지 안습니다');
}
}
switch 문
void main() {
// 4의 배수인지의 조건문
int number = 21;
switch (number % 4) {
case 0: // 값이 0일 경우
print('4의 배수 입니다');
break; // case 에 해당되었을때 switch 문을 빠져나오라는 것 꼭 break 를 사용해야 함 switch 문에서는
case 1:
print('나머지가 1입니다');
break;
case 2:
print('나머지 2입니다');
break;
default:
print('어떠한 조건에도 맞지 않습니다.');
}
}
- if 경우 좀 복잡한 연산 할때 자주 사용되고 switch 는 단순한 조건문일때 사용됩니다. switch 는 추가적인 조건을 넣지 못합니다. 대신, switch 문이 응답속도는 더 빠르게 작동 합니다.
9.반복문 for, while
for loop
void main() {
// 0부터 9까지 반복 출력
for (int i = 0; i < 10; i++) {
print(i);
}
// 리스트의 합을 구하기
List<int> numbers = [1, 2, 4, 5, 6, 8, 9];
int sum = 0;
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i]; // number 에 합을 누적
}
print(sum); // 35
// for in : index 없이 값만 가지고 for loop 돌릴때 잘 사용됨
int total = 0;
for (int number in numbers) {
total += number;
}
print(total); // 35
}
while
void main() {
// while loop : 해당 조건이 ture 일 동안 계속 반복 하는것
// while 무한으로 돌지 않게 주의 할 것
int number = 10;
while (number < 20) {
print(number); // 10 ~ 19
number++;
}
// do while : 조건이 나중에 계산을 함
do {
print(number);
number++;
} while (number < 20);
}
break, continue
void main() {
// break 는 조건에 해당되면 while loop 를 종료 시켜 버림
while (number < 20) {
print(number);
number++;
if (number == 15) {
break;
}
}
for (int i = 0; i < 10; i++) {
print(i);
if (i == 5) {
break;
}
}
// continue 는 건너뛰고 계속 하라는것임 스킵임
for (int i = 0; i < 10; i++) {
if (i == 5) {
continue;
}
print(i); // 5가 skip 이 되고 0 ~ 9 까지 출력
}
}
10.Enum
- enum 을 사용하면 한정된 option 을 효율적으로 사용할 수 있게 됨
// enum 을 사용해서 그 값을 정해 놓고 그것을 꺼내서 사용함
enum Status {
approved,
rejected,
pending,
}
void main() {
// approved, rejected, pending 상태가 있을때
String status = 'approved';
// approve 라고 스펠링 error 가 되었을때 if 문이 false 가 되기때문에 else 로 넘어감
if (status == 'approve') {
print('승인되었습니다');
} else {
print('반려나 대기가 되었습니다');
}
// enum 을 사용 위험성이 적게 사용할 수 있게 됨
Status status1 = Status.approved;
if (status1 == Status.approved) {
print('승인되었습니다');
}
print(Status.values.toList()); // [Status.approved, Status.rejected, Status.pending]
}
11.Function
void main() {
List testList = [1, 3, 5, 8, 8];
List testList2 = [2, 6, 7, 9, 8];
// addList 함수 실행
// 함수에서 return 값을 result 로 변수 선언
int result = addList(testList);
print(result);
addList(testList2);
}
// 함수 : 중복되는 code 를 재사용하기 위해 사용
// 함수 선언문
// return 을 할때 return 되는 값의 type 을 명시 해줘야 함
int addList(List testList) {
int total = 0;
for (int number in testList) {
total += number;
}
print(total);
return total;
}
optional parameter
-
parameter 을 여러개 사용할때, 함수 실행하는 부분에서 parameter 값의 위치, type 이 정확히 맞아야 하는데 만약 하나라도 빠지면 함수가 실행되지 않게 됨 그럴경우 선언부 parameter 에서 [] 로 감싸게 될경우에는 optional 이 되기때문에 함수가 그대로 실행되게 됩니다
-
optional 하게 됬는데 위에 code 처럼 b 값이 안들어올때는
null
이 되는데 만약 null 일경우에 b 의 default 값을 설정 해 줄 수 있습니다.
// b 값이 null 일때 3으로 default 값을 주는것
int addList(List testList, int a, [int b = 3]) {
int total = 0;
for (int number in testList) {
total += number;
}
print(total);
return total;
}
12.typedef
- typedef 를 사용하면 함수를 signature 화해서 여러가지 함수를 유용하게 다룰수 있게 합니다.
void main() {
Operation oper = add;
oper(1, 3); // x + y 는 4 입니다
oper = subtract;
oper(4, 2); // x - y 는 2 입니다
}
// 함수를 변수처럼 사용할 수 있게 됨
typedef Operation(int x, int y);
void add(int x, int y) {
print('x + y 는 ${x + y} 입니다');
}
void subtract(int x, int y) {
print('x - y 는 ${x - y} 입니다');
}
void main() {
calculate(1, 2, add); // x 더하기 y 는 3 입니다
calculate(1, 2, subtract); // x 빼기 y 는 -1 입니다
}
typedef Operation(int x, int y);
void add(int x, int y) {
print('x 더하기 y 는 ${x + y} 입니다');
}
void subtract(int x, int y) {
print('x 빼기 y 는 ${x - y} 입니다');
}
void calculate(int x, int y, Operation oper) {
oper(x, y);
}
🔶 🔷 📌 🔑
Leave a comment