본문 바로가기

Dart

A tour of the Dart language 3탄 [Variables]

반응형

안되는 걸 붙잡고 있다보면 매우 스트레스를 받습니다. 그리고 결국 안되면 이제 저는 아무것도 하지 않은 사람이 됩니다. 

그럴 바에 어제 다트문법 공부하고 잘 걸 그랬어요,, 아 어제 나를 괴롭힌 문제는 FCM이었고 주말에 다시 도전할 생각입니다. 전 주말에 약속없는 인간이니까요! 개발 잘하고 싶어요 아 아닙니다 그냥 개발할거에요 잘하지 않아도 그냥 해야죠 뭐 

 

변수 Variables 

var name = 'zero';

변수를 선언하고 초기화합니다. 변수는 참조를 저장합니다. name이라는 변수에 zero라는 String 객체에 대한 참조가 포함되어 있습니다. 

만약 null safety가 적용되는 2.12 버전 이후라면 변수를 사용하기 전 반드시 초기화해야 합니다. 

int lineCount = 0;

선언된 로컬 변수를 초기화할 필요는 없습니다. 하지만 사용하기 전에 값을 할당해야 합니다. 

int lineCount;

if (weLikeToCount) {
  lineCount = countLines();
} else {
  lineCount = 0;
}

print(lineCount);

최상위 및 클래스 변수는 lazily하게 초기화됩니다. 초기화 코드는 변수가 처음 사용될 때 실행됩니다. 

 

Late variables

2.12 버전에서 late modifier가 추가됐습니다. 아래 두 가지 경우에서 사용됩니다. 

・ 선언 후 초기화되는 Null이 될 수 없는 변수 선언

・  변수를 느리게 초기화한다. 

 

만약 변수를 사용하기 전에 변수를 설정한 것은 확실하지만 Dart가 동의하지 않을 경우 변수를 늦게 표시하여 오류를 수정할 수 있습니다. 

late String description;

void main() {
  description = 'Feijoada!';
  print(description);
}

변수를 늦게 표시했지만 선언 시 초기화하면 변수가 사용될 때 초기화가 실행됩니다. 이러한 lazy initialization은 다음과 같은 경우에 유용합니다. 

・ 변수가 필요하지 않을 수 있으며 초기화하는 데 부담이 많이 듭니다. 

・ 인스터스 변수를 초기화하고 있으며 인스턴스 변수의 initializer에 접근해야 합니다. 

// This is the program's only call to _readThermometer().
late String temperature = _readThermometer(); // Lazily initialized.

 

Final and Const 

변수를 변경할 생각이 없으면 final이나 const를 사용합니다.

final 변수는 한 번만 설정할 수 있으며 const 변수는 컴파일 시간의 상수입니다. (Const variables are implicitly final.)

//final 예제
final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';
name = 'Alice'; // Error: a final variable can only be set once.


/**
컴파일 시에 상수가 되려는 변수에는 const를 사용합니다. 
const변수가 클래스 수준에 있으면 정적 const로 표시합니다. 변수를 선언하는 경우
숫자 또는 문자열 리터럴, const 변수가 클래스 수준에 있으면 정적 const로 표시합니다. 
변수를 선언할 때 값을 숫자 또는 문자열 리터럴, 상수 변수 또는 상수 숫자에 대한 산술 연산 결과와
같은 컴파일 시간 상수로 설정합니다. 
**/

//const 예제
const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere
var foo = const [];
final bar = const [];
const baz = []; // Equivalent to `const []`
foo = [1, 2, 3]; // Was const []
baz = [42]; // Error: Constant variables can't be assigned a value.

 

type check나 cast를 사용해서 collection, if, spread operators를 사용하는 상수를 정의할 수 있습니다. 

 

Built-in-types

다트의 모든 변수는 객체를 참조하기 때문에 일반적으로 생성자를 사용하여 변수를 초기화할 수 있습니다. 기본 제공 유형 중 일부는 자체 생성자가 있습니다. 예를 들어 Map() 생성자를 사용하여 지도를 작성할 수 있습니다. 

다트의 다른 타입들도 특별한 역할을 가지고 있습니다. 

・ Object: Null을 제외한 모든 Dart 클래스의 수퍼 클래스입니다. 

・ Future and Stream: 비동기 지원에 사용됩니다. 

・ Iterable: for loop와 동기 generator 함수에 사용됩니다. 

・ Never: expression이 성공적으로 마칠 수 없음을 나타냅니다. 대부분 예외를 발생시키는 함수에서 사용됩니다. 

・ dynamic: 정적 검사를 중지함을 나타냅니다. 일반적으로 Object와 Object? 를 대신 사용합니다. 

・ void: 값이 사용되지 않음을 나타냅니다. return type으로 주로 사용됩니다. 

 

- Numbers(int, double)

다트에서 Numbers는 두 가지 방법이 있습니다. 

・ int: 플랫폼에 따라 64비트 정수를 표현합니다. 

・ double: IEEE 754 표준에 명시된 64비트 부동소수점으로 실수를 표현합니다. 

int와 double은 모두 num의 subtype입니다. num 타입은 +, -, /, *등의 기본 연산자를 포함하며 abs(), ceil(), floor() 등의 메소드를 찾을 수 있습니다. num과 하위 유형이 원하는 것을 가지고 있지 않다면 dart:math 라이브러리를 찾아봅니다. 

//Integer examples
var x = 1;
var hex = 0xDEADBEEF;
var exponent = 8e5;

//double examples
var y = 1.1;
var exponents = 1.42e5;

//num examples : 변수를 num으로 선언할 수 있습니다. 이렇게 하면 int, double 둘 다 가능
num x = 1; // x can have both int and double values
x += 2.5;

//문자열을 숫자로 변환하거나 그 반대로 변환하는 방법

// String -> int
  var one = int.parse('1');
  assert(one == 1);

// String -> double
  var onePointOne = double.parse('1.1');
  assert(onePointOne == 1.1);

// int -> String
  String oneAsString = 1.toString();
  assert(oneAsString == '1');

// double -> String
  String piAsString = 3.14159.toStringAsFixed(2);
  assert(piAsString == '3.14');

int type은 비트 필드를 조작하는데 매우 유용한  비트 이동(<,>), 보완(~), AND(&), OR(|), XOR(^) 연산자들을 지원합니다

 

String

다트 문자열 Object는 일련의 UTF-16 코드 unit을 보유합니다. 작은 따옴표, 큰 따옴표를 사용하여 문자열을 만듭니다. 

var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";

${expression}을 사용하여 문자열 앞에 식 값을 넣을 수 있습니다. 식이 식별자인 경우 {}을 건너뛸 수 있습니다. 객체에 해당하는 문자열을 가져오기 위해 다트는 객체의 toString() 메소드를 호출합니다. 

var s = 'string interpolation';

assert('Dart has $s, which is very handy.' ==
    'Dart has string interpolation, '
        'which is very handy.');
assert('That deserves all caps. '
        '${s.toUpperCase()} is very handy!' ==
    'That deserves all caps. '
        'STRING INTERPOLATION is very handy!');
        
//인접한 문자열 또는 + 연산자를 사용하여 문자열을 연결 
var s1 = 'String '
    'concatenation'
    " works even over line breaks.";
assert(s1 ==
    'String concatenation works even over '
        'line breaks.');

var s2 = 'The + operator ' + 'works, as well.';
assert(s2 == 'The + operator works, as well.');

//다중 줄 문자열을 만드는 또 다른 방법: 작은 따옴표 혹은 큰 따옴표로 이루어진 세 개의 따옴표를 사용
var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

//앞에 r:을 붙여서 원시 문자열을 만들 수 있습니다.
var s = r'In a raw string, not even \n gets special treatment.';

리터럴 문자열은 채워진 식이 null 또는 숫자, 문자열 또는 bool 값으로 평가되는 컴파일 시간 상수인 한 컴파일 시간 상수입니다. 

Literal strings are compile-time constants, as long as any interpolated expression is a compile-time constant that evaluates to null or a numeric, string, or boolean value.

(⚠️ 말이 이해가 될 듯 안 갈듯 합니다. 아직은 이해가 되지 않습니다. 아래는 해당 예제입니다.)

// These work in a const string.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

// These do NOT work in a const string.
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];

const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString $aConstList';

 

Booleans

boolean 값을 나타내기 위해 dart에는 bool 이라는 타입이 있습니다. 오직 두 객체만이 bool type을 가집니다.

: 컴파일 타임 상수인 true/ false

다트의 type satety는 if(nonbooleanValue) 또는 assert(nonbooleanValue)와 같은 코드를 사용할 수 없습니다. 

// 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

모든 프로그래밍 언어에서 가장 흔한 컬렉션은 array 또는 순서가 정해진 객체 그룹일 것이다. 다트에서는 array는 list 객체로 불린다. 

// 가장 기본적인 형태의 리스트
var list = [1, 2, 3];

// 마지막 항목 뒤에 쉼표를 추가하면 가독성이 좋아져 오류를 방지하는 데 도움이 됩니다. 
var list = [
  'Car',
  'Boat',
  'Plane',
];

 

 list는 zero-based 인덱싱을 사용합니다. 0은 첫번째 값의 인덱스이고 list.length-1은 마지막 값의 인덱스입니다. JavaScript에서처럼 목록 길이를 가져오고 목록 값을 참조할 수 있습니다. 

var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);

list[1] = 1;
assert(list[1] == 1);

 

컴파일 타임 상수인 list을 만들려면 const를 list 리터럴 앞에 추가합니다. 

var constantList = const [1, 2, 3];
// constantList[1] = 1; // This line will cause an error.

 

Dart 2.3은 여러 값을 집합에 삽입할 수 있는 spread operator(...)와 null-aware operator(...?)을 도입했습니다. 

var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);

 

spread operator에 있는 식이 null일 수 있는 경우 null-aware spread operator(...?)을 사용하여 예외를 방지할 수 있습니다. 

var list;
var list2 = [0, ...?list];
assert(list2.length == 1);

 

Dart는 if, for문을 사용하여 컬렉션을 작성할 수 있습니다. 

//using collection if 
var nav = ['Home', 'Furniture', 'Plants', if (promoActive) 'Outlet'];

//using collection for
var listOfInts = [1, 2, 3];
var listOfStrings = ['#0', for (var i in listOfInts) '#$i'];
assert(listOfString[1] == '#1');

 

Sets

Dart의 set은 순서가 없는 collection입니다. Dart는 set literals와 set type을 지원합니다. 

// Set example
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

// create empty set use {} preceded by a type argument.
var names = <String>{};
// Set<String> names = {}; // This works, too.
// var names = {}; // Creates a map, not a set.

참고로 set과 map의 문법은 매우 유사합니다. 하지만 map literal이 먼저 나왔으므로 {}는 기본적으로 맵 유형이 사용됩니다. 

{}의 주석 유형이나 할당 변수를 잊으면 Map<dynamic, dynamic> 유형의 개체가 생성됩니다. 

// Add items to an existing set using add() or addAll() methods.
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);

// use .length to get the number of items in the set.
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assrert(elements.length == 5);

// To create a set that's a compile-time constant, add const before the set literal:
final constantSet = const {
	'fluorine',
    'chlorine',
    'bromine',
    'iodine',
    'astatine',
};
// constantSet.add('helium'); //This line will cause an error.

 

set도 리스트와 마찬가지로 spread operators(... and ...?) and collection if and for를 지원합니다. 

 

Maps

일반적으로 맵은 키와 값을 연결하는 객체입니다. 키와 값 모두 모든 유형의 개체일 수 있습니다. 각 키는 한 번만 발생하지만 동일한 값을 여러번 사용할 수 있습니다.

// map의 기본 형태 
var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

// create the same object using a Map constructor
var gifts = Map<String, String>();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases = Map<int, String>();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

// add a new key-value pair to an existing map 
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair

// Retrieve a value from a map
var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');

// If you look for a key that isn't in a map, you get a null in return
var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);

// use .length to get the number of key-value pairs in the map
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);

// To create map that's compile-time constant, add const before the map literal:
final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

// constantMap[2] = 'Helium'; // This line will cause an error.

Map은 리스트와 마찬가지로 spread operator(... or ...?)와 collection if and for를 지원합니다. 

 

Runes and grapheme clusters

다트에서 runes은 문자열의 유니코드 코드 포인트를 노출합니다. 문자 패키지를 사용하여 유니코드 그래프 클러스터라고도 하는 사용자가 인식한 문자를 보거나 인식할 수 있습니다. 

 

유니코드는 세계의 모든 문자, 숫자 및 기호에 사용되는 고유한 숫자 값을 정의합니다. 다트에서 유니코드를 표현하는 일반적인 방법은 /uXXXX이며, 여기서 XXXX는 4자리 16진수 값입니다. 

// 다트 유니코드 표시하기
var heart = '\u{2665}';
  print(heart);
var emoji = '\u{1f606}';
  print(emoji);
  
//출력
♥
😆

 

Symbols

기호 객체는 Dart 프로그램에 선언된 연산자 또는 식별자를 나타냅니다. 

#radix
#bar

 

반응형