Flutter : https://flutter.dev/docs/get-started/install
- 플러터는 네이티브 코드와 동등한 성능이다
- 플러터는 Material Design 과 쿠퍼티노 디자인 을 제공한다
- 플러터는 Dart 언어로 개발한다
- 구글에서 개발한 웹 프론트엔드 개발용 언어로 현재는 Flutter 개발에 주로 사용된다
- 문법이 Java/JavaScript 와 비슷하다
- 구글에서 개발중인 차세대 OS Fuchsia 의 공식 프레임워크이다
Dart : https://dart.dev/guides/language/language-tour
- 문법 연습 : https://dartpad.dev/
- Dart Keywords : dart.dev/guides/language/language-tour#keywords
- Dart Convention : dart.dev/guides/language/effective-dart/style
아래는 다트에서 가장 기본 기능으로 많이 사용하는 코드이다.
// 함수 정의
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 |
댓글