티스토리 뷰
nomadcoders 강의 참고
| Fultter
1) 장점
(1) One Framework, One Programming Language = Multi platform
구글이 제공하는 프레임워크와 언어로 하나의 프레임워크, 하나의 프로그래밍 언어로 멀티플랫폼 구현
ex) 멀티 플랫폼 : 안드로이드, iso ~ 2018년 이후 ~ 맥os, Windows, 리눅스, WEB, embeded
(멀티플랫폼/크로스플랫폼: 프로그램, 언어, 소프트웨어, 운영체제가 여러 종류 컴퓨터 플랫폼에서 동작)
(2) 여러 플랫폼에서 프로토 타입을 만드록 테스트 가능
(3) 코드 수 감소
구글페이를 플러터로 바꾸면서 코드 수를 170만 개에서 1.1millon으로 줄임
(4) 리액트 네이티브보다 쉬움
(5) 구글 제공 프레임워크, 언어라 제공하지 않는 것을 바로바로 만들어줌 ex) AOT
2) 단점
(1) 크로스 플램폼 프레임 워크
API 지원 부족. 플러그인 커뮤니티에서 찾아 사용.
(2) 크기
일반보다 무거움. 코드 + 그래픽 엔진 코드가 함께 패키지.
(3) 앱 호스트 플랫폼 UI/UX 사용 불가. 커스텀 디자인 사용 시 유리
앱 자체 디자인. 커스터마이징이 필요할 땐, 유용. 그 외엔 전부 수동으로 설정해야 해서 불편할 수 있음.
compile/null-safety/
variable/dynamic/final/const/late
function/Named Parameters/Recap/OptionalPositionalParameters/QQ Operator/Typedef
| Dart
모든 플랫폼에서 빠른 앱을 위한 클라이언트 최적화 언어
1) Compile → UI 최적화 & 생상적 개발
JIT(just-in-time) | AOT(ahead-of-time) |
dart VM을 통해 작성한 코드 결과를 바로 보여줌(핫리로드) |
컴파일 후 결과인 바이너리 배포 (바이너리 - CPU가 이해하는 기계어) |
개발 중일 때만 사용. 즉각적 피드백을 위해 |
UI 개발 시 적절하지 않음. 변환하는데 많은 시간 소요되므로 |
앱 속도는 느림 |
개발 중엔, dart VM을 통해 결과 즉시 확인. 작업 완료 후, 코드를 기계화 변경.
위와 같은 특성 때문에 개발경험 좋음. 특히 모바일 개발환경에서 좋음.
*debugging support(개발 중)
2) null safety(널 안정성) 제공
프로그램을 보다 안정하게. 개발할 때, 보통 null 고려하지 않으면 오류 발생
null인 객체를 참조하려고 할 때 발생하는 NullException.
3) 프레임워크를 위해 언어 수정 가능
보통은 프레임워크를 위해 언어 수정 불가능. 언어 규칙을 따라가야 함.
근데 flutter(프레임워크) 최적화를 위해 언어 규칙을 변경할 수 있음. 이건 구글 제공 프레임워크, 언어라 그러함.
변수
| 변수
-variable, dynamic, final, late, Constant Variables
variable | dynamic | final | late | Constant |
보통 지역변수, 함수 안에서 사용 |
어떤 데이터가 들어올지 모른다는 것 |
1) 변수 variable
//데이터타입(String, int...) 또는 var 이용해 선언 가능. 업데이트 가능.
void main(){
//class 변수 또는 속성 선언 시, 타입 설정 필요. int, String ...
String name = 'soyun';
//지역변수 등은 타입 지정 안해줘도 알아서 맞춤. var
var name = 'sy';
//변수 업데이트
name = 'soyun'; // 변수 업데이터
name = 1; // error : type
}
2) 변수 dynamic
void main(){
//dynamic : 여러가지 타입을 가질 수 있는 변수 키워드
var name;
dynamic str;
name = 'sy';
name = 12;
name = true;
if(name is int) {
name.
}
if(str is String) {
//수많은 자동옵션. 다이나믹이 name이 String이란 걸 dart가 알기 때문에
str.isEmpty;
}
}
3) null safety(null 안정성)
-개발자가 null값을 참조할 수 없도록 하는 것
-null을 참조할 때, 런타임에러(앱 사용 중 발생하는 에러. 컴파일러가 못 잡아줌)
// 변수는 non-nullable(null될 수 없음)
void main(){
//null일수 있음
String? ni = 'nico';
ni = null;
//null 아닐 때, isNotEmpty 요청
if (ni != null){
ni.isNotEmpty;
}
ni?.isNotEmpty;
}
4) 변수 fnal vs Constant Variables
-둘 다 값 변경 불가
-const : 컴파일 시점에 값을 가지고 있어야 함. 컴파일 전에 명시해놓은 값
-final : 컴파일 이후에 값을 할당 불가. 앱 실행 후, 이름이나 전화번호 입력해서 값 할당하는 것
//수정할 수 없는 변수
void main(){
final name = 'soyun';
name = 'quu'; -- error
}
//constant variable
void main(){
//constant 상수 != javscript, timescript
//const : compile-time constant. 컴파일 시 알고 있는 값
// 앱에 담긴 코드를 앱스토어에 보내기 전!
//컴파일 시점 바뀌지 않는 값
const max_price = 120;
//컴파일 시점, 바뀌는 값 : final, var
final username = fetchAPI();
}
5) Late Vaiables
//flutter로 data fetching 시 유용
//api로 데이터를 받아와 변수에 할당할 때, 유용
void main(){
//변수 선언, 데이터 할당은 추후
late final String name;
print(name); //error
name = 'data';
print(name);
}
Function(함수)
| function
//Run | debug
void main() {
print(sayhello('soyun'));
print(eat('rice'));
}
String sayhello(String name){
//api - data
return "Hellow $name nice to meet you!";
}
//축약, 리턴 줄만있을 때,
String eat(String food) => "yam! $food!!";
| Named Parameters
//name required argument ★
//named parameter : 순서 중요. 매개변수 순서 중요
//named argument
void main() {
//position parameter
print(hu('dj', 20, 'korea'));
//named argument
print(hu2(age: 22, country: 'korea', name: 'dojun'));
print(hu2());
print(hu3(age: 40, country: 'korea', name: 'hyeonwoo'));
}
//named parameter flutter 자주 사용 - 순서 중요
String hu(String name, int age, String country) {
return "Hello my name $name, $age, from $country";
}
//argument가 null 고려
//named argument null safety 1) default value
String hu2({String name = 'abc', int age = 20, String country = 'london'}) {
return "Hello my name $name, $age, from $country";
}
//named argument null safety 2) required
String hu3({required String name,
required int age,
required String country}) {
return "Hello my name $name, $age, from $country";
}
| Optional Positional Parameters
//optional
//positional
void main(){
var result = say('son', 22);
print(result);
}
// 특정 매개변수를 안 넘겨줘도 괜찮도록 설정
String say(String name,
int age,
[String? country = 'korea']) => 'Hello $name, $age, $country';
| QQ Operator
//QQ opterator ??, ?=
void main(){
capitalizeName('dojun') ;
capitalizeName(null); //The argument type 'Null' can't be assigned to the parameter type 'String'.
}
//삼항연산자
String capitalizeName(String? name) => name != null ? name.toUpperCase() : 'ANON';
//?? 사용
String capitalizeName(String? name) => name?.toUpperCase() ?? 'ANON';
void main(){
String? name;
name ??= 'son'; //name이 null이면, son 할당
// name = null;
name ??= 'another';
print(name); //son
}
| Typedef
//typedef 자료형에 사용자 별칭(alias)
typedef ListOfInts = List<int>;
typedef UserInfo = Map<String, String>;
List<int> reverseListOfNum(List<int> list){
var reversed = list.reversed;
return reversed.toList();
}
// String say(Map<String, String> userInfo){
// return "Hi, ${userInfo['name']}";
// }
String say(UserInfo userInfo){
return "Hi, ${userInfo['name']}";
}
void main(){
print(reverseListOfNum([1,2,3]));
print(say({'name':'mimi'}));
}
class(클래스) constructor
//Dart Class
class Player{
String name = 'dojun';
int xp = 1500;
void say(){
print("$name, go to cafe!");
}
}
void main(){
var player = Player(); //player 인스턴스 생성
print(player.name);
player.name = 'hyeonwoo';
print(player.name);
player.say(); //hyeonwoo, go to cafe!
}
//지연 할당 : late, this.name
class Player{
late final String name;
late int xp;
//class constructor(생성자) : 클래스 이름과 동일
Player(String name, int xp){
this.name = name;
this.xp = xp;
}
// argument, constructor method
class Player{
final String name;
int xp;
Player(this.name, this.xp);
void say(){
print("$name, go to cafe! for charging $xp!");
}
}
void main(){
//argument
var player = Player("robin", 1500); //positional argument
player.say();
var player2 = Player("mimi", 1750);
player2.say();
}
| named constructor parameters
//argument
//construntor method
class Player{ //type 선언
final String name;
int xp;
String team;
int age;
//
Player({required this.name, required this.xp, required this.team, required this.age});
void say(){
print("$name, go to cafe! for charging $xp!");
}
}
void main(){
//argument
var player = Player(name:"robin", xp:1500, team:'blue', age:18);
player.say();
var player2 = Player(name:"mimi", xp:1500, team:'pink', age:17);
player2.say();
}
| Named Constructor
//Named Constructor
class Player{ //type 선언 - property
final String name;
int xp, age;
String team;
//Nomal Constructor
Player({required this.name,
required this.xp,
required this.team, required this.age});
//Named Constructor Parameter : class property 할당
//클래스 속성 초기화(Player 객체 )
Player.createBP({required name, required team}):
this.name = name,
this.team = team,
this.xp = 0,
this.age = 29;
//속성 초기화 : positional parameter
Player.createYel(String name, int age):
this.name = name,
this.age = age,
this.team = 'Yellow',
this.xp = 2999;
void say(){
print("$name, go to cafe! for charging $xp!");
}
}
void main(){
//argument
var player = Player(name:"robin", xp:1500, team:'blue', age:18);
player.say();
var player2 = Player.createBP(name:"tomson", team:'brown');
player2.say();
var p3 = Player.createYel("sandy", 17);
p3.say();
}
class P{
final String name;
int age;
String team;
void say(){
print("Hello, $name");
}
P.fromJson(Map<String, dynamic> playerJson):
name= playerJson['name'],
age = playerJson['age'],
team = playerJson['team'];
}
void main(){
var apiDate = [
{
"name": "mimi",
"age" : 18,
"team": "sheep"
},
{
"name": "cuman",
"age" : 36,
"team": "bear"
}
];
apiDate.forEach((playerJson){
var p = P.fromJson(playerJson);
p.say();
});
}
| Cascade notation
class P{
String name;
int age;
String team;
void say(){
print("Hello, $name");
}
P.fromJson(Map<String, dynamic> playerJson):
name= playerJson['name'],
age = playerJson['age'],
team = playerJson['team'];
P({required this.name, required this.age, required this.team});
}
void main(){
//cascade
var n = P(name:"robin", age:18, team:"navy");
var sy = n
..name = "dojun" //첫번째 점이 변수 n을 지칭
..age = 24
..team = "sy"
..say(); // hello, dojun
print(n) ;
}
| enum : 개발자의 폭을 좁혀줌
enum Team{red, blue, navy}
enum Age{child, teenager, adult}
class P{
String name;
Age age;
Team team;
void say(){
print("Hello, $name");
}
P({required this.name, required this.age, required this.team});
}
void main(){
//cascade
var n = P(name:"robin", age: Age.adult,team: Team.blue);
}
| abstract constructor
abstract class Human{
void walk();
}
class P extends Human{
String name;
Age age;
Team team;
void say(){
print("Hello, $name");
}
void walk(){
print("walk");
}
P({required this.name, required this.age, required this.team});
}
class Coach extends Human{
void walk(){print("The coach walk");}
}
| 상속
//상속
class Human{
final String name;
// Human(this.name);
Human({required this.name});
void say(){
print("Hello, My name is $name");
}
}
enum Team{red, blue, white, black}
class Player extends Human{
final Team team;
Player({required this.team,
// required String name}): super(name)// 부모 클래스 확장
required String name}): super(name: name); //Human
@override //부모 클래스 객체 받아와 사용
void say(){
super.say();
print("and I play for ${team}");
}
}
void main(){
var player = Player(team: Team.red, name: "yoseob");
player.say();
}
| Mixin
//Mixin : 생성자가 없는 클래스 . 클래스에 프로퍼티 추가할 때 사용
//with로 연결된 클래스의 프로퍼티 사용 가능(상속과 다름)
class Strong{
final double strenchthlevel = 1500.99;
}
class Quick{
void runQuick(){
print("Fast! Fast! Fast!");
}
}
class Tall{
final double height = 1.99;
}
class Adult with Strong, Quick, Tall{}
class Kid with Strong, Quick, Tall{}
'TOTAL > Flutter & Dart' 카테고리의 다른 글
[Dart_02]데이터타입/List/collection if/String Interpolation/collection for/Maps/Sets (0) | 2023.01.08 |
---|---|
[Dart_01]변수 (0) | 2023.01.08 |
- Total
- Today
- Yesterday
- 미디어 태그
- Java
- 외부구성요소
- text formatting
- html
- typeof
- scanner
- html base tag
- html input type
- JavaScript
- 스크립태그
- initialized
- improt
- 기본선택자
- border-spacing
- caption-side
- input type 종류
- empty-cell
- CascadingStyleSheet
- A%B
- ScriptTag
- 변수
- html a tag
- 입력양식
- css
- html pre
- BAEKJOON
- html atrribute
- html layout
- selcetor
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |