Programming-[CrossPlatform]/Flutter

[책]Flutter in Action - 1. 다트(DART) 기본 문법

컴퓨터 탐험가 찰리 2023. 1. 5. 21:32
728x90
반응형

책 정보: Flutter in Action / 에릭 윈드밀 지음, 우정은 옮김 / 한빛미디어

 


 

플러터는 구글에서 개발, 다트(DART)라는 자바와 비슷한 OOP이자 강타입인 언어를 기반으로 한다. 이번 글에서는 자바와 다른 특징적인 문법들만 기록해보았다.

 

 

1. 변수

동적 형식 지정자: dynamic, var

String, int와 같이 직접 타입을 지정하지 않아도 되도록 해준다. 동적 형식 지정자가 필요한 경우는 JSON처럼 Map 타입을 사용할 때이다. JSON은 key값은 String이지만 value는 다른 형식이 될 수 있기 때문이다. 그러나 꼭 필요한 경우가 아니라면 형식을 제한하는 것이 기본이다. 

 

Map<String, dynamic> json;

 

var와 dynamic의 다른점은 var는 변수의 형식을 제한할 때만 사용할 수 있다는 것이다. 

Map<String, var> json;  //사용 불가한 문법

 

또한 var는 한 번 어떤 타입으로 추론되고나면 다른 형식의 데이터를 재할당할 수 없으나, dynamic은 재할당이 가능하다.

 

 

null 인지(null aware) 연산자

if문으로 nullable check을 하는게 아니라 특수한 operator를 사용한다.

 

?. 연산자

if(user != null) {
	this.userAge = user.age;
}

//null operator 적용
this.userAge = user?.age;

 

?? 연산자

coalesce문법에서 값이 존재하지 않는 경우 지정할 값을 작성해주는 것처럼, ?? 연산자 뒤에 해당 값이 null 일때 대체할 값을 지정할 수 있다.

this.userAge = user.age ?? 17

 

 

2. 함수

이름 지정 파라미터(Named parameters)

함수를 호출할 때 들어가는 인자값을 이름을 지정하여 작성할 지를 설정해준다.

void debugger({String message, int errorCode}) {
    //이런 식으로 중괄호를 넣어서 파라미터를 작성해주면
}

debugger(message: 'Hi!', errorCode: 0023) 
    //이렇게 함수의 인자값에 이름(message, errorCode)을 지정할 수 있다. 다만 이는 강제사항이 아니다.


void debugger({@required String message, ... }) {
    //@required를 사용하여 함수 호출 시 반드시 이름을 지정하도록 만들어 줄 수 있다.
}

@required 애너테이션을 추가하려면 다트의 meta 라이브러리를 추가해야한다.

 

 

선택형 파라미터(optional parameter)

Optional한 파라미터를 입력하거나, default 값을 줄 수 있다. 대괄호 []를 사용하면 된다.

int addNums(int x, int y, [int z]) {
	//대괄호 []를 이용하여 선택형 파라미터를 지정해줄 수 있다.
}

addSomeNums(5, 7) //가능
addSomeNums(5, 7, 1) //가능


int addNums(int x, int y, [int z = 1]) {
	// = 연산자로 기본값을 지정할 수 있다. 호출 시 인자값이 안들어왔을 때 해당 값으로 자동 지정된다.
}

 

 

 

3. 클래스

 

new 키워드

new 키워드를 사용하지 않는게 관례다!

Book harryPotter = Book();

 

생성자(Constructor)

 

argument 생략

축약적으로 사용할 수 있다. 다만 인자의 위치가 지정되기 때문에 클래스 생성 시 순서대로 입력해주어야 한다. Person("Tomas", 30, "male")

class Person {
  String name = 'John';
  int age;
  String sex;
  
//  Person(String name, int age, String sex) {
//      this.name = name;
//      this.age = age;
//      this.sex = sex;
//  }
  
  Person(this.name, this.age, this.sex);
}

 

이름지정 선택형 파라미터(named optional parameter)

 

중괄호 {}를 사용한다. 생성자를 불러올 때 이름을 지정하여 불러와야한다. 플러터에서 위젯 클래스(여기서는 WeatherScreen 클래스)를 불러올 때 각 인자값(key, weatherData)을 이름을 지정하여 줄 수 있도록 해준다.

 

//선언할 때
class WeatherScreen extends StatefulWidget {
  dynamic weatherData;

  WeatherScreen({Key? key, this.weatherData}) : super(key: key);
  
 }
 
 
 //불러올 때(생성할 때)
 WeatherScreen(
	 key: UniqueKey('ggg'), 
 	weatherData: dataFromJson
 )

Flutter에서는 Nullable named parameter를 통해 class의 instance를 만들고 그 파라미터들을 인자로 받는 형식으로 만들어놨다. 예를 들어 Scaffold 위젯(클래스)는 클래스 파일에 들어가보면 다음과 같이 많은 파라미터들을 named parameter로 정의해놓았다.

실제 사용자가 Scaffold 인스턴스를 호출할 때는 이 중 필요한 인자값들만 정의하여 사용한다.

 

 

named nullable parameter

중괄호 ({}, curly bracket)처리하여 named paramter로 생성자를 만들 수 있다. 이 때는 인스턴스 생성 시 파라미터명을 입력해주어야 한다. 그리고 NullSafety로 동작하는 경우 인자 앞에 required를 붙여줘야한다.

 

class Person{
	String name;
	int age;
    
    Person({required this.name, required this.age});
}

Person p1 = Person(name: "Tomas", age: 30);

만약 nullable하게 사용하고 싶다면 member 변수의 타입 뒤에 ?를 붙여주면 된다.

class Person {
    String? name;
    int? age;
    ...
}

 

 

 

named constructor

이름을 지정한 constructor를 만들 수 있다.

class Person{
	String name;
	int age;
    
    Person.basic(this.name, this.age);
}

Person p1 = Person.basic("Tomas", 30);

 

 

 

추가 정보

Dartpad에 들어가서 웹 상에서 코딩을 하고 문법을 점검해볼 수 있다.

https://dartpad.dev/? 

 

DartPad

 

dartpad.dev

 

728x90
반응형