본문 바로가기
개발/Flutter

[Flutter] #2 Dart

by dangbok 2022. 11. 15.

 

  • Function의 body
  • Var 변수 키워드: String, int, double, List<String>, Map(key와 value로 이루어짐)

(데이터타입 따로 지정안해도 자동으로 지정됨)

 

int timesTwo(int x){

  return x*2;

}

 

int timesThree(int x) =>x*2;

 

  • 다트 문법은 main() 함수가 진입점-> void main(){

Print("hh");

}

 

  • 다트는 객체지향 언어이며 단일 상속을 지원한다.
  • 다트에서 모든 것이 객체이며 모든 객체는 클래스의 인스턴스이다. 모든 객체는 Object 클래스를 상속받는다. 심지어 숫자도 기본형이 아니라 객체!
  • 다트는 형식을 갖는다. 문자열을 반환한다고 선언한 함수에서 숫자를 반환할 수 없다.
  • 다트는 최상위 수준 함수와 변수를 지원하며 이를 라이브러리 멤버라 부른다.
  • 다트는 어휘적으로 한정된다.

 

# 형식 시스템

  • 변수를 선언할 때는 형식을 지정해야 한다.
  • List나 Map을 사용할 때는 <와> 사이에 요소의 형식을 정의한다.
  • 함수에서 인수를 정의할 때도 형식을 사용한다.

Return x+y;

}

  • 다트는 동적 형식도 지원한다. 변수를 dynamic으로 설정하면 컴파일러가 해당 변수에 모든 형식을 허용한다.

 

 

# 주석 종류 3가지

//: 한 줄 주석

/*  */: 여러 줄 주석

///: 문서 주석-> 메서드나 클래스 정의 위에 작성하면 dartdoc과 같은 문서 생성 도구를 통해 문서를 자동으로 생성해줌

 

  • 문장은 세미콜론으로 표시!

 

# final, const, static

  • 세 키워드는 변수의 형식을 확장한다.
  • 변수의 값을 바꿀 수 없게 하려면 final, const 사용
  • Final 변수는 한 번만 할당할 수 있으며 클래스 수준에서 변수를 할당하기 전에 선언함. 쉽게 말해 클래스의 생성자에서 할당하는 모든 변수에 final을 사용함
  • 반면 const 변수는 할당하기 전에 선언하지 않음 컴파일 이후로 항상 같은 값을 갖는 변수를 상수라고 함

 

# 변수: num(int, double), String, bool

  • 변수에 담긴 값은 언제라도 다른 값으로 바꿀 수 있음
  • 타입 추론

다트는 타입을 직접 명시하지 않고 var로 대체할 수 있는 타입 추론을 지원

  • 변수는 값이 변경되어 의도치 않게 에러를 발생할 가능성이 있으므로 가급적이면 값이 변하지 않게 상수로 사용하는 것이 좋음-> final 키워드를 제일 앞에 붙이면 값이 수정되지 않는 상수로 사용가능!
  • 변수에 required 키워드 애너테이션을 추가하려면 meta라는 다트 라이브러리를 사용해야 함

 

# 산술연산자: +, -, *, /, ~/(정수 나눗셈), %

# 증감연산자

# 비교연산자

# 논리연산자: &&,||

# 타입검사: is, is!

Ex)

void main(){

  int a=10;

  if(a is int){

    print('정수');

  }

 

  String text='hello';

  if(text is! int){

    print('숫자가 아님');

  }

}

# ?. 연산자

# ?? 연산자: 값이 존재하지 않는 상황에 할당할 백업값을 지정 가능-> 이 값이나 변수가 null이면 백업값을 사용하시오를 의미

# ??= 연산자: 객체가 null이면 백업값을 할당하고 아니면 객체를 그대로 반환한다.

 

# 형변환: as 키워드 사용-> int와 double 모두 상위 개념인 num으로 형변환 가능

 

  • Assert() 함수는 계산 결과가 참인지 검사
  • 더하기 연산자의 또 다른 쓰임새는 두 개의 문자열을 결합하는 것

 

# 함수

Int f(int x){

Return x+10;

}

 

 

Void main(){

Var result=f(10);

}

 

  • 함수는 입력과 출력을 다양하게 조합 가능
  • 입력값은 없거나 여럿일 수 있음
  • 출력값은 없거나 하나만 있을 수 있음

 

  • Print() 함수는 반환값이 void인 대표적인 함수

변수 앞에 $ 기호를 붙여 문자열 내에 변수를 삽입할 수 있음

Ex)

String _name='홍길동';

int _age= 20;

 

void main(){

  print('$_name은 $_age살입니다.');

}

 

  • 클래스 내부에 작성하는 함수를 메서드라고 함
  • 정의된 클래스에 관계된 기능을 수행

Ex)

class Myclass{

  bool isEven(int number){

    return number %2==0;

  }

}

 

var myClass=MyClass();

print(myClass.isEven(10)); //static키워드를 붙이면

정적 메서드가 되며 함수로 볼 수 있음

 

Ex)

void main(){

  Person person=Person("hjw",age:24);

  person.greeting();

}

 

class Person{

  String name;

  int age;

  Person(this.name,{this.age});

 

  void greeting(){

    print('안녕하세요 저는 $name입니다.');

  }

}

 

 

# 익명함수: 이름 없는 함수도 정의해 사용 가능

  • ([인수명]) {[동작 또는 반환값]}

 

  (number){

  return number %2==0;

  };

 

 

# 람다식

  • ([인수명]) => [동작 또는 반환값]

 

(number)=> number % 2 ==0;

 

# 선택 매개변수: 함수 정의에서 {}j로 감싼 매개변수는 선택적으로 사용 가능

  • 호출시 매개변수명을 값 앞에 써주면 됨-> 이름 있는 매개변수라고 함

 

  • 만약 필수 매개변수와 선택 매개변수를 함께 사용하고 싶다면 앞쪽에 필수 매개변수를 먼저 둔다.
  • 선택 매개변수는 호출할 때 매개변수명을 함께 쓰기 때문에 옵션이 많을 때도 가독성을 높여주는 장점

  void something(String name,{int age}){}

 

  void main(){

    something('홍길동',age: 10);

    something('홍길동');

 

  }

 

main(){

String text='hello';

 

# if와 else

if(text is int){

  print('정수');

}else if(text is double){

  print('실수');

}else{

  print('정수도 실수도 아님');

}

  }

 

  • 다트의 조건문에는 반드시 불리언을 사용해야 함

 

# 삼항 연산을 활용한 분기

  • [조건] ?[참일 때]:[거짓일 때]

 

Var todo =isRainy? '빨래를 하지 않는다' : '빨래를 한다';

 

# switch와 case

  • Switch문의 각 case에 switch를 탈출하는 키워드를 추가해야 함 보통 break나 return으로 탈출

 

-객체 지향 프로그래밍

  • New 키워드는 인스턴스화하는 키워드이며 생략 가능

 

Var person=new Person();

Var person2=Person(); //new 키워드 생략 가능

 

  • 변수명 뒤에 .연산자를 입력해 생성한 객체의 프로퍼티에 접근 가능

 

  • 변수명 앞에 _기호를 붙이지 않으면 외부에서 접그 가능하고, 붙이면 접근 불가능함
  • _기호가 붙은 프라이빗 변수는 해당 클래스가 정의되어 있지 않은 다른 파일에서 직접 접근 불가능

 

# 프라이빗 변수에 접근하려면 게터와 세터 메서드 필요! 각각 읽기와 쓰는 기능을 함

class Person{

  String name;

  int _age;

 

  int get age=>_age;

}

 

import 'person.dart'

 

var person= Person();

print(person.age); //_age값 출력

 

 

Ex)

class Rectangle{

  num left, top, width, height;

 

  Rectangle(this.left,this.top,this.width,this.height);

 

  num get right=>left+width;

  set right(num value)=> left=value-width;

}

 

# 상속: extends 키워드 사용하여 상속

  • 상속을 받으면 원래 있던 기능을 그대로 물려받는데, 만약 새로 정의하고 싶다면 @override 어노텡이션을 사용해 오버라이드하여 재정의하면 됨

 

  • 추상 클래스는 그대로 인스턴스화할 수 없으며 다른 클래스에서 임플리먼트하여 기능을 완성하는 상속 재료로 사용됨 이때 대상 클래스에는 implements 키워드를 메서드에는 @override 키워드를 사용

class Goblin implements Monster{

  @override

  void attack(){

    print('고블린 어택');

  }

}

 

class Bat implements Monster{

  @override

  void attack(){

    print('할퀴기');

  }

}

 

# 믹스인: with 키워드를 사용하면 상속하지 않고 다른 클래스의 기능을 가져오거나 오버라이드할 수 있음

# 열거 타입: 상수를 정의하는 특수한 형태의 클래스

  • Enum Status{login,logout}

 

Void updateColor(Color color){

Switch (color){

Case Color.red:

//작업수행

Case Color.green:

//작업수행

Case Color.blue:

//작업수행

}

}

 

# 다트는 List, Map, Set 등의 컬렉션을 제공함

  • List: 같은 타입의 자료를 여러 개 담을 수 있고 특정 인덱스로 접근 가능
  • Map: 키와 값의 쌍으로 저장할 수 있고 키를 통해 값을 얻을 수 있음
  • Set: 중복이 허용되지 않고 찾는 값이 있는지 없는지 판단하고자 할 때 사용

 

# 다트에서는 함수를 값으로 취급 가능 그러므로 다른 변수에 함수를 대입 가능

void greeting(String text){

  print(text);

 

}

void main(){

  var f=greeting;

  f('hello');

}

--> 이렇게 함수를 매개변수로 전달하기, 수정하기, 변수에 대입하기가 가능한 객체를 일급 객체라고 함

 

# for() 문과 forEach() 함수

forEach()함수: 내부 반복을 수행-> 외부에서 봤을 때는 반복을 띠지 않지만 내부적으로 반복을 띰

 

# where 함수: 조건을 필터링할 때 사용하는 함수

# map 함수: 반복되는 값을 다른 형태로 변환하는 방법을 제공하는 함수

 

  • Where() 함수와 toSet() 함수를 함께 사용하면 중복 데이터를 없앨 수 있음

 

class Car{

  int seats;

  String color;

 

  Car(int sts,[String clr='black']){

    this.seats=sts;

    this.color=clr;

  }

 

  printVars(){

    print('seat: $seats,color:$color');)

  }

}

 

void main(){

  Car newCar=Car(4,'red');

  newCar.printVars();

}

 

# 루프

  • 다른 언어와 동일한 키워드로 반복 루프를 구현함

 

 

 

 

 

 

 

 

 

 

 

 

'개발 > Flutter' 카테고리의 다른 글

[Flutter] #1 Widget  (0) 2022.11.14