Flutter

Flutter 배우기 #1 Dart언어 문법

태은코딩 2024. 11. 29. 21:44

출처 - https://www.youtube.com/watch?v=7pnyV7nz1zI&t=1486s

1. Flutter란?

- google에서 개발한 크로스 플랫폼 앱 개발 프레임 워크

- ios, 안드로이드 모두 동시 개발 가능

- Dart 프로그래밍 언어 사용

- 플러터의 모든 것은 위젯 위주

 

2. 다트 언어란?

- 구글에서 만든 프로그래밍 언어

-  Java, Javascript와 비슷한 문법

- 객체지향 언어

- Null safety를 지원

- https://dartpad.dev/에서 편하게 개발 환경 사용가능

 

3. 자료형

- int : 정수형 숫자

- double : 실수형 숫자

- num : 정수형 또는 실수형 숫자

- String : 텍스트나 기반 숫자

- bool : True나 False

- var : 입력받은 값에 따라 자료형 결정. 한 번 결정된 자료형은 변경 불가

- dynamic : 입력받은 값에 따라 자료형 결정. 다른 변수 입력하면 자료형 변경 가능.

-위에서는 var타입을 썼기 때문에, 한번 결정한 데이터 타입인 String에서 name=1로 int로 바꾸려 하면 오류가 발생한다.

- 위에서는 dynamic 타입을 썼기 때문에, 다른 값 입력하면 자료형 변경 가능

 

4. 컬렉션

- List : 데이터 순서가 있고, 중복 허용

- Set : 데이터 순서가 없고, 중복 불가

- Map : key와 value값으로 구성, key는 중복 불가, value는 중복 가능

다음과 같이 List<string>처럼 타입 결정 가능

 

5. 연산자

1) 기본 연산자 : 다른 언어들과 동일

2) null 연산자

  1. 타입 뒤에 ?를 추가하면 null값을 변수에 저장 ex) double? number;
  2. ??= 연산자는 변수가 null일 때만 값 할당
  3. ?? 연산자 병합 연산자로, 앞의 값이 null일때만 뒤에 있는 값 반환

??= 연산 예시
?? 연산자 예시

3) 비교 연산자 : 다른 언어와 동일

4) 타입 비교 연산자 : is연산자로 타입 맞으면 true반환, is!로 타입 틀리면 true반환

 

5) 제어문 : 다른 언어와 동일 (if, for, while, do-while, switch)

** $ 표현식 : 문자열 내에 변수 삽입시 사용

ex) "$a 더하기 $b는 ${a+b}이다."처럼 사용 한다.

 

6. 함수와 람다

1) 함수의 일반적인 특징 : 반환형 해놓거나, void로 반환형 받지 않거나

2) 익명 함수 : 함수 이름 없이 일회성으로 쓸 때 사용 ex) (매개변수){return } 형태

3) 람다 함수 : 함수 이름 없이 일회성 사용시, Return을 명시적으로 작성할 필요 없음 => 뒤에 오는 표현식의 값이 자동으로 반환됨

4) typedef와 함수 : 함수의 시그니처(반환타입, 매개변수 개수, 타입 등)를 정의하는 값

다음과 같이 typedef란 함수 타입에 별칭을 붙이는 기능, 간결하게 표현 가능하다.

5) try catch 예외처리 

 

객체지향 프로그래밍

1. 클래스

1) 생성자

final은 한번만 변수 값 할당해서 객체의 멤버변수를 나중에 변경하는 것 방지

클래스와 같은이름의 생성자 만든다.

this로 클래스 멤버변수라는것을 헷갈리지 않게 표시

 

축약형 생성자 사용

아래와 같이 축약형으로도 가능하다.

 

2.) 프라이빗 변수

private 변수는 다른 언어들은 클래스 밖에서 접근 불가한다는 뜻이지만

flutter에서는 다른 함수에서 접근 하지못한다는 의미이다.

private변수는 간단하게 _로 시작하는 변수이름 생성하면 된다.

 

3) 게터/ 세터

다른 파일에서 클래스의 private값 접근하고 싶을 때 사용

게터 : 말 그대로 값을 가져올떄 사용

세터 : 값 지정할 때 사용

 

4) 상속

extecnds 키워드로 상속 받을 수 있다.

super(name,price)처럼 부모 클래스 생성자도 호출해 줘야한다.

TV(String name, int price, this.type) : super(name,price)처럼 type은 TV내의 멤버 변수이므로 this사용

 

5) 오버라이드

부모 클래스에서 정의된 함수(메소드)를 재정의 할 때 사용

아래와 같이 showInfo()함수를 다시 재정의

super.showInfo()해주고, type프린트 추가

6) 인터페이스

- 클래스가 어떤 기능을 제공해야하는지 약속처럼 정의한 것

Product 인터페이스를 만들고 선언만 한 뒤,

TV 클래스를 implemets로 Product 클래스의 인터페이스를 받아 구현

**implemets의 extends와 다른점 : extends는 부모 클래스의 변수들 재정의 안해주었지만 implements는 재정의

 

상속과 인터페이스의 차의점

 

7) 믹스인

특정 클래스의 원하는 기능만 골라넣을 수 있는 기닁

여러개의 mixin을 미리 정의해놓고 

class 정의시에 with으로 원하는 mixin의 내용 받아 올 수 있다.

** 만약 믹스인이 아니라 상속으로 두개 기능 구현하고자 하면?

-> Swimmable 클래스를 extends로 상속받고, fly함수를 overide로 구현

8) 추상

추상 매소드는 함수의 반환타입, 매개변수만 정의하고 함수 바디는 자식 클래스에서 구현하도록 한다. 

abstract class Animal을 만들고, 안에 함수이름만 정의

Dog에서 extends 상속받고 함수 바디 구성

추상화의 목적 : 자식 클래스별 다르게 나올 수 있는 함수를 구현 강제함

 

9) 제너릭

<>안에 들어가는 제너릭 문자

아래와 같이 T로 타입을 지정해놓으면 , 추후 입력될 타입으로 T타입을 지정할 수 있다. 

이제 Cache에 <List<int>>가 들어가니까 T는 List<int>타입인것이다.

비동기 프로그래밍

1. 동기 vs 비동기 프로그래밍

- 플러터는 비동기 사용

 

2. Future

다음과 같이 Future.delayed(Duration(seconds:3))을 하면 3초간 기다린다.

그래서 코드실행끝이 먼저 출력되고 그 다음 결과가 출력된다.

 

3. Async와 await

아래와 같이 async와 await를 사용하면 작성 순서대로 실행시킬수 있다.

아래와 같이 addNumbers를 2개 실행하면 계산 시작! 이후 3초 기다릴때 다음 addNumbers함수가 실행이 되어버린다.

그런데 여기서 이제 순서대로 실행시키고자 하면

main에 async를 넣어서 await를 사용하면 순차적으로 실행된다.

 

4. Stream

- 순서 보장 받고 싶을 때 사용

- Future와 Strema의 차이점 : 단일값 vs 다중값

- Stream은 실시간 데이터 리스닝이 가능

1) 단일 구독 스트림

- 한번만 Listen할 수 있음

import "dart:async"한다.

StreamController을 생성하고

stream = controller.stream()으로 받는다.

 

2) 브로드캐스트 리스닝

- stream을 여러번 listen할 수 있음

- stream = controller.stream.asBroadcastStream으로 변환

 

3) 함수로 stream반환하기