본문 바로가기
기타개발/Flutter

Dart #1 : Type, Collections, Final, Const etc.

by 궝테스트 2020. 8. 26.

Flutter : https://flutter.dev/docs/get-started/install

  • 플러터는 네이티브 코드와 동등한 성능이다
  • 플러터는 Material Design쿠퍼티노 디자인 을 제공한다
  • 플러터는 Dart 언어로 개발한다
    • 구글에서 개발한 웹 프론트엔드 개발용 언어로 현재는 Flutter 개발에 주로 사용된다
    • 문법이 Java/JavaScript 와 비슷하다
    • 구글에서 개발중인 차세대 OS Fuchsia 의 공식 프레임워크이다

 

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

아래는 다트에서 가장 기본 기능으로 많이 사용하는 코드이다.

// 함수 정의
printInteger(int aNumber) {
  print('The number is $aNumber.'); // 콘솔에 출력
}

// 앱 실행이 시작되는 필수 main() 함수
main() {
  var number = 42; // 타입을 지정하지 않고 변수 선언 및 초기화
  printInteger(number); // 함수 호출
}

 

0. Important concepts

  • 변수에 넣을 수있는 모든 것은 Object 이고, 모든 객체는 class 의 인스턴스이다. (숫자, 함수, null 도 객체이다)
  • 모든 객체는 Object 클래스에서 상속된다
  • 타입 추론 가능하며, 예상되는 유형이 없다고 명시적으로 말하려면 특수 타입인 dynamic 을 사용한다
    • var name = 'Bob';
    • dynamic name = 'Bob';
    • String name = 'Bob';
  • List<int> 또는 List<dynamic> 도 지원한다
  • 변수 선언 시 기본값은 null 이다
    • int lineCount
  • 최상위 함수 (ex: main()) 와 클래스 또는 객체에 연결된 함수 (각각 정적 및 인스턴스 메서드) 를 지원한다
  • 함수 내에서 함수 (중첩 또는 로컬 함수) 를 만들 수 있다
  • 마찬가지로 최상위 변수와 클래스 또는 객체에 연결된 변수 (정적 및 인스턴스 변수) 를 지원한다
  • 인스턴스 변수는 필드 또는 속성이라고도 한다
  • Java 와 달리 Dart 에는 public, protected 및 private 키워드가 없으며, 식별자가 밑줄 (_)로 시작하면 라이브러리에 비공개이다

 

1. Comments

다트는 3가지 주석을 지원한다.

  • // 한 줄 주석
  • /* 여러 줄 주석 */
  • 문서 주석
    • /// 또는 / ** 로 시작하는 여러 줄 또는 한 줄 주석
    • 연속 된 줄에 /// 를 사용하면 여러 줄의 문서 주석과 동일한 효과
    • 문서 주석 내에서 다트 컴파일러는 대괄호로 묶지 않는 한 모든 텍스트를 무시한다
    • 대괄호를 사용하여 클래스, 메서드, 필드, 최상위 변수, 함수 및 매개 변수를 참조 할 수 있다
    • 괄호 안의 이름은 문서화 된 프로그램 요소의 어휘 범위에서 확인가능하다.
/// A domesticated South American camelid (Lama glama).
///
/// Andean cultures have used llamas as meat and pack
/// animals since pre-Hispanic times.
class Llama {
  String name;

  /// Feeds your llama [Food].
  ///
  /// The typical llama eats one bale of hay per week.
  void feed(Food food) {
    // ...
  }

  /// Exercises your llama with an [activity] for
  /// [timeLimit] minutes.
  void exercise(Activity activity, int timeLimit) {
    // ...
  }
}

위 예제로 생성 된 문서에서 [Food]는 Food 클래스의 API 문서에 대한 링크가된다.
다트 코드를 파싱하고 HTML 문서를 생성하려면 SDK의 dartdoc(문서 생성 도구)를 사용할 수 있습니다.

2. Built-in types : 기본 타입

다트는 다음과 같은 타입들을 제공한다
: num, int, double, String, bool, List, Set, Map, runes, symbols

2-1. Numbers

  • 정수 int 와 실수 double 이 있으며 둘 다 num 의 하위 타입이다
  • Dart 2.1 이후부터 int 는 자동으로 double 로 변환 가능하다
  • num 타입에는 사칙연산(+, -, /. *) 과 같은 기본 연산자가 포함된다
  • abs(), ceil(), floor() 같은 다른 메소드들도 있다
  • >> 와 같은 비트 연산자는 int 클래스에 정의되어 있다
  • dart:math 라이브러리를 import 하면 다른 메소드도 사용할 수 있다
var a = 1;      // int
var b = 1.1;    // double

int x = 1;      // int
double y = 1.1; // double

 


2-2. Strings

  • String 은 작은 따옴표('') 또는 큰 따옴표("") 로 문자열을 만들 수 있다
  • 또는 ${expression} 을 사용하여 문자열 내에 값 또는 표현식을 넣을 수 있다
  • + 연산자로 문자들을 조합할 수 있다
  • 여러 줄 문자열은 ''' 또는 """ 으로 감싸서 만들 수 있다
  • r 을 r'문자열' 처럼 앞에 붙이면 raw string 을 출력할 수 있다
// 기본
var s1 = '작음 따옴표로 문자열을 만들어 본다.';
var s2 = "큰 따옴표로 문자열을 만들어 본다";
var s3 = '작은 따옴표일 경우 잇츠는 이렇게 It\'s 쓴다.';
var s4 = "큰 따옴표일 경우 잇츠는 It's 이렇게 쓴다.";

// ${expression}
var s = 'string';
assert('문자다 $s' == '문자다 string');
assert('대문자로 바꾼다 ${s.toUpperCase()}' == '대문자로 바꾼다 STRING');

// + 연산자
var s5 = "five"
var s6 = "six"
assert(s5 + s6, "fivesix")

// 여러 줄 문자열
var s7 = '''multi line s7
hahahahahaha'''

var s8 = """multi line s8
hahahahahaha"""

// raw string
var s9 = "hi \n hello"
assert(s9, "hi
hello")

var s10 = r"hi \n hello"
assert(s10, "hi \n hello")


2-3. int, double, String 타입 변환

// 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 타입의 bit 연산
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7);  // 0011 | 0100 == 0111


2.4. Booleans

  • bool 타입으로 나타내며 값은 true/false 로 설정할 수 있다
// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty); // true

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

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

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

 

3. Built-in types : Collections

3-1. Lists

  • 다트에서 배열은 List 객체이므로 List 라고 한다
  • List 는 JavaScript array 처럼 보인다
  • 순서를 보장하고 중복을 허용한다
  • 아래 예제처럼 int 로 이루어진 값들로 초기화하면 List<int> 타입으로 타입 추론한다
  • index 는 0 부터 시작하고 length 로 길이를 가져올 수 있다
var list = [1, 2, 3];

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

list[1] = 1;
assert(list[1] == 1);
  • Dart 2.3 부터는 컬렉션에 여러 요소를 간단하게 삽입할 수 있는 spread 연산자 ... 과 null-aware spread 연산자 ...? 을 제공한다
// spread 연산자 ...
var list = [1, 2, 3];
var list2 = [0, ...list]; // [0, 1, 2, 3]
assert(list2.length == 4);

// null-aware spread 연산자 ...?
var list;
var list2 = [0, ...?list]; // [0]
assert(list2.length == 1);

 


3-2. Sets

  • Set 은 순서를 보장하지 않고 중복도 허용하지 않는다
  • 아래 예제처럼 String 으로 이루어진 값들로 초기화하면 Set<String> 타입으로 타입 추론한다
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

// 비어있는 Set 생성
var names = <String>{};
Set<String> names = {};

// 이 경우는 map 으로 인식한다
var names = {};

// 아이템 추가
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);

// length 로 Set 의 사이즈를 알 수 있다
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assert(elements.length == 5);


3-3. Maps

  • Map 은  key 와 value 로 이루어져있는 객체이다
  • 키와 값은 모든 타입을 사용할 수 있다
  • 키는 중복이 허용되지 않는다
  • 아래 예제처럼 key:value 타입에 따라 gifts 는 Map<String, String>,  nobleGases 는 Map<int, String> 으로 타입 추론 한다
  • List 와 마찬가지로 spread operator 를 제공한다. (spread operator 목적은 Spread Collections 참고)
var gifts = {
  // Key: Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

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

// 아래와 같이 생성 할 수 있다
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';

 

4.  Runes and grapheme clusters

  • 다트에서 runes 는 문자열의 유니 코드의 포인트를 보여준다
  • ex) 하트(♥) 는 \u2665, 웃는 이모티콘(😆)은 \u{1f606}
  • 개별 유니 코드 문자를 읽거나 써야하는 경우 characters 패키지에 의해 String 에 정의 된 문자 getter를 사용
import 'package:characters/characters.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');

// result
Hi 🇩🇰
The end of the string: ???
The last character: 🇩🇰

 

5. Symbols

  • Symbol 객체는 Dart 프로그램에서 선언된 operator 또는 idenfitier 를 나타낸다
  • name 이 밑줄(_) 로 시작하지 않는 public 단일 식별자
  • 또는 정규화 된 식별자 등
  • 이름의 내용에 # 을 붙인다
assert(new Symbol("foo") == #foo);
assert(new Symbol("[]=") == #[]=]);
assert(new Symbol("foo.bar") == #foo.bar);
assert(identical(const Symbol("foo"), #foo));
assert(identical(const Symbol("[]="), #[]=]));
assert(identical(const Symbol("foo.bar"), #foo.bar));

const Symbol("_foo") // Invalid

 

6. Final and const

  • 변수를 변경하지 않으려면 var 대체하거나 타입 앞에 final 또는 const 를 추가한다

6-1. Final

  • 컴파일 타임 또는 런타임시에 결정되는 값을 설정 할 수 있다
  • 최상위 또는 클래스 변수는 처음 사용될 때 한 번만 초기화된다
  • 인스턴스 변수는 final 일 수 있지만 const는 될 수 없다
  • final 인스턴스 변수는 생성자가 시작되기 전 (변수 선언, 생성자 매개 변수 또는 생성자의 이니셜 라이저 목록에서) 초기화되어야 한다
final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';

name = 'Alice'; // Error: final 변수는 한 번만 셋팅할 수 있다

 

6-2. Const

  • 컴파일 타임에 값을 설정한다 (상수는 암시적으로 final)
  • const 변수가 클래스 수준에 있으면 static const 로 표시한다
  • 모든 변수는 상수 값을 가질 수 있다
  • const 키워드는 상수 값을 생성하고 상수 값을 생성하는 생성자를 선언 할 수도 있다
  • 참고 : const 중복 사용 금지
// Constant int & double
const bar = 1000000;
const double atm = 1.01325 * bar;


// Constant List #1
var foo = const [1, 2, 3];
foo[1] = 1; // Error

// const [] 값이 있었더라도 non-const, non-final 변수는 값을 변경 할 수 있다
foo = [1, 2, 3];


// Constant List #2
final bar = const [];
const baz = []; // const [] 와 동일

// Error: Const 변수는 값을 재할당 할 수 없다
baz = [42];


// Constant Set
final constantSet = const {
  'fluorine',
  'chlorine',
  'bromine',
  'iodine',
  'astatine',
};
constantSet.add('helium'); // Error


// Constant Map
final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};
constantMap[2] = 'Helium'; // Error

 

'기타개발 > Flutter' 카테고리의 다른 글

Dart #6 : Abstract, Implicit interface, Extends  (0) 2020.08.28
Dart #5 : Classes, Constructor  (0) 2020.08.28
Dart #4 : if-else, for/while/do-while, switch, exceptions  (0) 2020.08.27
Dart #3 : Operators  (0) 2020.08.27
Dart #2 : Functions  (1) 2020.08.27

댓글