본문 바로가기

CS/Flutter | Dart

Dart 기본 - 변수형

자동으로 오른쪽 값을 통해 문자형 유추

var

void main() {
  var name1 = "dami";
  var name2 = "chacha";
  print(name1);
  
  name1 = "flutter";
  print(name1);
}

변수 내용 수정은 가능하지만 이미 선언된 변수를 다시 선언하는 건 불가능

 

 

정수: int, 실수: double

void main() {
  // 정수
  int num1 = 2;
  int num2 = 4;
  print(num1 + num2);
  print(num1 - num2);
  print(num1 / num2);
  print(num1 * num2);
  
  // 실수
  double num3 = 2.5;
  double num4 = 0.5;
  print(num3 + num4);
  print(num3 - num4);
  print(num3 / num4);
  print(num3 * num4);
}

 

 

맞다 / 틀리다

Boolean

void main() {
  // Boolean
  bool isTrue = true;
  bool isFalse = false;
  print(isTrue);
  print(isFalse);
}

 

 

문자: String

void main() {
  // String
  String name1 = "cute";
  String name2 = "pet";
  print(name1);
  print(name2);
}

 

 

Var의 문자형 유추

void main() {
  // String
  String name1 = "cute";
  print(name1.runtimeType);
  
  // var string
  var name2 = "cat";
  var name3 = 20;
  print(name2.runtimeType);
  print(name3.runtimeType);
}

실제로 var이라는 type은 존재하지 않는 것.

그럼 var로 다 선언해주면 되지 않냐?

-> 추후 코드가 길어지면 어떤 형의 변수인지 단번에 구분하기 힘들 수 있음

    알아보기 쉽게 String, int 등 그 변수에 적절한 type으로 지정 선언해주되, 어려운 경우에만 var 써주기

 

 

void main() {
  // String
  String name1 = "cute";
  String name2 = "cat";
  print(name1 + name2);
  print(name1 + " " + name2); // cute cat
  print("${name1} ${name2}"); // cute cat
  print("$name1 $name2"); // cute cat
}

string 값끼리 + 해 문자 붙일 수 있음

-, /, *는 안됨

print("${name1} ${name2}"); 이렇게 써도 됨

print("$name1 $name2"); 이렇게 {} 생략해줘도 똑같은 결과 나옴

 

 

dynamic 

void main() {
  // dynamic
  dynamic name1 = "cute";
  var name2 = "pet";
  print(name1.runtimeType); // String
  print(name2.runtimeType); // String
  
  name1 = 20;
  print(name1.runtimeType); // int
//   name2 = 20;
//   print(name2.runtimeType);
}

dynamic type은 어떤 형의 변수도 선언 가능하고 추후 수정시 다른 변수형으로도 변환 가능

하지만 var은 처음 선언한 변수 형으로만 수정 가능

 

 

nullable: null이 될 수 있다

non-nullable: null이 될 수 없다

null: 아무 값도 들어있지 않다

void main() {
  // null
  String name1 = "cute";
//   name1 = null -> X
  String? name2 = "pet";
  name2 = null;
  print(name2);
}

어떤 type이든 type 옆에 ?만 붙여주면 null 값 넣을 수 있음

nul이 들어있는 type에 ! 붙이면 현재 이 값은 null이 아니라는 것을 뜻함

 

 

final

void main() {
  // final
  final String name1 = "cute";
//   name1 = "asd"; => X
}

type 앞에 final 써서 선언하면 처음 선언했던 변수 값 수정 불가

 

 

const

void main() {
  // const
  const String name1 = "cute";
//   name1 = "asd"; => X
}

const도 마찬가지로 처음 선언했던 변수 값 수정 불가

 

void main() {
  final name1 = "cute";
  const name2 = "pet";
  print("$name1 $name2");
}

final과 const는 변수 type 지정 안해도 작동함

 

 

DateTime: 현재 시간

void main() {
  DateTime now = DateTime.now();
  print(now); // 2023-07-07 19:07:15.714
}

컴파일 버튼 누른 시간이 출력되는 게 아닌, 해당 코드가 실행될 때의 시간이 출력됨

 

 

void main() {
  final DateTime now = DateTime.now();
  print(now);
//   const DateTime now = DateTime.now();
//   print(now);
}

const는 빌드 타임의 값을 알고 있고, final은 빌드 타임의 값을 알고 있지 않음

빌드 타임: 우리가 작성한 코드를 이진수로 변환하는 시간 

 

const로 DateTime을 하면 빌드 타임 값을 알고 있어야 출력될 수 있는데,

DateTime은 해당 코드가 실행될 때의 시간이 출력되므로 빌드 타임 값을 알고 실행되는 게 아님

-> 그러므로 const로 DateTime 하면 오류 발생

final은 빌드 타임 값을 알고 있지 않아도 선언 가능하기 때문에 사용 가능

 

 

값 재정의

void main() {
  int num1 = 2;
  print(num1 + 2);
  print(num1 - 2);
  print(num1 / 2);
  print(num1 * 2);
  print("-"*10);
  
  print(num1 % 2);
  print(num1 % 3);
  print("-"*10);
  
  num1 ++;
  print(num1);
  
  num1 --;
  print(num1);
}

++, -- 가능

 

 

void main() {
  double num1 = 3.0;
  print(num1);
  num1 += 1;
  print(num1);
  num1 -= 1;
  print(num1);
}

*=, /= 도 가능

 

 

void main() {
  double? num1 = 3.0;
  print(num1);
  
  num1 = null;
  print(num1);
  
  num1 ??= 4.0;
  print(num1);
}

num1 ??= 4.0; 에서 ??=은 변수에 null이 들어있다면 null값을 오른쪽에 넣어준 값으로 바꾸라는 뜻

null이 아닐 때는 오른쪽 값으로 바꾸지 않음

 

 

void main() {
  int num1 = 10;
  int num2 = 20;
  print(num1 > num2);
  print(num1 < num2);
  print(num1 >= num2);
  print(num1 <= num2);
  print(num1 == num2);
  print(num1 != num2);
}

각 알맞은 bool형 반환

 

 

void main() {
  int num1 = 10;
  int num2 = 20;
  print(num1 is int);
  print(num1 is String);
  print(num1 is! int);
  print(num1 is! String);  
}

변수 타입에 대해서는 is, is! 이런 식으로 적용 가능

 

 

&&: and

||: or

void main() {
  bool res1 = 12 > 10 && 1 > 0;
  print(res1);
  bool res2 = 12 > 10 && 1 < 0;
  print(res2);
  bool res3 = 12 > 10 || 1 > 0;
  print(res3);
  bool res4 = 12 > 10 || 1 < 0;
  print(res4);
 
}

 

List

void main() {
  // List
  List<String> chacha = ["eye", "nose", "ear"];
  List<int> num1 = [1, 2, 3];
  print(chacha);
  print(num1);
}

<> 안에 형 지정해주고 변수 선언해주면 됨

이미 변수 형 지정되면 리스트 원소를 다른 형으로 지정 불가

ex) List<int> num1 = [1, 2, 3]; 일 때, num1 = [1, 2, "mouse"]; 불가

 

 

List 특정 원소 출력, List 길이

void main() {
  // List
  List<String> chacha = ["eye", "nose", "ear"];
  List<int> num1 = [1, 2, 3];
  print(chacha);
  
  // index
  print(chacha[0]);
  print(chacha.length);
}

index는 0부터 시작

전체 List 길이를 넘어서는 index는 출력 불가

 

List 길이 알고 싶다면 List 변수 이름.length 하면 위 chacha List 경우에는 원소가 3개 있으므로 3이 출력됨

 

 

void main() {
  // List
  List<String> chacha = ["eye", "nose", "ear"];
  print(chacha);
  
  // index
  print(chacha.length);
  
  chacha.add("mouse");
  print(chacha.length);
  print(chacha);
}

add() 이용해 List 원소 추가 가능

위 예시의 경우 chacha List에 ["eye", "nose", "ear", "mouse"]로 "mouse"가 추가 됨

 

 

void main() {
  // List
  List<String> chacha = ["eye", "nose", "ear"];
  print(chacha);
  
  // index
  chacha.add("mouse");
  print(chacha);
  chacha.remove("nose");
  print(chacha);
}

remove() 이용해 List 원소 삭제 가능

chacha List =  ["eye", "nose", "ear", "mouse"] 에서 위 예시처럼 remove() 이용 후 출력하면, ["eye", "ear", "mouse"] 출력

 

 

void main() {
  // List
  List<String> chacha = ["eye", "nose", "ear"];
  print(chacha);
  
  // index
  print(chacha.indexOf("nose"));
}

indexOf() 이용해 index 순서 알 수 있음

위 예시의 경우 nose의 인덱스 순서는 1이기 때문에 1 출력

 

 

Map

key, value

void main() {
  // Map
  // key, value
  Map<String, String> family = {
    "me" : "dami",
    "mommy" : "soyoung",
    "cat" : "chacha",
  };
  print(family);
  
  Map<String, bool> isFamily = {
    "dami" : true,
    "mommy" : true,
    "cat" : true,
    "dog" : false,
  };
  print(isFamily);
  
  isFamily.addAll({
    "brother" : true
  });
  print(isFamily);
  
  print(family["cat"]);
  print(isFamily["cat"]);
  
}

{me: dami, mommy: soyoung, cat: chacha}
{dami: true, mommy: true, cat: true, dog: false}
{dami: true, mommy: true, cat: true, dog: false, brother: true}
chacha
true

 

 

void main() {
  Map<String, bool> isFamily = {
    "dami" : true,
    "mommy" : true,
    "cat" : true,
    "dog" : false,
  };
  
  isFamily["father"] = true;
  print(isFamily);
}

isFamily["father"] = true; 이런 식으로 Map 원소를 추가해 줄 수도 있음

 

 

void main() {
  Map<String, bool> isFamily = {
    "dami" : true,
    "mommy" : true,
    "cat" : true,
    "dog" : false,
  };
  
  isFamily["father"] = true;
  print(isFamily);
  
  isFamily.remove("father");
  print(isFamily);
}

remove() 함수 안에 삭제하고 싶은 key를 넣어주면 해당 key와 value 삭제됨

 

{dami: true, mommy: true, cat: true, dog: false, father: true}
{dami: true, mommy: true, cat: true, dog: false}

 

 

void main() {
  Map<String, bool> isFamily = {
    "dami" : true,
    "mommy" : true,
    "cat" : true,
    "dog" : false,
  };
  
  isFamily["father"] = true;
  print(isFamily.keys);
  print(isFamily.values);
}

keys와 values 이용해 각각 key와 value만 가져올 수 있음

 

(dami, mommy, cat, dog, father)
(true, true, true, false, true)

 

 

Set

Map과 비슷하지만, Map처럼 key와 value 짝이 아니라 List처럼 하나의 값들만 저장할 수 있음

List와 Set의 차이: List는 중복 값 들어갈 수 있고, Set은 중복 값 들어갈 수 없음

-> Set은 중복을 자동으로 처리해 준다는 장점있음

void main() {
  final Set<String> name1 = {
    "chacha",
    "coco",
    "mongchi",
    "coco",
  };
  print(name1);
  
  name1.add("babpul");
  print(name1);
  
  name1.remove("coco");
  print(name1);
  
  name1.contains("mongchi");
  print(name1);
}

List처럼 add()와 remove() 사용 가능

 

{chacha, coco, mongchi}
{chacha, coco, mongchi, babpul}
{chacha, mongchi, babpul}

 

contains() 이용하면 해당 원소가 있는지 bool형으로 나타냄

 

 

 


Tiny Star