Study/Dart & Flutter
[Dart] 다트(Dart) 기본 문법 정리
growingtree
2023. 11. 19. 15:57
728x90
유튜브 코딩 팩토리님의 <1시간만에 끝내는 Dart언어 기본기> 를 듣고 개인적으로 정리한 글입니다.
1. 변수 선언 및 변수의 타입
//변수 선언
//변수타입 변수명 = 값 ;
//1. var 타입
var name = "지민";
//2. String 타입
String myname = "지민";
//3. int 타입
int number = 50;
//4. double 타입
double fnumber = 3.14;
//5. Boolean 타입
bool isTrue = true;
bool isFalse = false;
//6. Dynamic 타입
dynamic txt = "헬로";
dynamic num = 100;
// Dart 에서 출력할 때는 print문을 사용한다.
print(name);
print(myname);
print(number);
print(fnumber);
print(isTrue);
print(isFalse);
print(txt);
print(num);
// print문에서 포맷팅도 가능하다
// "${}"
print("my name is ${name}");
print("$txt ,$name"); //타입이 String일 경우 이런 식으로 간단하게도 표현 가능함
Q : 변수 타입 중 var 와 dynamic의 차이는?
A : dynamic은 말그대로 변수의 타입을 원하는대로 막 바꿀 수 있다. var의 경우는 한 번 적용된 변수 타입은 변경할 수 없다.
//dynamic dynamic val = 50 ; // int val = "안녕하세요"; // String print(val); // 안녕하세요 출력 (타입을 int -> String 으로 변경됨) //var var val2 = 1234.5678; //double val2 = true; //boolean print(val2); // val2를 bool로 바꿀 수 없음.
Q: 변수 타입 중 var 와 String의 차이는?
A : var는 = 기준 오른쪽 값으로 타입 유추가 가능하며, 런타임 시 var 의 타입이 오른쪽 값의 타입으로 변경된다.
var name = "지민"; print(name); print(name.runtimeType); //런타임 시 name의 타입 출력 var num = 50; print(num); print(num.runtimeType);
2. Final vs Const
//final은 변수 선언 제일 앞에다가 붙인다.
//final이랑 var랑 같이 올 수 없음.
//final로 선언하면 값 변경이 불가능하다.
final String name = "지민";
print(name); // 지민이 출력됨. name의 값은 지민으로 고정됨
//const는 변수 선언 가장 앞에다가 붙인다.
//const로 선언하면 값 변경이 불가능하다.
const int zero = 0;
print(zero); //변수 zero의 값은 0으로 고정됨.
//간단하게 쓰는 방법
final name = "지민";
const zero = 0;
Q : Final, Const 모두 선언 시 값이 고정되는 건 같은데 차이점이 무엇인지?
A : Final 과 Const 의 가장 큰 차이는 생성 시점이다.
final의 경우, 실행 시점(런타임)에 값을 결정하지만 const의 경우 컴파일 시 값을 결정하게 된다.
Q: 실행시점이 다른게 뭐가 중요한가?
A : 미세한 차이지만 const 의 경우 컴파일 시 값을 결정해주기 때문에 런타임에서 할 일이 줄어듦 (런타임 성능이 높아짐)
관련 참고 블로그 : https://couldi.tistory.com/33
3. 연산자
// 사칙연산 (더하기, 빼기, 곱하기, 나누기)
double num = 4.0;
print(num + num); //더하기
print(num - 1); //빼기
num *= 2; //곱하기
print(num);
num /= 2; //나누기에서 몫
print(num);
num %= 3; //나누기에서 나머지
print(num);
//증감연산자
int number = 5;
number++; //number 에다가 +1 한 값
print(number);
number--; //number 에다가 -1 한 값
print(number);
//String 도 연산이 된다! (빼기, 나누기는 안됨)
String name = "지민";
print(name + name);
print(name *2);
//null 조건 오퍼레이터
double? number = 4.0; //double타입 뒤에 ?를 붙이면서 nullable한 변수가 됨.
number = 2.0; // 가능
number = null; //가능
number ??= 3.0; // ??=의 의미는 number 가 만약에 null이면 오른쪽 값으로 바꾸라는 의미
//크기 비교 (<, >. <= , >= , == , !=)
int num = 1;
int num =2 ;
print(num1 > num2); // T/F로 리턴된다.
// 타입 비교 오퍼레이터 (is, is!)
int num1 = 1;
pruint(num1 is int) // num1이 int 형인지?
print(num is! int)// num1이 int 형이 아닌지?
// AND (&&로 표시) 두 가지 조건 모두 만족해야함
bool result = 12 > 10 && 1 >0; // 두 가지 조건을 모두 만족하는 (둘 다 True 여야지만)
print(result);
// OR (||로 표시) 두 가지 조건 중 하나만 만족해도 됨.
bool result 12 > 10 || 0 > ; //둘 중 하나만 True 여도 True
print(result);
4. List
// 여러 개의 값을 하나의 리스트로 저장 가능
// 형태 : List <타입> 변수명 = [값1, 값2, 값3, ...]
// <>는 우리가 제너릭이라고 부르는데, 제너릭 안에다가 선언한 타입만 리스트에 넣을 수 있다.
List <String> students = ["지민", "철수", "유리", "훈이", "맹구"];
print(students);
// List의 인덱스를 사용해 특정 위치에 있는 값을 가져올 수 있다.
// 인덱스는 0부터 시작한다.
print(students[0]);
String name = students[5]; //5번째 위치한 값을 가져와서 name 변수에 저장한다.
print(name);
// List의 전체 길이를 아는 방법
// 리스트 변수 명.length;
print(students.length);
// List에 값을 추가하고 싶을 때
// 리스트명.add(추가할 값);
students.add("짱구");
// List의 값을 삭제하고 싶을 때
// 리스트명.remove(지울 값);
students.remove("훈이");
print(students);
// List 안 특정 값의 인덱스를 알고싶을 때
// 리스트명.indexof(알고싶은 값);
print(students.indexof("유리");
5. Map
// Map은 Key와 Value를 짝을 지어 저장한다.
// Map<Key타입 , Value타입> 변수명 = { "key" : "value",
"key" : "value",
.....}
// Map에서는 key를 가지고 value값을 찾는다.
Map<String, int> idxStudents = {"지민" : 1,
"철수" : 2,
"유리" : 3,
"훈이" : 4,
"맹구" : 5,
"짱구" : 6};
//Map에 새로운 값 추가하기 => 마지막에 추가됨
//1. Map변수명.addAll() 사용하기
idxStudents.addAll( {"봉미선":7} ) ;
//2. Map변수명['Key'] = "value" 로 추가하기(value값을 바꾸고 싶을 때도 사용가능)
idxStudents["오수"] = 8;
//Map에서 Key로 value값 찾는 법
//Map변수명[Key이름]
print(idxStudents["철수"]);
//Map에서 값 삭제하는 법
//Map변수명.remove(Key값);
idxStudents.remove("봉미선");
//Map에서 Key값만 가져오기
print(idxStudents.keys);
//Map에서 Value값만 가져오기
print(idxStudents.values) ;
6. Set
//List에는 중복되는 값이 들어갈 수 있지만 Set은 중복값을 넣을 수 없음!
//Set<타입> 변수명 = {값1, 값2, 값3, ...}
Set<String> words = {"hello", "world", "happy", "tonight", "happy"};
print(words);
//Set에 값을 더하고 싶을 때
//Set변수명.add(값)
words.add("dart");
print(words);
//Set에 값을 지우고 싶을 때
//Set변수명.remove(값)
words.remove("tonight");
print(words);
//Set안에 특정 값이 있는지 없는지 확인하고 싶을 때
//결과값이 T/F로 반환됨. (있으면 True, 없으면 False)
bool result = words.contains("world");
print(result);
7. 조건문
// if(조건) {조건이 True일 때 실행할 코드} -> 이렇게 한 세트!
int number = 2;
if (number % 2 == 0) {
print("짝수입니다");
}else if(number % 3 == 0){
print("홀수입니다");
}else{
print("홀수입니다");
}
// Switch 조건문
// switch(조건) { case : 조건이 true일 때 실행문}
int number = 3;
switch(number % 3 == 0) {
case 0:
print(나머지가 0입니다);
break; // -> 이렇게 해야 나머지 케이스를 보지 않는다.
case 1:
print("나머지가 1입니다");
break ;
default : // ->if 문의 else 와 동일한 역할을 한다.
print("나머지가 2입니다");
break;
8. Loop 반복문
// for loop
// for문을 만들 때 고려해야할 3가지
// 1. loop에서 사용할 변수 설정 -> 주로 숫자
// 2. 언제까지 이 loop을 실행할건지
// 3. 한 번 loop을 실행할 때마다 취할 액션(어떤 코드를 실행할 지)
for (int i = 0; i <= 10; i ++){
print(i);}
int total = 0 ;
List <int> lis = [1,2,3,4,5,6];
for (int i = 0; i < lis.length ; i ++) {
total += lis[i]; }
print(total);
// for in loop ('**이 OO안에 있다면'이 for 문의 조건에 해당됨)
int total = 0;
for (int num in lis) { //int 타입의 num이 lis 안에 있다면
print(num);
total += num;
}
// while
// while (조건) {조건이 참일 때 실행할 문장}
int total = 0 ;
while (total <10) { // -> 조건 설정이 중요 조건 설정을 잘못하면 무한루프에 빠질 수 있음
total += 1;
}
print(total);
// Do - while
// 기존의 while 문과 순서가 뒤바뀜.
// 일단 Do에 있는 문장을 실행하고 그 다음에 while 문을 실행
int total = 0 ;
do {total += 1;
} while (total < 10);
print(total); // total 에 +1 을 먼저 하고 그 값이 10보다 작은지 큰지를 평가함.
// break
// break는 loop을 나가버리는, break를 만나면 loop가 종료된다.
// for , while 모든 반복문에서 사용 가능
int total = 0;
while (total <= 10) {
total += 1;
if (total == 5) {
break;
}
}
// continue
// continue를 만나면 조건에 해당할 때 skip하겠다는 의미 (해당 조건만 pass )
for (int i = 0; i < 10; i ++) {
if (i == 5) {
continue;
}
print(i);
}
9. enum
//enum은 void main() 밖에서 선언해줘야한다.
//enum은 마치 하나의 타입인 것처럼 사용할 수 있다.
//enum 변수명 {값1, 값2, 값3, ..}
enum Status {approved, pending, rejected}
void main() {
Status status = Status.pending;
if (status == Status.pending){
print("대기"); }
else if (status == Status.approved) {
print("승인"); }
}
Q: enum은 왜 필요한가?
A : 정확히 이 해당하는 값만 있다는걸 개발자 혹은 미래의 나에게 알리기 위함임. 정확히 정해진 몇 가지 타입만 존재할 경우 enum을 사용하면 그 타입만 사용할 수 있게 강제해준다.
10. 함수
// 함수(function)는 반복되는 코드를 한 번만 작성하고 재사용하기 위함
// 함수 작성 전 작성할 함수가 어떤 역할을 할 것인지 코멘트를 달고 작성하면 편하다!
// 함수정의하는 법 : 함수이름(파라미터) {함수 body};
// main 함수 밖에다가 정의해야함
addNumbers(){
print("실행");}
addNumbers() {
int a = 10;
int b = 20;
int c = 30;
int sum = a+b+c;
print(sum);
if (sum % 2 ==0) {print("짝수");}
else {print("홀수"); }
}
// 파라미터, arguments 라고 매개변수 설정해주는법
//1. positional parameter : 순서가 중요한 파라미터
//2. optional parameter : 있어도 되고 없어도 되는 파라미터
addNumbers(int a , [int? b = 20 , int x = 30]) {}
//int b, int x는 있어도 되고 없어도 되는 파라미터 -> [] 대괄호로 선언
//기본값을 설정하려면 [int b = 20 , int x = 30] 이런 식으로 값을 같이 선언해줌
//null도 받을 수 있다면 -> int? 이렇게 물음표 표시
//3. named parameter -> 이름이 있는 파라미터 (순서는 중요하지 않음)
// named parameter는 중괄호 묶어서 표시한다.
// required로 지정된 파라미터는 호출 시기에 값이 지정되어야한다.
addNumbers({required int x, required int y, required int z}) {}
// 호출할 때도 addNumber(x : 10, y : 20 , z : 30);
// named 에서 optional 을 사용하려면 -> 앞에 붙은 required를 빼고 기본값 넣어주면 됨.
//함수 반환 타입
// 반환해줄 값이 없는 경우 -> void
// 반환해줄 값이 있는 경우 -> 값에 따라 함수 타입을 지정해주면 됨.
void print() {}
int addNumbers() {return 1;}
// 정의한 함수 실행하기
// 다트가 main을 찾아서 main함수를 자동으로 실행해준다.
// 내가 정의한 함수를 실행하고 싶다면 main 안에다가 호출을 하면 됨.
void main() {
addNumbers(); }
// arrow 함수(=>)
// arrow 다음에 나오는게 함수의 return 에 대한 내용
int addNumbers(int x, {required int y, int z = 30 } ) => x+y+z;
11. Typedef
// typedef는 함수랑 비슷하지만 함수와 다르게 body가 없음
//Signature : 일종의 함수의 껍데기를 선언
typedef Operation = int Funtion(int x , int y, int z);
// 더하기 -> 위에 정의한 typedef와 똑같은 위치에 있어야함
int add(int x, int y, int z) => x+y+z;
// 빼기
int substract(int x, int y, int z) => x-y-z;
// 계산
int calculate(int x, int y, int z, Operation op){return op(x,y,z)};
void main(){
Operation operation = add; //operation이 add역할을 하게 됨.
int result = operation(10,20,30);
print(result);
operation = substract;
int result2 = operation(10,20,30);
print(result);
int result3 = calculate(10,20,30,add); //이렇게 많이 사용
print(result3);
}
반응형