Dart

[Dart] Dart Docs - Variables

  • -
728x90

변수 선언

var 키워드를 사용한다면, Dart 역시 Javascript/Typescript와 같이 타입추론을 통해 변수를 선언할 수 있다.

또한, String이라던지 구체적으로 타입을 명시하여 선언할 수도 있다. 만약 객체가 단일 타입으로 제한되지 않는다면, Object 타입으로 명시할 수 도 있다.

var name = "Wonil"
String name = "WONILLISM"
Object name = "WONIL"

변수 타입

그렇다면 어떤 종류의 변수들을 제공하는지 알아보자.

Built-in types

  • Numbers (int, double)
  • String (String)
  • Booleans (bool)
  • Records ((value1, value2))
  • Lists (List, 배열)
  • Sets (Set)
  • Maps (Map)
  • Runes (Runes; 종종 characters API로 대체됨)
  • Symbols (Symbol)
  • The value null (Null)

Dart의 모든 변수는 객체, 즉 클래스의 인스턴스를 참조하므로 일반적으로 생성자를 사용하여 변수를 초기화할 수 있다.

예를 들어 Map() 생성자를 사용하여 Map을 만들 수 있다.

몇가지 다른 유형도 Dart에서 특별한 역할을 한다.

  • Object : Null을 제외한 모든 Dart 클래스의 슈퍼클래스이다.
  • Enum : 모든 열겨형의 슈퍼클래스이다.
  • Future, Stream : 비동기 지원시 사용된다.
  • Iterable : for-in 루프와 동기식 제너레이터 함수에 사용된다.
  • Never : 표현식이 평가를 성공적으로 완료할 수 없음을 나타낸다. 항상 예외를 던지는 함수에 가장 자주 사용된다.
  • dynamic : 정적 검사를 비활성화할 것임을 나타낸다. 일반적으로 Object 또는 Object? 대신 사용된다.
  • void : 값이 사용되지 않음을 나타낸다. 일반적으로 반환값에 사용

Numbers

  • int
    • 정수 값은 플랫폼에따라 64bit 이하의 값이다.
  • double
    • IEEE 754 표준에 지정된 65bit 부동소수점 값이다.

int와 double은 모두 num의 하위 유형이다.

 

Dart의 모든 변수들은 Class 이기 때문에, 객체들은 각각의 메소드를 가지고 있다.

자세한 내용은 링크를 확인해보자.

 

String to (int, double), (int, double) to String과 같은 메소드를 제공한다.

 

Strings

Dart String은 UTF-16코드 단위의 시퀀스를 포함하며, ' 또는 "를 사용하여 문자열을 만들 수 있다.

문자열 안에 ${expression}으로 표현식을 사용할 수 있으며, 표현식이 식별자인 경우 {}없이도 사용가능하다. 

 

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.";

print('${s} 중괄호 있음');
print('$s 중괄호 없음');

 

javascript나 python 처럼 +를 사용하여 문자열을 합칠 수 있다.

 

또한 Dart는 multi-line string과 r 접두사를 사용하여 "raw" string도 제공한다.

var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = r'In a raw string, not even \n gets special treatment.';

 

(dartpad에서 test했을 때 raw 문자열은 작동하지 않았다.)

 

당연한 이야기겠지만, 변수를 표현식으로 사용할 때 상수 안에서는 작동하지 않는다.

// 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';
print(validConstString);

// NOT work
const invalidConstString = '$aNum $aBool $aString $aConstList';
print(invalidConstString);

 

Booleans

다른 언어들처럼 Dart 역시 Boolean 형태의 변수를 제공한다.

하지만 if() 나 assert()는 조건식에 Boolean형태가 아닌 변수는 들어갈 수 없다.

체크를 위해서는 아래와 같이 사용할 수 있다.

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

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

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

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

 

Runes and grapheme clusters

Dart에서 rune은 문자열의 유니코드 코드 포인트를 보여준다. 문자 패키지를 사용하여 유니코드, grapheme cluster라고도하는 문자를 보거나 조작할 수도 있다.

Dart문자열은 UTF-16 단위이므로 문자열 내에서 유니코드 코드 포인트를 표현하려면 특별한 구문이 필요하다. ((♥) is \u2665, (😆) is \u{1f606})

 

import 'package:characters/characters.dart';

void main() {
  var hi = 'Hi 🇩🇰';
  print(hi);
  print('The end of the string: ${hi.substring(hi.length - 1)}');
  print('The last character: ${hi.characters.last}');
  print('\u{1f606}');
}

 

 

Symbols

기호 개체는 Dart 프로그램에서 선언된 연산자 또는 식별자를 나타낸다. 심볼을 사용할 필요가 없을 수도 있지만, 축소하면 식별자 이름은 변경되지만 식별자 기호는 변경되지 않으므로 식별자를 이름으로 참조하는 API에 매우 유용하다.

식별자의 심볼을 가져오려면 # 뒤에 식별자를 붙인 심볼 리터럴을 사용하면 된다:

#radix
#bar

 

 

Null safety

프로그램을 개발하다 보면 null 참조 에러가 많이 발생한다. null safety는 이 문제를 코드가 실행되기 전 컴파일러가 해당 버그를 잡아줌으로써 예상치 못한 상황을 대비할 수 있게 해준다.

 

Null safety는 null로 설정된 변수에 의도하지 않게 액세스하여 발생하는 오류를 방지한다. 이 오류를 널 역참조 오류라고 한다. 널 역참조 오류는 널로 평가되는 표현식에서 프로퍼티에 액세스하거나 메서드를 호출할 때 발생한다. 이 규칙의 예외는 toString() 또는 hashCode와 같이 null이 해당 속성 또는 메서드를 지원하는 경우이다. 널 안전성을 통해 Dart 컴파일러는 컴파일 시 이러한 잠재적 오류를 감지한다.

String? name  // Nullable type. Can be `null` or string.

String name   // Non-nullable type. Cannot be `null` but can be string.



 

Late Variables

Dart에서는 Late 변수를 제공한다. 선언과 동시에 값을 할당하지 않고, 인스턴스가 생성된 후에 값을 할당할 수 있는 변수다.

Late변수를 사용하면 non-nullable변수의 초기화를 나중에 할 수 있다. 

 

late 변수는 클래스의 인스턴스 변수나 메소드의 매개변수에도 사용할 수 있다.

 

void main() {
  late String lateInitializedString;

  print('Before initialization');
  
  // 나중에 초기화
  lateInitializedString = 'Initialized!';
  
  print('After initialization: $lateInitializedString');
}

 

 

Final and const

Dart에서 final와 const 키워드는 한 번 할당된 후에는 값을 변경할 수 없는 변수를 선언할 때 사용된다.

 

두 키워드 모두 값을 변경할 수 없는 변수를 선언하는데 사용되지만, 중요한 차이점이 몇 가지 있다.

final vs const

  1. 초기화 시점
    • const : 컴파일 타임 상수 또는 상수 표현식으로 초기화해야 한다. 즉, 변수가 선언될 때 이미 컴파일러에 의해 값을 알 수 있어야 한다.
    • final : 런타임에 초기화될 수 있으며, 변수가 사용되는 시점에 값을 알 수 있어야 한다.
  2. 사용 가능한 타입
    • const : 컴파일 타임에 알려진 값을 사용해야 한다. 이는 리터럴 값 또는 컴파일 타임에 결정되는 상수 표현식에 해당한다.
    • final : 런타임에 알려진 값을 사용할 수 있으며, 따라서 동적인 값을 할당할 수 있다.
  3. 활용 분야
    • const : 주로 컴파일 타임에 결정되는 상수 값들을 나타내는 데 사용된다. 예를 들어 숫자, 문자열 리터럴 등이 포함된다.
    • final : 런타임에 결정되는 값 또는 동적으로 계산되는 값에 사용된다.
void main() {
  // const 변수
  const int compileTimeConst = 42;

  // final 변수
  final int runtimeValue = DateTime.now().millisecondsSinceEpoch;

  print('Compile-time constant: $compileTimeConst');
  print('Runtime value: $runtimeValue');
}

 

728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.