[Flutter] 다트(Dart)의 변수 및 타입 설명
- App Dev/Flutter 및 DART
- 2022. 9. 12.
플러터(Flutter)의 개발 언어인 다트(Dart)는 다양한 플랫폼에서 동작을 해야 하기 때문에 매우 심플하고 강력한 변수 타입들을 제공하고 있습니다.
다트의 기본 타입
기본 타입 | 설명 | 예시 |
int | 정수형 | 365 |
double | 실수형 | 3.141592 |
String | 문자열 | 홍길동 |
bool | 참 또는 거짓 (불리언 타입) | false |
다트의 기본 타입은 4가지로 다른 언어(ex: Java, C, C++)에서 사용되는 Float이나 Long, unsigned와 같은 타입들은 제공하지 않고 있습니다. 다른 언어들이 다양한 타입을 제공했던 이유는 하드웨어(Hardware)의 사양이 지금과 달리 부족했던 시대에는 메모리의 최적화가 중요했기 때문인데 지금은 자원이 부족한 경우가 없기 때문에 세세한 타입은 제공하지 않고 있습니다.
즉, 예를 들어 자바 개발자의 경우 int라고 생각하면 4 byte의 메모리를 할당할 것이라 생각할 수 있지만, 실질적으로는 long 타입과 동일하다고 보시면 됩니다.
다트의 기본 타입 예시
void main(List<String> arguments) {
int a = 100;
String name = '홍길동';
double pi = 3.14;
bool isTrue = false;
print('a의 값은? $a');
print('이름은? $name');
print('파이 값은? $pi');
print('참인가? $isTrue');
}
예시결과
a의 값은? 100
이름은? 홍길동
파이 값은? 3.14
참인가? false
타입 추론
다트는 타입을 직접 명시하지 않아도, 타입을 추론하는 기능이 내장되어 있습니다.
void main(List<String> arguments) {
var a = 100;
var name = '홍길동';
var pi = 3.14;
var isTrue = false;
print('a의 값은? $a');
print('이름은? $name');
print('파이 값은? $pi');
print('참인가? $isTrue');
}
즉 위와 같이 int, String과 같은 타입을 지정하지 않고 var를 사용해도 타입을 직접 입력하는 것과 동일한 결과를 보여줍니다.
a의 값은? 100
이름은? 홍길동
파이 값은? 3.14
참인가? false
하지만 var를 파이썬(Python)같은 어떤 값이든 자유자재로 대입하는 타입이라 생각하시면 안되는데요. a에 숫자값이 세팅되어 있는 상태에서 다른 형태의 값을 세팅을 하게 되면 에러를 발생합니다.
void main(List<String> arguments) {
var a = 100;
a = 1000;
a = 3.14;
}
즉 위와 같은 코드에서, 첫번째 1000을 대입할 때에는 에러가 발생하지 않으나, 두번째 실수값인 3.14를 대입하게 되면 에러가 발생합니다.
타입 추론 에러
bin/dart.dart:6:7: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
a = 3.14;
한마디로 추론이라는 말처럼 var를 쓰는 것은 값을 이해해서 DART 언어가 알아서 int 인지, String 인지를 알아서 선언하는 것과 같습니다. 개인적으로 var를 쓰는 것은 아무런 이득이 없다 생각해서, 저 같으면 평생 이런 타입을 쓰지 않겠지만, 다른 사람들이 사용하는 코드를 이해하는 것도 중요하기 때문에 이런것이 있다 정도를 이해하면 됩니다.
동적 타입
타입 추론에 var만 있는 것이 아닙니다. dynamic이라는 타입을 사용할 수 있는데요. 이 타입을 사용하게 되면 궁극적으로 var + @로 값을 자유자재로 대입이 가능한 변수처럼 만들게 됩니다.
정확히 dynamic은 타입을 추론하는게 아니라 어떤 타입이든 받아들인다라고 생각하시면 되니, 기존 파이썬의 변수와 유사한 모양이라 생각하시면 되겠네요.
동적 타입 예시
void main(List<String> arguments) {
dynamic a = 100;
a = 1000;
print(a);
a = 3.14;
print(a);
}
동적 타입 결과
1000
3.14
숫자형
자바나 C와 같은 오래된 언어들은 다양한 숫자 타입을 지원하고 있습니다.
정수형으로 생각하면, byte, short, int, long, unsigned 실수형으로 float, double 등이 있죠. 하지만 다트는 정수형은 int로 통일, 실수형은 double로 통일을 하면서 사용하고 있는데요. 이와 같이 숫자형은 아래와 같은 구조로 되어 있습니다.
즉, int와 double 사이는 서로 자식간의 관계이기 때문에 호환이 되지 않지만 그 위에 num이라는 부모 객체가 있는 것을 볼 수 있는데요. int와 double을 자유자재로 바꾸는 방법으로 dynamic도 존재하지만, num을 사용해도 됩니다.
숫자형 자유변환 예시
void main(List<String> arguments) {
dynamic a = 100;
dynamic b = 3.14;
dynamic c = a + b;
print(c);
num na = 100;
num nb = 3.14;
num nc = na + nb;
print(nc);
}
즉, 숫자형의 경우 dynamic 뿐만 아니라 num을 사용해도 된다는 것입니다.
103.14
103.14
dynamic이 있는데 왜 num을 지원하는가 생각하실 수 있는데요. 변수라는 것이 너무 이것저것 받아들이게 된다면 어떤 값이 들어올지 몰라 문제가 발생할 수 있습니다. 예를 들어, 계산기를 만드는데 숫자 이외에 문자값이 들어와 버린다면 사실 그 앞단계에서 에러가 발생해야 되지만, dynamic으로 하는 경우 데이터를 받아들이는 단계에서는 에러가 발생하지 않는 문제가 있는 것이죠.
되도록이면, 타입을 직접 지정하는 것이 Best 겠지만, 숫자와 실수형이 오갈 수 있는 값이라면 num을 선언하는 것이 바람직 할 것입니다.
'App Dev > Flutter 및 DART' 카테고리의 다른 글
[Flutter] 플러터 Doctor (0) | 2022.04.03 |
---|---|
[Flutter] 윈도우 개발 환경 구성 (0) | 2022.04.02 |
플러터(Flutter) 개발 환경 세팅 (0) | 2022.03.12 |
크로스플랫폼, 플러터(Flutter)를 배워야 하는 이유 (0) | 2022.03.03 |