ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #6. Flutter 의 근간인 Dart - 내장 유형
    기술/Flutter 2021. 1. 27. 23:22

    들어가기 전

    원본 : Dart - Language Tour

    위 문서를 번역하며 공부한 내용입니다.

    해당 투어는 다른 언어로 프로그래밍하는 방법을 이미 알고 있다는 가정하에 문서를 진행합니다.

     

    내장 유형

    Dart 는 다음 유형에 대해 특별한 지원을 합니다.

    • numbers
    • strings
    • booleans
    • lists
    • sets
    • maps
    • runes ( 문자열에서 유니코드 문자 표현용 )
    • symbols

    리터럴을 사용하여 이러한 타입의 객체를 초기화 할 수 있습니다.

    예를 들어 this is string 은 문자열 리터럴이고 true 는 부울 리터럴입니다.

    Dart 의 모든 변수는 Object 를 참조하기 때문에 일반적으로 생성자를 통해 변수를 초기화 할 수 있습니다.

    일부 내장 타입에는 자체 생성자가 있습니다. 예를 들어 Map() 생성자를 사용하여 map 을 만들 수 있습니다.

     

    Numbers

    Dart 는 숫자를 두가지 유형으로 제공합니다.

    • int

    플랫폼에 따라 64 비트 이하의 정수입니다. Dart VM 에서 -2의 63승 부터 2의 63승까지 값이 될 수 있습니다. 자바스크립트로 컴파일된 것은 -2의 53승부터 2의 53승 -1 까지 허용합니다.

    • double

    IEEE 754 표준에 정의된 64 비트 부동 소숫점 숫자를 표시할 수 있습니다.

    int 와 double 은 num 의 하위 타입입니다. num 타입은 기본적인 연산자인 +, -, /, * 를 포함하고 있습니다.

    또한 abs(), celi(), floor() 같은 다른 메서드들도 존재합니다. 찾는 연산이 없으면 dart:math 라이브러리에 있을 수 있습니다.

    정수는 소숫점이 없는 숫자입니다. 정수 리터럴을 정의하는 예입니다.

    var x = 1;
    var hex = 0xDEADBEEF;

    만약 소숫점을 포함한다면 double 형을 사용합니다. 다음은 double 리터럴을 정의하는 예제입니다.

    var y = 1.1;
    var exponents = 1.42e5;

    정수 리터럴은 필요할 때 자동적으로 double 형으로 변환됩니다.

    double z = 1; // double z = 1.0 과 동일합니다.

    문자열을 숫자로 또는 그 반대로 바꾸는 방법은 다음과 같습니다.

    // String -> int
    var one = int.parse('1');
    assert(one == 1);
    
    // String -> double
    var onePointOne = doueble.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 타입은 비트 연산 (<<. >>, &, |) 을 제공합니다.

    assert((3 << 1) == 6); // 0011 << 1 == 0010
    assert((3 >> 1) == 1); // 0011 >> 1 == 0001
    assert((3 | 4) == 7); // 0011 | 0100 == 0111

    리터럴 숫자는 컴파일 타임의 상수입니다. 피연산자가 숫자로 평가된다면 산술식은 컴파일 타임 상수이기도 합니다.

    const msPerSecond = 10900;
    const secondsUntilRetry = 5;
    const msUntilRetry = secondsUntilRetry * msPerSecond;

    Strings

    Dart 문자열은 UTF-16 코드의 단위입니다. 작은 따옴표 또는 큰 따옴표를 통해 문자열을 만들 수 있습니다.

    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} 를 사용하여 표현식을 포현식을 포함할 수 있습니다. 표현식이 식별자인 경우 {} 를 생략할 수 있습니다. 객체의 문자열 값을 가져오기 위해 Dart 는 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 s3 = """This is also a
    multi-line string.""";

    r 접두사를 사용하여 원시 문자열을 생성할 수 있습니다.

    var s = r'원시 문자열에서는 \n 도 특별한 취급을 받지 못합니다.';

     

    문자열은 보간 식이 null 또는 문자, 숫자, 또는 부울 값으로 평가되는 컴파일 타임 상수일 경우 컴파일 타임 상수입니다.

    // 이것들은 상수 문자에서 작동합니다.
    const aConstNum = 0;
    const aConstBool = true;
    const aConstString = '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

    부울 값을 나타내야하는 경우 Dart 는 bool 이라는 이름의 타입을 가지고 있습니다. true, false 두 객체만 bool 타입을 가집니다. 두 값은 컴파일 타임 상수입니다.

    Dart 의 type safty 하다는 의미는 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 iMeanToDothis = 0 / 0;
    assert(iMeanToDothis.isNaN);

     

    Lists

    거의 모든 프로그밍 언어에서 가장 일반적인 컬렉션은 배열 또는 정렬된 객체 그룹일 것입니다. Dart 에서 배열은 List 객체입니다. 그래서 대부분의 사람들이 list 라고 부릅니다.

    리스트 리터럴은 javascript 의 배열 리터럴과 동일합니다.

    var list = [1, 2, 3];
    Dart 는 list 의 형태가 List<int> 라고 추론할 것입니다. 만약 숫자가 아닌 객체를 리스트에서 넣는다면 분석기 또는 런타임에서 에러가 발생합니다.

    Dart 는 마지막 항목 뒤 컴마를 추가할 수 있습니다. 이 마지막 컴마는 아무런 영향도 없지만 복사-붙여넣기의 에러 예방에 도움이 됩니다.

    var list = [
    	'Car',
    	'Boat',
    	'Plane',
    ];

    리스트는 zero-based 인덱스를 사용합니다. 여기서 0 은 첫번째 값이고 list.length - 1 은 마지막 값입니다. 자바스크립트와 같이 목록의 길이를 가져오고 목록의 값을 참조할 수 있습니다.

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

    const 를 붙여 리스트를 생성하는 것은 컴파일 타임 상수입니다.

    var constantList = const [1, 2, 3];
    // constantList[1] = 1; // 이렇게 사용하면 에러가 납니다.

    Dart 2.3 에서는 spread operator 와 null-aware spread operator 의 여러 값을 삽입하는 간결한 방법을 제공하는 연산자가 추가되었습니다.

    예를 들어 spread 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 는 또한 리스트를 만들 때 조건문과 반복문을 사용할 수 있는 collection if 와 collection ofr 를 제공합니다.

    collection if 를 사용하여 세개 또는 네개의 아이템을 생성하는 예입니다.

    var nav = [
    	'Home',
        'Furniture',
        'Plants',
        if (promoActive) 'Outlet'
    ]

     

    collection for 를 사용해 목록의 항목을 다른 목록에 추가하기 전에 조작하는 예입니다.

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

    Sets

    set 은 정렬되지 않고 유일한 아이템을 가진 컬렉션입니다. Dart 는 Set 타입을 사용해 set 리터럴을 제공합니다.

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

     

     

     

    List 타입과 동일하게 halogens 는 Set<String> 타입으로 유추됩니다. 만약 다른 타입을 컬렉션에 넣는다면 분석기나 런타임에 에러가 납니다.

    빈 Set 을 생성하기 위해서는 하나의 타입과 {} 를 사용하거나 Set 타입의 변수를 정의합니다.

    var names = <String>{};
    // Set<String> names = {}; // This works. too.
    // var names = {}; // Creates a map, not a set.
    Set or Map? 두개의 리터럴 구문은 비슷합니다. Map 리터럴이 먼저 생겨 {} 는 기본적으로 Map 타입입니다.
    {} 에 타입을 지정하지 않은 경우 Dart 는 기본적으로 Map<dynamic, dynamic> 의 객체가 생성됩니다.

    set add(), addAll() 메서드를 사용하여 아이템을 추가해봅니다.

    var elements = <String>{};
    elements.add('fluorine');
    elements.addAll(halogens);

    .length 를 사용하여 set 에 담긴 아이템의 숫자를 확인할 수 있습니다.

    var elements = <String>{};
    elements.add('fluorine');
    elements.addAll(halogens);
    assert(elements.length == 5);

    set 리터럴에 const 를 붙인다면 컴파일 타임 상수로 생성됩니다.

    final constantSet = const {
    	'fluorine',
        'chlorine',
        'bromine',
        'iodine',
        'astatine',
    }
    // constantSet.add('helium'); // this line will cause an error.

    Set 은 List 가 동작하는 것 처럼 spread operator 나 collection if, for 가 동작합니다.

    Maps

    map 은 키와 값을 연결하는 객체입니다. 키와 값은 아무 타입의 객체나 가능합니다.

    각 키는 하나만 사용가능하지만 값은 중복될 수 있습니다. Dart 는 Map 타입을 사용하여 map 리터럴을 제공합니다.

    var gifts = {
        // Key: Value
        'first': 'partridge',
        'second': 'tutledoves',
        'fifth': 'golden rings'
    };
    
    var nobleGases = {
        2: 'helium',
        10: 'neon',
        18: 'argon',
    };
    gifts 는 Map<String, String> 으로 추론되고 nobleGases 는 Map<int, String> 으로 추론됩니다.
    만약 다른 값을 넣을 경우 분석기나 런타임 에러가 납니다.

    Map 생성자를 통해서도 객체를 생성할 수 있습니다.

    var gifts = Map();
    gifts['first'] = 'partridge';
    gifts['second'] = 'turtledoves';
    gifts['fifth'] = 'golden rings';
    
    var nobleGases = Map();
    nobleGases[2] = 'helium';
    nobleGases[10] = 'neon';
    nobleGases[18] = 'argon';
    C# 이나 Java 를 사용했다면 new Map() 이 더 익숙합니다. Dart 에서 new 는 생략해도 됩니다.

    만약 이미 존재하는 map 에 새 값을 넣고싶은 경우 자바스크립트처럼 넣으면 됩니다.

    var gifts = {'first': 'partridge'};
    gifts['fourth'] = 'calling birds';

    값을 가져오고 싶은 경우도 자바스크립트 처럼 쓰면 됩니다.

    var gifts = {'first': 'partridge'};
    assert(gifts['first'] == 'partridge');

    만약 주어진 키가 map 이 없다면 null 을 리턴합니다.

    var gifts = {'first': 'partridge'};
    assert(gifts['fifth'] == null);

    map 에 사용된 key-value 개수를 가지고 오고싶다면 .length 를 사용합니다.

    var gifts = {'first': 'partridge'};
    gifts['fourth'] = 'calling birds';
    assert(gifts.length == 2);

    map 리터럴에 const 를 붙여 생성하면 컴파일 타임 상수입니다.

    final constantMap = const {
        2: 'helium',
        10, 'neon',
        18: 'argon',
    };
    
    // constantMap[2] = 'Helium'; // This line will cause an error.

    Map 은 List 가 동작하는 것처럼 spread operator 나 collection if, for 가 동작합니다.

    Runes and grapheme clusters

    Dart 의 runes 는 문자열의 유니코드 코드 포인트를 노출합니다. characters package 를 사용하여 Unicode (extended) grapheme clusters 라고도 하는 사용자가 인식하는 문자를 보거나 조작할 수 있습니다.

    유니코드는 세계의 모든 문자 시스템에 사용되는 각 문자, 숫자 및 기호에 대한 고유한 숫자 값을 정의합니다. Dart 문자열은 UTF-16 코드 단위의 시퀀스이기 때문에 문자열 내에서 유니코드 코드 포인트를 표현하려면 특별한 구문이 필요합니다. 유니코드 포인트를 표현하는 일반적인 방법은 \uXXXX 이며 여기서 XXXX 는 4자리 16진수 값입니다. 예를 들어, 하트 문자(♥)는 \u2665 입니다. 4자리 이상의 16진수를 지정하려면 값을 {} 안에 작성합니다. 예를 들어, 웃는 이모티콘(😆)은 \u{1f606}입니다.

    개별 유니코드 문자를 읽거나 써야하는 경우 문자열에 정의된 문자 집합을 characters packages 로 사용합니다. 반환된 문자 개체는 일련의 grapheme cluster 로서 문자열입니다. 다음은 characters API 를 사용한 예 입니다.

    import 'package:characters/charaters.dart';
    ...
    var hi = 'Hi 🇩🇰';
    print(hi);
    print('The end of the string: ${hi.substring(hi.length - 1)}');
    print('The last character: ${hi.characters.last}\n');

    개발환경에 따라 출력은 이렇게 보입니다.

     dart bin/main.dart
    Hi 🇩🇰
    The end of the string: ???
    The last character: 🇩🇰

     

    Symbols

    Symbol 은 Dart 에서 선언된 연산자나 식별자를 나타냅니다. symbol 을 사용할 필요는 없지만 식별자 이름은 변경되지만 식별자 기호는 변경되지 않으므로 이름별로 식별자를 참조하는 API 에는 매우 중요합니다.

    식별자 대한 Symbol 을 얻으려면 식별자 앞에 # 을 사용합니다.

    #radix
    #bar

    Symbol 리터럴은 컴파일 타임 상수입니다.

    '기술 > Flutter' 카테고리의 다른 글

    #5. Flutter 의 근간인 Dart - 변수  (0) 2021.01.27
    #4. Flutter 의 근간인 Dart - 키워드  (0) 2021.01.27
    #3. Flutter 의 근간인 Dart - Dart 의 컨셉  (0) 2021.01.27
    #2. Flutter CLI  (0) 2021.01.23
    #1. Flutter Roadmap - Github 자료  (0) 2021.01.23

    댓글 0

Designed by Tistory.