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);

}
반응형