동기/비동기

 

동기 : 요청하고 나서 응답이 올 때까지 더는 코드를 진행하지 못하고 기다렸다가 응답을 받으면 다음 코드 실행

 

비동기 : 응답을 받지 않았어도 대기하지 않고 다음 코드 진행, 데이터베이스에서 데이터를 가져오는 작업은 동기로 실행하면 앱이 매무 느려질 수 있어 이런 작업은 비동기로 처리를 한다.

 

Future

 

Future : future 클래스는 미래라는 단어의 의미대로 미래에 받아올 값을 뜻한다.

 

void addNumbers(int a, int b) {
  print('${a} + ${b} 계산 시작!!');

  // Future : 미래값을 표현하는 Future클래스
  //3초후에 동작
  Future.delayed(Duration(seconds: 3), () {
    print('${a} + ${b} = ${a + b}');
  });
  print('${a} + ${b} 코드 실행 끝');
  
}

void main(){
  addNumbers(1,1);
}

 

 

async / await

 

async / await : 비동기 처리로 사용하는 방법으로 코드가 작성된 순서대로 실행가능

 

Future<void> addNumbers(int a, int b) async {
  print('$a + $b 계산시작!!');

  await Future.delayed(Duration(seconds: 3), (){
    print('$a + $b = ${a + b}');
  });
  print('$a + $b 계산종료!!');

}

void main(){
  addNumbers(1, 2);
  // 대기 시간에 다음 코드를실행
  addNumbers(1, 4);
}

 

 

 

Stream

 

Future는 반환값을 딱 한번 받아내는 비동기 프로그래밍에서 사용하지만 지속적으로 반환 받을 때는 Stream을 사용.

스트림을 사용하려면 플러터에서 기본으로 제공하는 dart:async 패키지를 불러와야 한다.

 

import 'dart:async';

void main(){

  final controller = StreamController();
  // 하나의 stream에는 하나의 listen만가능
  // final stream = controller.stream;
  
  // listen을 여러개 주고 싶은 경우
  final stream = controller.stream.asBroadcastStream();
  final streamListener1 = stream.listen((val){
    print('listen1');
    print(val);
  });
  final streamListener2 = stream.listen((val){
    print('listen2');
    print(val);
  });

  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
  controller.sink.add(4);

}

'Mobile > Dart' 카테고리의 다른 글

(Dart)객체지향 프로그래밍  (1) 2024.02.13
(Dart) Dart 기본 문법  (0) 2024.02.13
크로스 플랫폼/네이티브 앱  (0) 2024.02.13

class

 

객체지향 프로그래밍의 기본은 클래스로부터 시작한다. 클래스를 정의하는  예제 코드를 살펴보면서 분석하자

 

 

class Idol{
  final String name;
  final int membersCount;
  //Idol(String name) : this.name = name; 속성 설정을 이렇게도 가능
 // Idol(this.name);
 //  생성자 : 클래스의 인스턴스를 생성하는 메서드.
  Idol(String name, int membersCount)
    :this.name = name,
     this.membersCount = membersCount;
  // 네임드 생성자
  Idol.fromMap(Map<String, dynamic> map)
    :this.name = map['name'],
     this.membersCount = map['membersCount'];
     
     
  //클래스에 종속되는 함수를 지정할 수 있고, 메서드라 부른다.
  //this : 클래스에 종속되어 있는 값을 지칭할 때 사용
  void sayName(){
    print('저는 ${this.name} 입니다. 맴버의 수는 ${this.membersCount} 명입니다.');
  }
}

 

 

 

Optional parameter (positional, named)

포지셔널 파라미터 : 스퀘어 브라켓 [] 으로 감싸져 있는 파라미터를 포지셔널 파라미터라고한다.

                                          말 그대로 position(위치)가 중요한 파라미터라고 이해하면 기억하기 쉽다. 

 

void add(int a, int b, [int? c = 9]){
  print('$a, $b, $c');
}
void main(){
  add(1,2,3); // 1,2,3
  add(1,2,5); //1,2,5
  add(1,2); // 1,2,9
}

 

 

 

네임드 파라미터 : 컬리브라켓 {} 으로 감싸져 있다, 컬리 브라켓 안에 있는 파라미터의 순서는 상관이 없다. 

 

 

void add(int a, int b, {int? c, int? d}){
  print('$a, $b, $c $d');
}
void main(){
  add(1,2, c: 10, d: 50); //1,2,10,50
  add(1,2, d: 100, c: 70); //1,2,70,100
}

 

 

 

private, getter,setter

 

private : 다른 언어와달리 다트 언어에서는 같은 파일에서만 접근이 가능

getter/setter : 말 그대로 값을 가져올 때 사용되고 값을 지정할 때 사용

class Idol{
  // _ : private 설정
  String _name = '블핑';

  //  getter/setter
  String get name{
    return this._name;
  }
  set name(String name){
    this._name = name;
  }
}


void main(){
  Idol idol = Idol();
  idol.name = '트와이스';
  print(idol.name);
}

 

 

 

상속, 인터페이스

 

상속 : 어떤 클래스의 기능을 다른 클래스가 사용할 수 있게 하는 기법

인터페이스 : 상속은 공유되는 기능을 이어받는 개념이지만 인터페이스는 공통으로 필요한 기능을 정의하는 역할

 

 

//mixin : 특정 클래스에 원하는 기능들만 골라 넣는 기능
mixin IdolSingMixin on Idol{
  void sing(){
    print('${this.name}이 노래를 부른다.');
  }
}
class Idol{
  final String name;
  final int membersCount;
  Idol(this.name, this.membersCount);

  void sayName(){
    print('저는 ${this.name} 입니다.');
  }
  void sayMembersCount(){
    print('${this.name}의 멤버는 수는 ${this.membersCount}명입니다.');
  }
}
// 상속은 extends 키워드로 한다, mixin을 적용시 with를 사용
class BoyGroup extends Idol with IdolSingMixin{
//부모 클래스에 기본 생성자가 있으면 자식 클래스에서 생성자를 실행해줘야 한다.
  BoyGroup(
      String name,
      int membersCount,
      ) : super(name, membersCount);
  void sayMale(){
    print('보이 그룹');
  }
}
class GirlGruop extends Idol{
  GirlGruop(super.name, super.membersCount);
  void sayName(){
    print('여자 아이돌 : ${this.name}입니다.');
  }
}
//인터페이스 설정시 반드시 모든 기능을 설정을 해줘야한다.
class Others implements Idol{
  final String name;
  final int membersCount;
  Others(this.name, this.membersCount);
  void sayName(){
    print('저는 아무그룹 ${this.name} 입니다.');
  }
  void sayMembersCount(){
    print('멤버수는 : ${this.membersCount}');
  }
}

void main(){
  BoyGroup bts = BoyGroup('bts', 7);
  bts.sayName();
  bts.sayMembersCount();
  bts.sayMale();
  bts.sing();
  GirlGruop girl = GirlGruop('트와이스', 8);
  girl.sayName();
  print(girl..name);
  girl.sayMembersCount();
  Others others = Others('소시', 9);
  others.sayName();
  others.sayMembersCount();


}

 

 

 

제네릭

 

제네릭 : 클래스나 함수의 정의를 선언할 때가 아니라 인스턴스화하거나 실행할 때 설정한다, 특정 변수의 타입을 하나의 타입으로 제한하고 싶지 않을 때 자주 사용한다.

 

class Cache<T>{
  final T data;
   Cache({
    required this.data,
});
}

class Counter{
  static int cnt = 1;
  Counter(){
    cnt++;
  }
}
void main(){
  final cache = Cache<List<int>>(
    data: [1,2,3],
  );
  print(cache.data.reduce((first, item) => first + item));

  Counter c = Counter();
  Counter c2 = Counter();
  Counter c3 = Counter();
  print(Counter.cnt);
}

'Mobile > Dart' 카테고리의 다른 글

(Dart) 동기/비동기  (0) 2024.02.13
(Dart) Dart 기본 문법  (0) 2024.02.13
크로스 플랫폼/네이티브 앱  (0) 2024.02.13

dynamic, final, const

 

dynamic : 변수의 타입이 고정되지 않아서 다른 타입의 값을 저장 가능하다.

 

void main(){
	dynamic name = 'hello'; //문자형
    name = 1; //정수형
}

 

 

final, const는 기본적으로 변수의 값을 처음 선언 후 변경할 수 없다.

둘의 차이는 final은 런타임 상수, const는 빌드 타임 상수이다.

 

void main(){
    final DateTime finalNow = DateTime.now()
    // DateTime.now()함수는 함수가 실행되는 즉 런타임을 할때 값을 알 수가 있다.
    const DateTime constNow = DateTime.now()
    // const로 지정한 변수는 빌드 타임에 값을 알 수 있어야 한다. 에러 발생
}

 

 

 

컬랙션

 

컬랙션은 여러 값을 하나의 변수에 저장할 수 있는 타입.

 

  • List : 여러 값을 순서대로 저장
  • Map : 특정 키값을 기반으로 빠르게 값을 검색
  • Set : 중복된 데이터를 제거
  • where : List에 있는 값들을 순서대로 순회하면서 특정 조건에 맞는 값만 필터링
  • reduce : List에 있는 값들을 순회하면서  값을 쌓아간다.
  • fold : 기본적인 동작은 reduce와 같고, 어떠한 타입도 사용이 가능하다.

 

 

//List, where
List<String> arr = ['giwon', 'gitwo', 'githree'];
final iterable = arr.where((item) => item =='giwon' || item == 'gitwo');
print(iterable);
print(iterable.toList());

 

//reduce, fold
final reduceArr = arr.reduce((first, item) =>
    first + ' , ' + item
);
print(reduceArr);
final foldArr = arr.fold<int>(0, (first, item) =>
    first + item.length
);
print(foldArr);

 

 

//Map
Map<String, String> dictionary = {
'Hello' : 'world',
'Hyun' : 'giwon',
'school' : 'study'
};

print(dictionary['Hello']);
print(dictionary['Hyun']);
print('key :  ${dictionary.keys}');
print('valyes : ${dictionary.values}');
print('list : ${dictionary.keys.toList()}');

 

//Set
Set<int> setArr = {1,2,3,4,1};
print(setArr);
print(setArr.contains(1));
print(setArr.contains(5));
print(setArr.toList());

List<int> setArr2 = [1,2,1];
print(Set.from(setArr2));

 

 

null

 

// ? : null로 초기화
//  ??= : 기존값이 null일 경우만 다음 값 저장
double? number1;
double? number2 = 2;
double? number3 = 5;
number3 ??= null;
number3 ??= 6;
number3 ??= null;
print('${number1} ${number2} ${number3}'); // null, 2.0, 5.0

'Mobile > Dart' 카테고리의 다른 글

(Dart) 동기/비동기  (0) 2024.02.13
(Dart)객체지향 프로그래밍  (1) 2024.02.13
크로스 플랫폼/네이티브 앱  (0) 2024.02.13

크로스 플랫폼

 

여러 플랫폼(iOS,  Android, 웹)에서 동일한 소스코드를 사용하여 앱을 개발하는 방법.

대표적으로 React Native, Flutter등이 있다.

 

 

1.Flutter

 

네이티브 앱과 유사한 성능을 제공하기 위해 기계어와 친숙한 Dart라는 언어를 채택해서 사용한다. 잘 사용되지 않는 언어이기 때문에 익숙해지는데 시간은 필요하지만, 고성능을 내기에 최적화된 언어를 사용한다. 

 

Hot Reload 기능을 통해 코드 수정 결과를 실시간으로 확인할 수 있으며 빠른 속도로 개발하는데 큰 도움을 줄 수 있다. Flutter를 이용해서 개발된 서비스 앱은 알리바바, 텐센트, eBay, Google Pay, Google Classroom, BMW 등이 있다.

 

2. React Native

React Native는 웹 개발에 필수적인 Javascript 언어로 개발한다. Flutter에 비해 친숙한 언어를 사용하여 개발하기에 많은 개발자들이 React Native를 사용한다.

 

많은 개발자들이 사용하기에 커뮤니티가 활성화되었으며 이로 인해 풍부한 라이브러리가 제공한다. 앱을 만드는데 필요한 기능을 직접 구현하지 않고 다른 개발자가 개발해 둔 라이브러리를 이용해서 구현한다면 매우 빠른 속도로 개발 가능하다. 

 

React Native를 이용해서 개발된 서비스 앱은 페이스북, 인스타그램, 테슬라, 우버이츠, 디스코드, 토스, 카카오페이, 숨고, 미소 등이 있다.

 

 

네이티브 앱

 

 

 

대표적인 스마트폰 플랫폼인 Android의 Kotlin, iOS의 Swift는 플랫폼 내에서 사용가능한 앱을 만들기 위한 도구를 제공하는 방법

 

1. Kotlin

Kotlin은 정적 입력 방식의 최신 프로그래밍 언어로 전문 Android 개발자의 60% 이상이 사용하고 있으며 생산성, 개발자 만족도 및 코드 안전성을 높이는 데 도움이 된다.

 

최신 언어 기능으로 아이디어를 구현하는 데 집중하고 상용구 코드 작성은 줄일 수 있다. 가독성이 높기에 코드를 보고 빠르게 이해하기 좋으며 전체 코드의 양이 줄어들어 개발의 효율을 높이는데 유리하다.

 

2.Swift

Swift는 모든 iOS 플랫폼에서 사용할 수 있는 강력하고 직관적인 프로그래밍 언어이다. 간결하면서도 표현력이 풍부한 구문과 현대적인 기능으로 사용하기가 간편하다. Swift는 코드가 안전하면서 빠르게 실행되는 소프트웨어를 제작할 수 있다.

 

 

 

 

 

 

'Mobile > Dart' 카테고리의 다른 글

(Dart) 동기/비동기  (0) 2024.02.13
(Dart)객체지향 프로그래밍  (1) 2024.02.13
(Dart) Dart 기본 문법  (0) 2024.02.13

+ Recent posts