본문 바로가기
Dart

[Dart] 언어 기본기 - 변수편

by 가드 2022. 12. 3.
728x90

※ 시작 전 참고사항 : 다트패드로 테스트 진행

변수 선언

문자열 타입

void main() {
  String string = '텍스트'; // 문자열 선언
  print(string);
  string = '텍스트 변경'; // 문자열 변경
  print(string);
  print(string == '새로운 텍스트'); // 문자열 비교
}

정수 타입

void main() {
  int number1 = 10; // 정수 선언
  print(number1);
  int number2 = 20; // 두번재 정수 선언
  print(number2);
  print(number1 + number2); // 덧셈
  print(number1 - number2); // 뺄셈
  print(number1 / number2); // 나눗셈
  print(number1 % number2); // 나머지
  print(number1 * number2); // 곱셈
}

실수 타입

void main() {
  double number1 = 2.5; // 실수 선언
  print(number1);
  double number2 = 0.5; // 두번재 실수 선언
  print(number2);
  print(number1 + number2); // 덧셈
  print(number1 - number2); // 뺄셈
  print(number1 / number2); // 나눗셈
  print(number1 % number2); // 나머지
  print(number1 * number2); // 곱셈
}

불리언 타입

void main() {
  bool isTrue = true; // 참
  print(isTrue);
  bool isFalse = false; // 거짓
  print(isFalse);
}

Variable 타입

void main() {
  var string = "이름"; // 문자열
  var integer = 1; // 정수
  var double = 2.5; // 실수
  var boolean = true; // 불리언
  print(string.runtimeType);
  print(integer.runtimeType);
  print(double.runtimeType);
  print(boolean.runtimeType);
}

Console
String
int
double
bool

String, Integer, Double, Boolean 타입별로 변수를 선언하여 테스트했는데 Variable 타입도 동일하게 선언이 가능하다.

Var 변수 같은 경우에는 타입을 오른쪽 값으로 유추를 하게 된다. print함수에 var 변수에 runtimeType 선언하게 되면 변수가 실행될 때 어떤 타입을 변수인지를 유추하게 된다. 즉, 실제로는 var라는 타입은 존재하지 않는다. 값에 의해 유추가 될 뿐이다.

편하게 var 타입을 다 쓰면 되지 왜 타입을 따로 선언해야 할까?

실제 개발을 하다 보면 코드가 길어지고 클래스의 크기는 커지고 복잡도는 높아져 가는데 이런 코드 속에서 모두 var 타입으로 선언하게 되면 변수를 알아보기가 점점 힘들어질 것이다.

Map<String, Map<String, List<String>>> map = {}; // 타입 전체 명시
var map = {} // var 선언

다만, 오브젝트 타입 선언이 길어지는 경우 매번 타입 선언하는 것이 불편한 경우 var 타입으로 정의하면 코드 보기가 수월해질 것이다.

Dynamic 타입

void main() {
  dynamic string = "다이나믹";
  print(string);
  dynamic integer = 1;
  print(integer);
}

dynamic 타입으로 문자열 정수 실수 불리언등 모두 적용이 가능한 타입이다. 그럼 var랑 뭐가 다른가?

void main() {
  dynamic dynamic_name = "다이나믹";
  var var_name = "다이나믹";
  dynamic_name = 2; // 타입 변경이 된다.
  var_name = 2; // 타입 변경 에러 발생
}

위의 테스트 코드에서 알 수 있는데 dynamic을 문자열로 선언하고 정수로 변환하면 변환되는 반면에 var 타입은 타입 에러가 발생되어버린다. 즉, 다이내믹 타입은 언제든 형 변환이 가능하다.

Nullable, Non-Nullable

  • nuallble : 변수가 null이 될 수 있다.
  • non-nullable : 변수는 null이 될 수 없다.
void main() {
  String name = 'test';
  name = null; // 에러발생
}

null이 들어갈 수 없는 String 타입인데 null을 넣으려고 하니 에러가 발생하게 된다. 위의 모든 변수 타입들은 두 가지 경우로 나누어지게 된다. 타입만 들어갈 수 있는 경우만 타입과 null이 허용되는 경우

void main() {
  String? name = 'test';
  name = null;
  print(name); // null 출력
}

어떤 타입이든 타입뒤에 ?를 붙이면 null을 허용하는 변수가 된다.

Final, Const

  • final : final로 선언된 변수의 값은 변경이 불가능하다.
  • const : const로 선언된 변수의 값은 변경이 불가능하다.
void main() {
  final String name = 'test';
  name = 'test2'; // 에러발생
  const String name2 = 'test';
  name2 = 'test2'; // 에러발생
}

final키워드나 const키워드나 변수의 값을 변경하는 행위를 하면 에러가 발생된다.

둘 다 변수 값 변경이 불가능한데 어떤 차이가 있을까?

void main() {
  final DateTime now = DateTime.now();
  print(now); // 2022-11-28 17:09:08.156
  const DateTime now = DateTime.now(); // 에러발생
}

시간 값을 나타내는 DateTime 객체로 테스트해보자. final 키워드 객체와 const 키워드 객체를 선언했는데 const 객체는 에러가 발생된다. const는 빌드 타임의 값을 알고 있어야 한다. final은 빌드 타임의 값을 몰라도 된다.

const는 빌드타임이 필요하므로 코드 작성 순간에는 빌드 타임을 알 수 없다. DeteTime.now()는 코드가 실행이 되는 순간에 시간 값을 가져오기 때문에 에러가 발생되는 이유이다.

300x250

댓글