티스토리 뷰

Dart & Flutter

Dart 공부 정리 20200201

낭초비 2020. 2. 1. 05:00
반응형

오늘 공부는 Dart.dev의 Functions(링크) 부터 시작.

Dart 2.7 이하의 기초 지식과 문법에 대한 내용이다. 

 

   Functions

  • function도 오브젝트이며 type을 가짐
  • 변수에 할당되거나 다른 함수의 인자(parameter)로 전달 가능 
  • function의 type을 명시하는것을 추천하나, 하지 않더라도 동작은 함 
  • function이 1개의 표현식(expression)만 가지고 있을 경우, arrow syntax( => )를 이용가능. 단, function에 포함된 것이 1개의 expression(statement면 안됨)이어야하며, 그 expression은 => 와 ; 사이에 표기되야함. 만약 expression이 아니라 if statement일 경우 conditional expression을 이용할 수 있긴함  
  • function은 2종류의 인자 타입이 있음. 필수(requried) 인자와 선택(optional) 인자로 나뉘며, 필수인자를 먼저 입력하고 그뒤로 선택 인자를 입력함. optional parameters can be named or positional   
  • 어떤 API들은 사용되는 파라미터가 필수적임에도 불구하고 오직 named 파라미터만 사용하는 것도 있음

Optional parameters

optional paramter는 named이거나 positional 형태일 수 있으나, 동시에 둘 다가 될 수는 없다. 

 

Named paramters

함수 호출시, 전달하는 인자를 paramName: value 이름으로 명시하고 그에 해당하는 인자값(value)을 입력하여 전달 하는 방법. 

named parameter는 optional parameter이기 때문에 어떤 파라미터를 필수 파라미터로 표시하기 위해서는 @required 라고 표기해줘야 함. 그리고 @required 를 사용하려면 meta package를 import해야함. (package: meta/meta.dart)

 

Positinal parameters

함수의 파라미터를 [ ] 를 이용하여 묶어주면 optional parameter로 간주함

 

Default parameter values

함수를 정의할 때  = 를 이용하여 기본 인자값을 설정할 수 있음. default values는 complie-time constants 임. default value가 없을 경우, null 로 입력된다. 

 

Main function

모든 앱은 최상위에 main( ) 함수가 있어야함. 이 함수가 앱을 실행하기 위한 진입 포인트가 되기 때문. main함수는 리턴형이 void이며 매개변수로 optional List<String> 파라미터를 가진다. 

 

Functions as first-class objects

다른함수에게 파라미터로 함수를 전달할 수 있음

변수에 함수를 할당할 수 있음

 

Anonymous functions (익명 함수)

anonymous function, lambda, closure과 같은 이름이 없는 함수도 생성 가능.

익명함수가 1개의 statement만 포함할 경우, 익명함수 대신에 arrow notation을 이용하여 더 간단하게 만들 수 있음 

 

Lexical scope

변수를 사용할 수 있는 영역(변수의 유효범위)은 정적으로 정해지며, 이는 간단하게 말해 코드의 레이아웃에 따른다.  

변수의 유효범위는 중괄호를 따라서 내부로 확장된다. 

 

Lexical closures

closure는 function object이며, 할당된 function object의 lexical scope안의 변수(이 변수는 현재의 scope 밖에서 상용된 것일지라도)에 접근할 수 있다. 

 

Returen values

모든 함수는 리턴 값이 있다. 함수에 명시된 리턴값이 없을 경우, return null; 가 함수에 임의적으로 추가된다. 

 

 

   Operators

  • 서로 다른형의 오브젝트를 연산자를 이용해서 연산할 때, 연산 결과는 왼쪽 피연산자의 형(object)을 따름
  • 연산자의 우선 순위는 스펙을 참고하면 명확하게 확인 가능

산술 연산자 (Arithmetic operators)

+, -, -expr, *, /, ~/, % 가 있음

 

Equality and relational operators

==, !=, >, <, >=, <= 가 있음

 

Type test operators

as : 특정 타입을 오브젝트에게 적용할 때 사용. 일반적으로 is를 이용한 type test를 대신해 짧게 만들때 사용. 

is : 해당 오브젝트가 특정 타입일 경우 True

is! : 해당 오브젝트가 특정 타입일 경우 False

 

Assignment operators

주로 =을 이용하여 값을 할당하며, 할당하려는 변수가 null일 경우에만 할당할 때에는 ??= 사용

 

Logical operators

!expr, ||, && 

 

bitwise and shift opwerator

|, &, ^, ~expr, <<, >>

 

Conditional expressions

간단한 if-else 문의 경우 쉽게 표현할 수 있는 방법. 

condition ? expr1 : expr2

condition이 참이면 expr1을 return하고, 반대의 경우 expr2를 return. 

expr1 ?? expr2

expr1이 null이 아니면 expr1의 value를 return하고, 그외에는 expr2의 값을 return. 

 

Cascade notation ( .. )

cascade 는 어떤 object에 대해서 순차적으로 operation을 진행하고자 할 때 사용

엄밀히 말하면 cascade에 사용하는 "double dot" 은 연산자가 아니다. Dart syntax의 한 부분일 뿐. 

 

Other operators

( ) 는 functoin application이며, function call을 의미

[ ] 는 list access로 list의 특정 index의 값을 나타낼때 사용

.(dot) 는 member access

?. 는 conditional member access로 왼쪽 피연산자가 null; 가 될 수도 있음

 

 

   Control flow statements

Switch and case

dart 에서는 case문이 끝나면 break; 를 입력하지 않으면 error를 발생. 대신 다음 case문으로 넘어가길 원한다면 continue 문과 label을 이용하면 됨. 그리고 dart는 empty case 절을 허용. 

 

Assert

개발할때 assert 문을 사용하면 좋음. boolean 조건이 거짓일때 실행을 중단(exception 발생)하기 위해서.

assert(condidtion, optionalMessages);

flutter framework에서는 debug mode에서 assertion이 허용됨. 

 

 

   Exceptions

  • Exception은 뭔가 예상하지 않았던 일이 발생했을때 알리는 에러(error)
  • Exception이 catch 되지 않는다면, exception을 발생한 isolate는 중지되고, 해당 isolate와 프로그램은 종료됨
  • 자바와 다르게 다트의 모든 exception은 unchecked exception이며, 메소드(method)는 어떤 exception을 throw할지 선언하지 않음. 또한 어떤 exception이라도 catch 하도록 요구되지 않음
  • 다트는 Exception과 Error 타입을 제공하며, 뿐만아니라 다양한 subtype도 있음, 그리고 자신만의 exception을 정의가능 
  • 다트는 Exception과 error object 뿐만아니라 어떠한 non-null object라도 exception으로 throw 가능

다트는 싱글 스레드이다. 여러 스레드를 만들 수 없다. 다트에선 Isolate를 만들어 병렬 처리를 한다. 스레드 안에 Isolate가 여럿 있는 걸 상상하면 된다. Isolate는 분리된 작업 단위이다. Isolate는 각각의 메모리 힙(Each isolate has its own memory heap)가 있다. 락(lock)을 걸 수 없기에 경쟁 상태(race condition)나 데드락이 발생하지 않는다. 가장 기본이 되는 isolate는 main isolate이며, 다트 런타임에 의해 만들어진다. main isolate는 필요에 따라서 isolate를 해서 사용하게 되는데, isolate를 만드는 것을 스폰(spawn)이라 한다. (참고 자료: https://software-creator.tistory.com/?page=23 )

Throw

exception 을 throw하는 것은 하나의 expression이기때문에  => 문에서도 사용할 수 있음

(ex. void distanceTo(Point other) => throw UnimplementedError( );

 

Catch 

catch는 exception의 전파를 멈추게 함. 그리고 exception을 catching하게 되면 그것을 handling 할 수 있음 

catch와  on을 사용할 수 있는데, on은 exception type을 명확히 할때 사용하고,  exception handler가 exception object를 필요로 할때 catch를 사용

catch에서는 1개 또는 2개의 파라미터를 명시할 수 있음. 첫번째는 exception object이고, 두번째 파라미터는 stack trace  object 임

exception에 대하여 부분적으로 처리를 하고, 계속 전파 되도록 하려면 rethrow를 사용하면됨 

 

Finally

try문을 실행한 뒤, exception이 발생하든 안하든 finally 절은 실행

catch 절의 조건과 매치되는 않는 exception이라도 finally의 절은 실행하고 전파를 진행하게 됨.  

 

 

   Classes

 

  • 다트는 Object-oriented langage (OOL)
  • mixin-based inheritance. 즉, 모든 클래스(Object는 제외)에는 하나의 수퍼 클래스가 있지만, 클래스의 body는 multiple class hierarchies로 사용될 수 있음  (참고)
  • 모든 object는 class의 instance 이며, 모든 class는 object의 자손
  • extension method는 클래스를 수정하거나 하위 클래스를 생성하지 않으면서 클래스에 새 기능을 추가하는 방법

Using class members

. 는 instance variable 이나 method 에 접근할 때 사용

?. 는 왼쪽의 피연산자가 null일 경우 발생는 exception을 피할 때 사용

 

Using constructors

constructor를 이용하여 object를 생성할수 있음

constructor의 이름은 ClassName 또는 ClassName.identifier 

new 키워드를 사용하는 것은 option임

어떤 class들은 compile-time constant를 생성하기 위해 constanct construct를 제공함. 

constant 환경 내에 있는 constructor들은 일일이 const를 입력해 주지 않고 생략 가능. 하지만 constant 환경 외부에서 const없이 불러올 경우 non-constant object 가 됨 

 

Getting an object's type

실행 중에 oject의 type을 얻고 싶다면 runtimeType property를 사용하면됨

 

Instance variables

클래스 안에서 선언된 변수는 초기값을 설정하지 않을 경우, 그 값은 null

모든 instance varialbe은 implicit getter method를 생성하고, final이 아닌 instance variable은 implicit setter method도 생성

instance varible이 선언된 곳에서 초기값이 설정된다면(constructor나 method에 의해서가 아니라), 그 값은 instance가 생성될때 설정되며, 이것은 constructor나 initializer list 가 실행되기 전임

 

Constructors

class이름과 같은 이름으로 선언된 function

 

Default constructors - 다로 constructor를 선언하지 않을 경우 default constructor가 제공됨. no argument. 

 

Constructors are not inherited - 하위 클래스는 상위 클래스의 constructor를 상속받지 않음

 

Named constructor - 여러개의 constructor를 구현할 경우 사용. 

 

Invoking a non-default superclass constructor - 기본적으로 하위 클래스의 constructor는 상위 클래스의 unnamed, no-argument constructor를 호출함.  superclass의 constructor는 constructor body의 시작 부분에서 호출됨. 만약 initializer list를 사용하고 있다면, 이것은 superclass의 호출 전에 실행됨. 

 

supercalss에 unnamed, no-argument constructor가 없을 경우, 직접 superclass의 어떤 생성자를 호출할지 하위 클래스의 생성자 body를 입력하기 전에 :를 이용하여 지정해야함. 

 

initializer list - superclass constructor를 부르는 것과 별개로, constructor body를 수행하기 전에 instance variable을 초키화 할수 있음. :를 이용해서 initializer를 구분. initializer list에 assert를 이용해서 입력 값을 확인 할수 있음 

 

Redirecting constructors - 어떤 constructor는 같은 class의 다른 constructor로 redirect 하는 목적으로 사용됨. 

 

Constant constructors - 변하지 않는 object를 생성하는 class의 경우, const constrructor를 이용해서 이 object를 compile-time constants로 만들 수 있음. 그리고 이 class 안의 모든 instance variables들은 final이어야함

 

Factory constructors - 해당 클래스가 언제나 새 instance를 생성하지 않을 경우 factory 키워드를 이용해서 구현. factory constructor는 cache로 부터 instance를 리턴하거나 subtype의 instance를 리턴함 

 

Methods

object의 동작(행동?)을 제공하는 함수 

 

Instance methods - instance variable과 this에 접근할 수 있음

 

Getters and setters - object의 property에 접근해서 read, write하는 기능을 제공하는 특수한 method . get 과 set 키워드를 이용하여 사용자가 추가적인 property를 생성할 수 있음  

 

Abstract methods

instance, getter, setter 메소드들은 interface를 정의함으로써 추성화 될 수 있음, 그리고 그 세부 구현은 다른 클래스에서 해야됨. abstract class 안에서만 존재 가능. 

 

Abstract classes

abstact class는 인스턴스화 할 수 없음. interface를 정의하는데 유용함. 인스턴스화 가능하게 하려면 factory constructor를 정의해야 함 

 

Implicit interfaces

모든 클래스는 암시적으로 그 클래스와 구현한 인터페이스의 인스턴스 멤버를 포함하는 interface를 정의  

클래스는 implements 절을 이용하여 구현할 interface를 선언하고, interface에서 요구되는 API를 제공함으로써 구현할 수 있음

 

Extending a class

extends 키워드를 이용해서 subclass를 생성

super class를 참조하기 위해서는 super 키워드를 사용

 

Overriding members - 하위 클래스는 instance method, getter, setter들을 override할 수 있음. @override 주석을 표기하여 overriding할 멤버를 의도적으로 가르킬수 있음. @override를 붙여서 "이 메소드는 부모 메소드의 정의를 덮어서 새로 구현했다"라고 명시적으로 표현하는 것 

 

Overridable operators - 연산자 중에서 override 할 수 있는 것들이 있음.  

 

Extension methods

기존의 라이브러리에 기능을 추가하는 방법. 자세한 내용은 링크 참고. (링크)

 

Enumerated types

enumerated type은 고정된 수의 constant value를 나태는데 사용되는 class의 특별한 종류임. enum 키워드를 이용해서 선언. enumerated type은 하위 클래스, implement, min in을 할 수 없음. 명확하게 인스턴스화 할 수 없음

 

Adding features to a class: mixins

클래스의 코드를 다양한 클래스 계층에 재사용하는 방법. 1개 또는 그이상의 mixin name의 뒤에 with 키워드를 이용해야 함 

mixin을 구현하려면 object를 상속한 클래스를 생성하고 constructor를 선언하지 않음. 일반적인 class로 사용되길 원하지 않는다면 class 키워드 대신에 mixin 키워드를 사용해야함

 

Class variables and methods

클래스 전체에서 사용할 수 있는 variable과 method를 구현하기 위해서는 static 키워드를 사용함

static variable - class-wide 상태와 상수에 유용

static method - 인스턴스에서는 동작하지 않고 따라서 this에 접근할 수 없음. 인스턴스가 아니라 직접 클래스에 접근해서 호출해야함.

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함