flutter-flexer / study_log

0 stars 0 forks source link

dart.dev study #2

Open winnie1219 opened 5 years ago

winnie1219 commented 5 years ago
void main() {
   print("hello, world!");
}

variables

var name = 'hyejin';
var year = 1997;
var diameter = 3.7;
var flybyObjecgts = ['jupiter', 'saturn', 'uranus', 'neptune'];
var image = {
   'tag' : ['saturn'],
   'url' : '//path/to/saturn.jpg'
};

type 바뀔 수 있는 타입이라면. Object or dynamic

dynamic name = 'Bob';
String name = 'Bob';

object 모든 objects 허용하고싶을 때 ( java or c#) dynamic 동적타입 or 타임 정해지지 않을때, 런타임동안 타입지정 원할때

void log(Object object) {
   print(object.toString());
}
// returns boolean representations for [arg], which must be a String or bool.
bool convertToBool(dynamic arg) {
   if (arg is bool) return arg;
   if (arg is String) return arg == 'true';
   throw ArgumentError('cannot convert $arg to a bool.');
}

Assert

assert(condition, optionalMessage) false 이면 넘어가지 않음

asser(urlString.startWith('https'), 'URL ($urlString) shouldstart with "https".');

Exceptions

throw FormatException('Expected at least 1 section');
void distanceTo(Point other) => throw UnimplementedError();

// catch
try {
   breedMoreLlamas();
} on OutofLlamasException {
   // a specific exception
   buyMoreLlamas();
} on Exception catch  (e) {
   // Anything else that is an exception
   print('Unknown exception: $e);
} carch (e) {
   print('Something really unknown: $e');
} 

// on, catch 모두 사용 가능. 옠외 유형 지정해야 할 경우 on을 사용. exception handler 필요할때 catch 사용
// catch에 하나 또는 두개 매개변수 지정가능. 첫번째는  thow 된 예외 두번째는  stack trace

try {
 // ...
} on Exception catch (e) {
   print('Exception details:\n $e');
} catch (e, s) {
   print('Exception details: \n $e');
   print('Stack trace:\n $s');
}

Methods

class Rectangle {
   num left, top, width, height;
   Rectangle(this.left, this.top, this.width, this.height);
   num get right => left + width;
   set right(num value) => left = value - width;
   num get bottom => top + height;
   set bottom(num value) => top = value - height;
}

void main() {
   var rect = Rectangle(3, 4, 20, 15);
   assert(rect.left == 3);
   rect.right = 12;
   assert(rect.left == -8);
}

class EffectiveDoer extends Doer { void doSomethingII) { } }

### generic
``` dart
abstract class StringCache {
   String getByKey(String key);
   void setByKey(String key, String value);
}
// generic 
abstract class Cache<T> {
   T getBykey(String key);
   void setByKey(String key, T value);
}
1more commented 5 years ago

https://dart.dev/guides/language/language-tour 의 독후감.

  1. 동적 타이핑 언어(인 줄 알았으나..) 1-1. (아니었다) Although Dart is strongly typed, type annotations are optional because Dart can infer types. 1-2. dynamic 타입이 존재하기는 한다. 1-3. 함수의 return type도 생략 가능. 마찬가지로 컴파일 타임에 추론되는 듯.
  2. 간편한 string formatting(interpolation) -> 'string sets $aVar <-here or ${bVar} <-here.'
  3. Everything you can place in a variable is an object. 3-1. Functions as first-class objects 3-2. ?. 가 존재. 3-3. named constructor 가 존재한다. 여러개의 constructor를 만들 수 있다!
  4. 모듈 지원. show / hide 키워드가 특이한 점
  5. lazy loading 지원. deferred 키워드를 붙여서 import하면 됨. -> 후에 loadLibrary()로 로딩.
  6. Async 지원. Future -> async / await
  7. Callable classes 라는 개념이 있다. call() method를 override해서 구현.
  8. _(lodash) 로 시작하는 멤버변수는 private. (따로 private/public/protected 키워드는 없다) 8-1. Q... 그럼 child class는 private변수를 상속하는가??
  9. Conditional expressions (보통 삼항연산자라 부르는 그것)에 신상이 생겼다 9-1. expr1 ?? expr2 1non-null이면 1, 아니면 2를 반환. 자주쓰는 형태라 유용할듯!
  10. Exception은 (java 처럼, 함수가 어떤 exception을 발생시키는지) 선언될 필요가 없고, 반드시 handle될 필요도 없다.
  11. catch(e, s) -> 의 첫번째 인자는 exception obj, 두번째 인자는 stack trace.
  12. mixin이라는 개념이 있다. (생성자가 없는걸로 보아, 상태값을 가지는등의 역할이 아닌)단순 재사용할 수 있는 코드를 모아둔 역할을 하는 class로 생각된다. mixin Name{} 으로 선언, 다른 class에서 with Name 으로 사용.
  13. isolate 라는 개념이 존재. 13-1. 기본적으로 dart 는 single thread로 동작한다고 한다. 하나의 isolation 내에서만 single thread 인 것인듯 하다. 각각의 isolation은 별개의 thread에서 생성되는건가? 정확히는 이해하지 못했다. 13-2. 하나의 프로그램이 여러개의 isolation을 가질 수 있다. (main thread가 자식 thread를 생성하는것과 비슷 한 개념) 13-3. isolation는 각자의 메모리/event loop 를 가지고, 서로 message passing 으로만 통신할 수 있다.