조용한 담장

Dart : Variables 본문

Dart

Dart : Variables

iosroid 2019. 8. 5. 17:57

Dart Variables

모든 변수는 object 이며, object 는 class의 instance 이다. 모든 object 는 Object class를 상속한다.

Types

Type inference

var name = 'Bob';
// String name = 'Bob';

변수 name 은 Object를 가리키는 reference를 가지게 된다.

위의 경우에는 'Bob' 이라는 문자열을 보고 String Object 를 reference의 대상으로 지정한다.

해당 변수의 타입 변경이 있을 수 있다면 dynamic을 쓰면 되나 권장되진 않는다.

dynamic name = 'Bob';
if (name is String) return true;

Final and const

변수의 값을 변경하지 않을 경우에 final 을 쓴다. final 은 한번만 값을 설정할 수 있다.

이때 var 는 사용하지 않는다.

final name = 'Bob';
// final var name = 'Bob'; // Error!
final String nickname = 'Bobby';
// nickname = 'Alice'; // Error!

A final variable can be set only once; a const variable is a compile-time constant. (Const variables are implicitly final.) A final top-level or class variable is initialized the first time it’s used.

compile-time constant 변수 선언.

const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere

상수값( constant values) 선언.


Declaring constant variables to create constant values, as well as to declare constructors that create constant values. Any variable can have a constant value.

var foo = const [];
const baz = []; // Equivalent to `const []`
final bar = const [];

상수(constant) 가 되는 변수인 경우 const를 생략할 수 있고 가능한 안쓰는 방향을 권하고 있다.

DON’T use const redundantly

foo = [1, 2, 3]; // Was const []
baz = [42]; // Error!
bar = [11]; // Error!

foo 는 final 과 const 가 아니고 var 이기 때문에 const value 가지고 있었지만 새로운 값(non-const value)을 다시 가질 수 있다.

baz 는 const variable 이기 때문에 값을 바꿀 수 없다.

bar 는 final 이기 때문에 한번만 값을 설정할 수 있다.

Numbers

int, double

var x = 1;
var y = 1.1;
var hex = 0xDEADBEEF;
var exponents = 1.42e5;
double z = 1; // z == 1.0

String from/to number

// String -> int, double
var one = int.parse('1'); // int one = 1;
var onePointOne = double.parse('1.1'); // double onePointOne = 1.1;

// int, double -> String
String oneAsString = 1.toString(); // String oneAsString = '1';
String piAsString = 3.14159.toStringAsFixed(2); // String piAsString = '3.14';

Bitwise operators (<<, >> &, |)

var a = 3 << 1; // 6
var b = 3 >> 1; // 1
var c = 3 & 1; // 1
var d = 3 | 4; // 7
print(a + b + c+ d); // 15

Const numbers (compile-time constants)

const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond; // 5000

Strings

String

Operator Expression Result
* String S * 3 new String SSS
+ String A + String B new String AB
== String A == String B return true or false
[] String A[index] return Character of index
var s1 = 'Single quotes';
var s2 = "Double quotes";
var s3 = 'It\'s ';
var s4 = "It's ";
print(s4*3); // It's It's It's 
print('$s1 ' + 'and' + ' $s2'); // Single quotes and Double quotes
print('${s1.toUpperCase()}, ${s1.length}'); // SINGLE QUOTES, 13
print(s2.toUpperCase() + ', 13'); // DOUBLE QUOTES, 13
var s5 = s3 + s1;
var s6 = 'The + operator ' 'works, ' 'as well.';
if(s5 == 'It\'s Single quotes')
    print(s6); // The + operator works, as well.
var s7 = 'String '
    'concatenation'
    " works even over line breaks.";
var s8 = '''
    You can create
    multi-line strings like this one.
    ''';
var s9 = """This is also a
    multi-line string.""";
var s = r'In a raw string, not even \n gets special treatment.'; // In a raw string, not even \n gets special treatment.
print('${s4[0]} ${s4[1]} ${s4[2]} ${s4[3]}'); // I t ' s
print(s4.runes.toList()); // [73, 116, 39, 115, 32]

*Runes, RegExp*

Booleans

true and false

// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty);

// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);

// Check for null.
var unicorn;
assert(unicorn == null);

// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);

Lists

list

Operator Expression Result
+ List A + List B new List AB
[] List A[0] return value of index
[]= List A[index] = value set value at index
== List A == List B return false
var listEmpty = [];
print(listEmpty.length); // 0
listEmpty.add(3);
print(listEmpty); // [3]
print(listEmpty.length); // 1

var list1 = [1, 2, 3, 4]; // List<int> list1 = [1, 2, 3, 4];
print(list1); // [1, 2, 3, 4]

var constantList = const [1, 2, 3];
print(constantList.length); // 3

var list2 = [0, ...list1];
print(list2); // [0, 1, 2, 3, 4]

var list3; // list3 == null
var list4 = [0, ...?list3];
print(list4); // [0]

const hasMoreMoney = true;
var list5 = [
    'Phone',
    if (hasMoreMoney) 'Tablet'
];
print(list5); // [Phone, Tablet]

var list6 = [
    '#0',
    for (var i in list1) '#$i'
];
print(list6); // [#0, #1, #2, #3, #4]
var list1 = [1, 2, 3, 4];
var list2 = [1, 2, 3, 0];
print(list1 + list2); // [1, 2, 3, 4, 1, 2, 3, 0]
print(list2[3]); // 0
list2[3] = 4;
print(list2); // [1, 2, 3, 4]
print(list1 == list2); // false
print(list1 == [1, 2, 3, 4]); // false
print(list1 == list1); // true

spread operator, null-aware spread operator

... 는 여러개의 엘러멘트를 가진 변수를 합칠 때 쓰며, ?... 은 합치려는 변수가 null 이면 동작하지 않는다.

Sets

set

Operator Expression Result
== Set A == Set B return false
var set1 = <String>{}; // Set<String> set1 = {};
// var set1 = {}; // Creates a map, not a set.
print(set1.length); // 0
set1.add('c');
print(set1); // {c}
print(set1.length); // 1

final constantSet = const {'def','ghi'};

var set2 = <String>{};
set2.addAll(set1);
set2.addAll(constantSet);
set2.add('j');
print(set2); // {c, def, ghi, j}

Set<String> set3 = {'b', ...set2};
print(set3); // {b, c, def, ghi, j}

Set<String> set4; // set4 == null
var set5 = <String>{'a', ...?set4};
print(set5); // {a}

const hasMoreMoney = true;
var set6 = <String>{
    'Phone',
    if (hasMoreMoney) 'Tablet'
};
print(set6); // {Phone, Tablet}

var set7 = <String>{
    'I want',
    for (var i in set6) '$i'
  };
print(set7); // {I want, Phone, Tablet}

Set or map? The syntax for map literals is similar to that for set literals. Because map literals came first, {} defaults to the Map type. If you forget the type annotation on {} or the variable it’s assigned to, then Dart creates an object of type Map<dynamic, dynamic>.

Maps

map

Operator Expression Result
[] Map A[key] return value of key
[]= Map A[key] = value Associates value with key
== Map A == Map B return false
// Map<String, String> fruit
var fruit = {
    // Key:    Value
    'first': 'banana',
    'second': 'apple',
    'fifth': 'orange'
};

var fruit = Map();
fruit['first'] = 'banana';
fruit['second'] = 'apple';
fruit['fifth'] = 'orange';

var color = {
    2: 'yellow',
    10: 'green',
    18: 'blue',
};

var color = Map();
color[2] = 'yellow';
color[10] = 'green';
color[18] = 'blue';

final constantMap = const {
    2: 'yellow',
    10: 'green',
    18: 'blue',
};

fruit['fourth'] = 'grapes'; // Add a key-value pair

print(fruit['fourth']); // grapes
print(fruit[' ']); // null

var map1 = {1: 'red', ...color};
print(map1); // {1: red, 2: yellow, 10: green, 18: blue}

var map2; // map2 == null
var map3 = {1: 'one', ...?map2};
print(map3); // {1: one}

Runes

runes

In Dart, runes are the UTF-32 code points of a string. Because a Dart string is a sequence of UTF-16 code units, expressing 32-bit Unicode values within a string requires special syntax.

Reference

https://dart.dev/guides/language/language-tour

https://dart.dev/

'Dart' 카테고리의 다른 글

Dart : Exceptions  (0) 2019.09.20
Dart : Control flow statements  (0) 2019.09.17
Dart : Operators  (0) 2019.09.17
Dart 2.5  (0) 2019.09.11
Dart : Functions  (1) 2019.08.07
Comments