플러터 공부하기 - DART

mason.98·2022년 12월 26일
0

Flutter

목록 보기
1/8

DART는?

  • 모든 플랫폼에서 빠른 앱을 위한 클라이언트 최적화 언어
  • 유저인터페이스(UI)를 만드는데 최적화되어있다.
  • 개발자경험이 좋다.

DART가 특별한 이유

1) 2개의 컴파일러를 갖고 있다.

1. dart-web
dart로 쓴 코드를 JS로 변환해주는 컴파일러
2. dart-native
dart로 쓴 코드를 다양한 운영체제에 맞게 변환해주는 컴파일러


2) JIT(Just-In-Time), AOT(Ahead-Of-Time)

1. JIT 컴파일러
개발중에는 dartVM을 이용하여 내가 쓴 코드의 결과를 바로 보여준다.
2. AOT 컴파일러
배포할때는 내가 쓴 코드를 기계어로 변환하여 앱을 빠르게 만들어준다.


3) NULL safety

프로그램을 더욱 안전하게 만들어준다.


HelloWorld!

// 명령어: dart run main.dart
void main(){
	print('Hello World!');
}

🔑 키워드

- var

var name = 'ho998';
  • 함수나 메소드 내부에 지역변수를 선언할 때 사용
  • 데이터타입을 유지하면 값을 업데이트 할 수 있음

- dynamic

dynamic whatever;
whatever = 123;
whatever = 'string';
whatever = true;
  • 여러가지 타입을 가질 수 있는 변수에 쓰는 키워드이다.
  • 해당변수의 타입을 알 수 없을 때 유용하게 사용할 수 있다.

- null safety

String? name = 'name'; // String or Null 이다.
name?.length; // name이 null이 아닐 경우에 length 구하기

개발자가 null값을 참조할 수 없도록 한다.

- final

final name = 'test';
final isWork = true;

한번 선언한 변수의 값을 수정할 수 없다.
const와 비슷하다.

- late

late final APIdata;

// do something ... 
APIdata = 'apidata';

초기 데이터없이 변수선언이 가능하다.
추후에 데이터를 넣는 방식으로 사용된다. (API 통신에서 많이 쓰임)

- const

const max_allowed_price = 15000;
const API_KEY = '...';
  • compile-time constant라고 한다.
  • 컴파일할 때 변수의 값을 알고 있는다.
  • final과 같이 한번 선언한 변수의 값을 수정할 수 없다.

- static

// static 사용 X
class notStatic {
	int number = 10;
}
notStatic test = notStatic();
print(test.number); // 10

// static 사용 O
class Player {
	static int hp = 10;
    static const int mp = 20;
}
print(Player.hp); // 10
Player.hp++;
print(Player.hp); // 11
print(Player.mp); // 20

객체 선언없이 변수에 접근할 수 있게 도와준다.
값 변경을 하지 못하게 하기 위해서는 static const를 사용한다.


💿 데이터타입

String name = 'name';
bool isWork = false;
int age = 123;
double cm = 12.43;
num intOrDouble = 12;
num은 int,double의 부모 class격이다. 

- Lists

var numbers1 = [1,2,3,4,5]; // 정수형 리스트 1
List<int> numbers2 = [1,2,3,4,5] // 정수형 리스트 2
  • collection if (존재할 수도 있는 요소를 가지고 온다.)

  var isFive= true;
  var numbers = [
      1,
      2,
      3,
      4,
      if(isFive) 5,
      ]; // isFive가 true면 리스트에 5를 추가
  • string interpolation (텍스트에 변수를 추가한다.)

  var velog = 'velog';
  var text = '이건 $velog 블로그 입니다.'; // 이건 velog 블로그 입니다.

  var age = 10;
  var text = '${age + 2}는 몇으로 나올까'; // 12는 몇으로 나올까
  • collection for (리스트 안에서 for문 돌리기)

  var oldYears = ['2020', '2021', '2022'];
  var years = [
    for (var oldYear in oldYears) oldYear,
    '2023',
    '2024',
    '2025',
  ];
  print(years); // [2020, 2021, 2022, 2023, 2024, 2025]

- Maps (key : value)

// Map<String, Object>의 타입을 갖고있는 monster 변수
var monster = {
    'name': 'lizard',
    'type': 'fire',
    'hp': 20.25,
    'mp': 19.10,
  	};
// Map<String, Object>의 타입을 갖고있는 player 변수
Map<String, Object> player = {
	'name': 'jack',
    'job': 'knight',
    'hp': 10.15,
    'mp': 5,
	};

Object는 Typescript에 any와 같다.

- Sets

var numbers = {1,2,3,4,5};
Set<String> names = {'jack','hanna','tom'};

[ Set과 List의 차이 ]

Set의 값은 유니크하다 = 중복값이 없다.


🚀 함수

void returnVoid(String name){
	print('hello $name !!!');
}
String returnString(String name){
	return 'hello $name @@@';
}

- Named Parameters

  • 기존 함수의 문제점 (Positional Parameters)

void sayHello(String name, String country, int age){
      print('이름은 $name이고, 나라는 $country이며, 나이는 $age 입니다.');
}
sayHello('choi','korea',22); // argument의 위치를 외워야 한다.
  • 해결책: Named Parameters 적용

void sayHello({
	required String name, 
    required String country, 
    required int age}) { 
    print('이름은 $name이고, 나라는 $country이며, 나이는 $age 입니다.');
}
  
sayHello({
	name: 'choi',
    country: 'korea',
    age: 22,
}); // argument가 무엇인지 정확히 파악된다.
  • Optional Positional Parameters

  void sayHello(
      String name, 
      int age,
      [String? country = 'korea']){
      print('이름은 $name이고, 나라는 $country이며, 나이는 $age 입니다.');
  }
  sayHello('choi', 22); // choi, 22, (korea)
  country 변수의 default값은 'korea'이고, 선택적으로 입력 가능하다.

- QQ Operator (??, ??=)

String getUpper(String? text){
	return text?.toUpperCase() ?? "TEXT IS NULL";
}
getUpper("choi"); // "CHOI"
getUpper(); // "TEXT IS NULL"
✅ [left ?? right]: left가 NULL이면, right를 반환한다.
String? name;
name ??= 'choi'; // name이 NULL이면 choi를 할당
name ??= 'zzz'; // name에 'choi'라는 값이 있으므로 실행되지 않음
✅ [left ??= right]: left가 NULL이면, left에 right를 할당한다.

- Typedef (자료형에 별명 붙이기)

typedef IntList = List<int>; // typedef

// typedef 적용
IntList reverseList(IntList list){
	var reversed = list.reversed();
    return reversed.toList();
}

🔥 Classes

class Player {
	String name = 'anony';
    int age = 50;
    
    void sayHello(){
    	print('my name is $name !!');
    }
}

void main(){
	var player = Player();
    player.sayHello(); // 'my name is anony !!'
}

- Constructors (생성자)

class Player {
	String name;
    int age;
    
    // ✅ 생성자 Constructor
    Player(this.name, this.age);
}

void main(){
	// ✅ 생성자 Constructor
	var player = Player('choi', 25); // name='choi', age=25 
}

- Named Constructor Parameters

class Player {
	String name;
    String job;
	int age;
    int key;
    
    // ✅ Named Constructor Parameters
    Player({
      required this.name, 
      required this.age, 
      required this.key, 
      required this.job,
    });
}

void main(){
	// ✅ Named Constructor Parameters
	var player = Player(
    	name : 'choi',
        age: 25,
        key: 199,
        job: 'dev',
    ); // name='choi', age=25, job='dev', key=199
    
}

- Named Constructor

class Player {
	String name, team;
	int age, points;

	// 🔵 Named Constructor (Named Parameter)
    Player.createBluePlayer({
    	required String name, required int age 
    }) : this.name = name,
      	 this.age = age,
      	 this.team = 'blue',
      	 this.points = 0;
	
    // 🔴 Named Constructor (Positional Parameter)
    Player.createRedPlayer(String name, int age) 
      : this.name = name,
        this.age = age,
        this.team = 'red',
        this.points = 0;

}

void main(){
	// 🔵 Named Constructor (Named Parameter)
	var bluePlayer = Player.createBluePlayer(
    	name: 'choi',
        age: 23,
    ); // name='choi', age=23, team='blue', points=0
    
    // 🔴 Named Constructor (Poisitional Parameter)
	var bluePlayer = Player.createBluePlayer('kim', 31);  // name='kim', age=31, team='red', points=0

}

- Cascade Operator

class Player {
	String name, team;
	int points;

	Player({
    	required this.name,
        required this.team,
        required this.points,
    });
}

void main(){
	// ✅ Cascade Operator
	var kim = Player(name: 'choi', team: 'blue', points: 0)
    ..name='kim' // kim.name = 'kim';
    ..team='red' // kim.team = 'red';
    ..points=1500; // kim.points = 1500;
}

> CascadeOperator(..)는 가장 앞에 있는 class(kim)를 가르킨다.

- Enums (오타 방지, 컬러에 자주 사용)

enum Team = {red, blue}

class Player {
	String name;
    int points;
    Team team; // ✅ enum Team
    
    Player({
    	required this.name,
        required this.team,
        required this.points,
    });
}

void main(){
	// ✅ enum Team -> team='blue'
	var kim = Player(name: 'kim', team: Team.blue, points: 0);
    
}

- Abstract Method/Class (청사진)

// ✅ 추상화 클래스
abstract class Human {
	void walk(); // 추상화 메소드
}

// ✅ Inheritance(상속) = extends Human
class Player extends Human {
	String name;
    int age;

	// ✅ 추상화 메소드 구현
    void walk(){
    	print('플레이어는 걷는다');
    }
}

// ✅ Inheritance(상속) = extends Human
class Coach extends Human {
	String name;
    int age;

	// ✅ 추상화 메소드 구현
    void walk(){
    	print('코치는 걷지 않는다.');
    }
}

- Inheritance (상속)

- Mixins

profile
wannabe---ing

0개의 댓글