Dart 기본문법

이영준·2023년 5월 10일
0

📌 Dart란?

  • 구글이 웹 프론트엔드 구현을 목적으로 개발한 언어로 2011년 공개
  • 모바일 앱, 웹 앱, 명령어 스크립트, 서버 프로그래밍도 개발 가능
  • 객체지향
  • 선택적 타입
  • 자바스크립트와 호환
  • Hot Reload 기능
  • AOT 컴파일러로 네이티브 코드를 생성하기 때문에 모든 플랫폼에서 빠른 속도 제공

🔑 특징

  • main 함수로 시작
  • 모든 변수가 객체임 (Object 클래스 상속)
  • 자료형이 엄격하며 여러 자료형 허용 위해 dynamic 타입 사용
  • public, protected 키워드 없고 _를 변수 앞에 붙여 private으로 사용
  • generic 타입을 이용하여 개발 가능

📌 변수

변수 typecasting / 형 변환

코틀린과 마찬가지로 형 변환이 엄격하다

  int num1 = 10;
  //double num2 = num1; //error

  //type casting 필요 --> 이건 오류 .!!!
  double num3 = num1 as double;

.toDouble로 해야 한다.

dynamic 타입을 사용해야만 변수 타입을 바꿀 수 있다.

  dynamic h2 = "2";
  print(h2);
  h2 = 22.0;

🔑 const vs final


둘 다 상수를 의미하지만 final은 runtime에 값이 결정되는 상수도 가능하나, const는 complie time에서 값이 지정되어야 하므로 오류가 난다.

🔑 타입 검사 is, is!

is(같은 타입이면 true)는 코틀린과 똑같지만
is의 반대는 is! 이다.

🔑 배열

  var model = ['TV', '냉장고','에어콘'];
  // !! java, kotlin은 set(index, object)로 삽입. 여긴 insert
  model.add("test");
  model.insert(0, "x");

배열에 값 변경할 때 set 대신 insert를 사용한다.

📌 조건문, 반복문

if, else, for, while 모두 기존 코틀린 코드와 별다른 차이 없다.

🔑 for

  for(int i=0;i<model.length;i++){
    print(model[i]);
  }
  // !! 탐색. for
  for(String j in model){
    print(j);
  }

  //foreach
  model.forEach((element) {print(element);});

📌 함수

익명함수를 만들고 인자를 넣어 변수에 할당 가능하다.

  var result= (num3){
    return num3 % 2 == 0;
  }(10);

  print(result);

🔑 람다함수 =>

람다함수 역시 -> 대신 fat arrow=>로 생성할 수 있다.

  // !! 변수에 함수 assign
  var test = (int i) {
    return i * i;
  };

  print(test(10));

  // !! 람다 함수. fat arrow
  var test2 = (int i) => i * i ;
  print(test2(20));

🔑 선택 매개변수 (default 인자)

매개변수를 넣지 않으면 default 값을 넣어주는 선택 매개변수를 쓸 수 있다.

void showInfo(String name, int age){
  print('name : ${name}, age : ${age}');
}


void showInfo1(String name, {int? age}){
  print('name : ${name}, age : ${age}');
}
void showInfo3({String name ='string', int? age}){
  print('name : ${name}, age : ${age}');
}

{}로 묶은 변수는 값을 주지 않으면 default 값, 혹은 nullable이면 null값이 들어가도록 할 수 있다. 선택 매개변수를 사용할 때는 age: 와 같이 사용할 매개변수의 이름과 함께 값을 할당한다.

showInfo('김길동', 28);
// showInfo(name: '김길동', age: 28);
showInfo1('나간다', age:10);
showInfo3(name :'ㅇㅇ', age : 10);
와 같이 호출한다.

showInfo1처럼 필수 매개변수와 선택 매개변수가 같이 있다면, 필수 매개변수가 무조건 앞에 와야 한다!

🔑 옵션 매개변수

[]로 감싸서, 역시 입력하지 않아도 되는 변수를 뜻하는데, 선택 매개변수와 함께 쓸 수 없다. 또한 사용할 경우 변수명을 함께 입력하지 않아도 된다.

// optional paramter.. 입력해도 되고, 하지 않으면 default가 된다.
// 값을 입력할때는 기존 방식과 같이, 변수 이름 없이 입력해야 한다.
// showInfo2('홍길동');
// showInfo2('홍길동', 25);
void showInfo2( String name, [int age = 20]){
  print('name : ${name}, age : ${age}');
}

🔑 일급 객체로서의 함수

함수를 값으로 취급 가능-> 변수에 함수 대입 가능

다른 함수의 인수로 함수를 전달하거나 반환받기도 가능

함수 변수 할당

void calc(int a, int b){
  print(a + b);
}

void main(){
  var fun = calc;
  fun(4,5);
}

인자로 함수 사용

void calc2(Function(int a) f){
  f(20);
}

void main(){
  calc2((a){
    print(a);
  });
}

📌 유용한 함수

🔑 toList 함수

list 타입을 깊은복사하여 새로운 컬렉션을 만들어줌

  var newList = data.toList();
  print(newList);

  data[0] = "algorithm";
  print(newList);

data의 값을 바꿔도 newList값에는 영향이 없음.

🔑 where 함수

where내의 return 값이 true인 것들만 반환한다. kotlin의 filter와 비슷한 개념

  var numList = [3, 4, 5, 6];
  // 결과 : 4, 6 출력됨
  numList.where((e) {
    print("..$e");
    return e % 2 == 0;
  }).forEach(print);

..3
..4
4
..5
..6
6

🔑 map 함수

들어오는 값들을 원하는 다른 형태로 변환한다.

  //map 사용 안한 코드
  var numList1 = [3, 4, 5, 6];
  // for (int i = 0; i < numList1.length; i++) {
  //   if (numList1[i] % 2 == 0) {
  //     print('결과 : ${numList1[i]}');
  //   }
  // }

  //map 사용 =============================
  numList1.where((e) => e % 2 == 0).map((e) => '결과 : $e').forEach((print));

결과 : 4
결과 : 6

🔑 any 함수

  var numList2 = [4, 5, 6, 8, 10];

  //3의 배수가 있는지 확인
  var result = numList2.any((e) => e % 3 == 0);
  print(result); //true 출력

값에 맞는 게 하나라도 있으면 true 반환

true

🔑 reduce 함수

반복요소를 줄여가며 결과를 만들 때 사용.
0,1 번 index부터 시작한다.
fold는 reduce와 달리 초기값을 주고 시작한다.

  //reduce 이용 코드
  var numList3 = [3, 1, 5, 2, 6, 4];
  var myMax1 = numList3.reduce((v, e) {
    print('v is $v e is $e');
    return max(v, e);
  });
  print(myMax1);

v is 3 e is 1
v is 3 e is 5
v is 5 e is 2
v is 5 e is 6
v is 6 e is 4
6

📌 클래스

new 키워드 생략 가능
자바, 코틀린과 마찬가지로 . 연산자를 사용하여 객체의 프로퍼티에 접근 가능하다.

class Teacher{
  String? name;
  String? _subject;

  String? get subject => _subject;
  set subject(sub) {
      this._subject = sub;
  }
}

void main(){
  var stu = Student();
  stu.id = '20200101';
  stu.name = '홍길동';
  stu.study("Android");

  var tea = Teacher();
  tea.name = '홍길동';
  tea._subject = '하이브리드';

  print(tea.subject);

}

_를 붙이면 private이라고 했는데, 자바와 조금 다르게 같은 파일 내에서는 _ 변수에 접근이 가능하다. 하지만 다른 파일에서는 접근이 불가하므로 위처럼 getter, setter을 만들어 사용한다.

🔑 생성자

선택매개변수, 옵션매개변수 등을 활용하여 생성자 생성

class Product {
  String? serNo;
  String? name;

  //선택 매개변수 사용함
  // !! 선택 매개변수 테스트 진행.

  Product({String? serNo, String? name}) {
    this.serNo = serNo;
    this.name = name;
  }

  
  String toString() {
    return 'Product{serNo: $serNo, name: $name}';
  }
}

void main() {
  var pro1 = Product();
  print(pro1);
  var pro2 = Product(serNo: "1234", name: "TV");
  print(pro2);
}

Product{serNo: null, name: null}
Product{serNo: 1234, name: TV}

🔑 Mixin

기본적으로 단일상속을 지원하는데 다중상속을 위해서는 with 키워드로 메서드를 오버라이딩한다.

class Fly{
  void doSomething(){
    print("Fly");
  }
}

class Person{
  void doSomething(){
    print("Person");
  }
}

//Teacher는 상속 받은 기능외에 Fly의 기능도
//가지고 있다.

//!! polymorphism 테스트
class Teacher extends Person with Fly{
  //do Something ~
  
  void doSomething(){
    print("Teacher");
  }
}

void main(){
  Fly f = new Teacher();
  f.doSomething();

  Person p = new Teacher();
  p.doSomething();
  Teacher t = new Teacher();
  print(f is Teacher);
  print(t is Person);
  print(p is Fly);
  print(p is Teacher);
  print(t is Fly);
  t.doSomething();
}

Teacher
Teacher
true
true
true
true
true
Teacher

https://snowdeer.github.io/flutter/2020/06/13/flutter-extends-and-with/

📌 null 처리

🔑 ?.

null이 아니면 정상 수행, null 이면 에러 대신 null 반환

  String? data = null;
  //?. 연산자
  var result = data?.length;
  print(result);  //null 출력됨

🔑 ??

코틀린의 엘비스프레슬리 연산자와 유사. null 인 경우 뒤의 값을 반환

  String? data1 = null;
  var result1 = data1?.length ?? 0;
  print(result1); //0 출력
profile
컴퓨터와 교육 그사이 어딘가

0개의 댓글