dart (flutter) 문법 - ! (느낌표, exclamation mark)

// 리턴값이 항상 null이 아니지만 예를 위한 함수. // int? 는 getInt()가 null을 리턴할 수 있다고 명시해 준다. int? getInt () { return 3 ; } void main () { // int? 는 변수에 null 을 허용하는 표현 . int? a = getInt() ; // ERROE int b 는 null 을 허용하지 않는데 // getInt() 는 null 을 리턴할 수도 있으므로 에러가 난다 . //int b = getInt(); // getInt()! 에서 null 을 리턴하지 않는다고 // getInt() 의 끝에 ! 를 명시해 에러가 나지 않는다 . int c = getInt()! ; } null 에러가 많이 나서 이런 기능을 추가 했다고 하는데 그다지 좋은 해결법이 아닌거 같다. !를 붙여도 에러가 날 수 있는 구멍이 많다.

dart (flutter) 문법 - 클래스. class, abstract, implements, factory

클래스 기본 예제. dart에서는 단일 상속만 가능하다. class Point { double? x ; double? y ; // 이름 없는 생성자 . 하나만 가능하다 . Point(double x , double y) { this . x = x ; this . y = y ; } // 이름있는 생성자 . Point. init () : x = 0 , y = 0 { } // 이름 없는 생성자 호출 . Point. init2 () : this ( 0 , 0 ) { } int GetV () { return 1 ; } } class Point3D extends Point { final bool i3D = true; double z = 0 ; // 생성시 부모 클래스 생성자 호출 . Point3D(double x , double y , double z) : super (x , y) { this . z = z ; } // 부모의 함수를 재정의 할 수 있다 . @override int GetV () { return 2 ; } } void main () { var p1 = Point ( 2 , 2 ) ; var p2 = new Point3D ( 2 , 2 , 2 ) ; print( 'The type of a is ${p1. runtimeType } ' ) ; } 추상 클래스. 인스턴스화 되지 않는 클래스로 주로 인터페이스 정의에 사용된다. abstract class AbstractContainer { void updateChildren () ; // 추상 함수 . } class ClassA extends AbstractContainer { // 추상 함수 정의 . void updateChildren () {} } implements (인터페이스) 상속받지 않고 다른 클래스의 인터페이스를 지원할 수 있다. 여러 클래스의 인터페이스를 지원합니다.

dart (flutter) - 함수.

알림 - dart는 함수 표현법이 다양합니다.  이 문서에서는 제가 선호하는 유형만 다룹니다. 아래 3가지 함수는 동일한 동작의 함수 입니다. bool isOne (int one) { return one == 1 ; } isOne2 (one) { return one == 1 ; } bool isOne3 (int one) => one == 1 ; 보통 함수. // 호출 . int n = test( true, 1 ) ; // 정의 . int test (bool isB , int numN) { return numN ; } 이름 있는 함수. test2 (isB: true, numN: 1 ) ; test2(numN: 1 ) ; // test2(true, 1); // error // {} 로 둘러싸면 호출시 변수명을 명시해야 한다 . void test2({bool? isB , int? numN}) {} test2_1 (isB: true, numN: 1 ) ; test2_1(isB: true ) ; // error test2_1(numN: 1 ) ; // required 를 붙여주면 실행하는데 꼭 필요한 함수 . void test2_1({bool? isB , required int numN}) {} 옵션 인수 함수.   test3(true, 1);   test3();   test3(false); // [] 로 둘러싸면 호출시 인수를 입력하지 않으면 기본값을 지정해 줍니다. void test3 ([bool isB = true, int numN = 1 ]) {} forEach 에서 익명함수. var intList = [ 1 , 2 , 3 ] ; intList.forEach((item) { print(item) ; }) ; int List.forEach((item) => print(item)) ;

dart (flutter) 문법 - typedef.

// 기존 타입의 별칭을 만들수 있다 . typedef IntList = List<int> ; // 함수의 형태를 타입으로 사용 가능 . typedef Compare(int n , int m) ; bool maxLeft (int a , int b) { return a > b ; } bool compareAB (int a , int b , Compare cp) { return cp(a , b) ; } void main () { IntList il = [ 1 , 2 , 3 ] ; int a = 2 ; int b = 1 ; bool isLeftMax = compareAB(a , b , maxLeft ) ; }

dart (flutter) 문법 - 제어문. if, for, forEach, switch

- if 문. if (isRaining()) { you.bringRainCoat() ; } else if (isSnowing()) { you.wearJacket() ; } else { car.putTopDown() ; } - for, forEach 문. var message = StringBuffer ( 'Dart is fun' ) ; for ( var i = 0 ; i < 5 ; i++) { message.write( '!' ) ; } for ( final candidate in candidates) { candidate.interview() ; } var collection = [ 1 , 2 , 3 ] ; collection. forEach (print) ; // 1 2 3 - while, do while 문. while (!isDone()) { doSomething() ; } do { printLine() ; } while (!atEndOfPage()) ; - switch 문.  test () { var command = 'OPEN' ; switch (command) { case 'OPEN' : executeOpen() ; break; default : executeUnknown() ; } } 참고. https://dart.dev/guides/language/language-tour#control-flow-statements

dart (flutter) - 예외.

test () { try { throw OutOfLlamasException( 'Expected at least 1 section' ) ; throw 'Out of llamas!' ; } on OutOfLlamasException { // A specific exception buyMoreLlamas() ; } on Exception catch (e) { // Anything else that is an exception print( 'Unknown exception: $e ' ) ; } catch (e) { print( 'Error: $e ' ) ; // Handle the exception first. } finally { cleanLlamaStalls() ; // Then clean up. } }

dart (flutter) 문법 - 연산자.

* 주의 설명과 연산자의 구분자는 '=>' 입니다. 단항 접미사 => expr++    expr--    ()    []    ?[]    .    ?.    ! 단항 접두사 => -expr    !expr    ~expr    ++expr    --expr      await expr    곱셈 나눗셈 => *    /    %  ~/ 더하기 빼기 => +    - 비트 쉬프트 => <<    >>    >>> 비트연산자 AND => & 비트연산자 XOR => ^ 비트연산자 OR => | 값비교 및 형식비교 =>  >=    >    <=    <    as    is    is! 같은지, 다른지 => ==    !=    논리 AND => && 논리 OR => || null 인지 => ?? 삼항 연산자 => expr1 ? expr2 : expr3 캐스케이드(동일한 인스턴스 멤버 호출) => ..    ?.. 할당연산자 => =    *=    /=   +=   -=   &=   ^=   etc. 참고. https://dart.dev/guides/language/language-tour#operators - 단항 접미사, 단항 접두사, 곱셈 나눗셈, 더하기 빼기, 할당연산자 int i = 1; i++; // i == 2 i = 1; int y = i + i; // i == 2 i = 1; int y = i * i; // i == 1 i = 1; i += 2; // i == 3 - 비트 쉬프트, 비트연산자  int i = 1; // 예를  들어 1의 비트가 0001 이라면 i << 1; // 연산으로 0010가 되고 int값으로 2가 됨. 1 | 2; // 0001 | 0010 = 0011 이 되고 int값으로 3이 됨. - 값비교, 논리 (3 == 3);