[플러터] 5. dart문법 2

silver's avatar
Feb 18, 2025
[플러터] 5. dart문법 2
💡
변수와 함수명 정의 - 카멜표기법
파일명 정의 - 언더스코어
클래스명 정의 - 파스칼표기법

late와 ?

class Person{ int id; String name; late int money; // 나중에 들어옴 or 디폴트 0 -> 나중에 setter로 받겠다. String? nickname; // 있을 수도 있고 없을 수도 있음 Person(this.id, this.name, this.money, this.nickname); } void main(){ Person p = Person(1,"",10,""); }

선택적 매개변수

: dart에서는 오버로딩을 하지 않고 선택적 매개변수를 사용한다.
오버로딩과 오버라이딩
* 오버로딩 - 매개변수의 개수, 타입, 순서가 다르게하여 같은 이름의 메서드를 여러 개 정의하는 방식 * 오버라이딩 - 자식 클래스에 부모클래스의 타입을 일치시키기 위해 부모클래스에서 메서드를 상속시켜서 구현하는 방식
notion image
notion image

이름이 있는 생성자

class Person{ int id; String name; late int money; // 나중에 들어옴 or 디폴트 0 -> 나중에 setter로 받겠다. String? nickname; // 있을 수도 있고 없을 수도 있음 Person(this.id, this.name, this.money, this.nickname); // Person({this.id}, this.name, this.money, this.nickname); 앞에만 {} 불가능 // Person(this.id, {this.name, this.money, this.nickname}); 뒤에 한꺼번에 {}가능 Person.toMap(); // new되면서 Person을 map 타입으로 바꿔준다. -> toMap는 이름 아무거나 만들어도 돼 -> 이름있는 생성자 생성 // Person.fromMap(Map<String,dynamic> m) : //super가 생략되어 있다. // this.id = m["id"] , -> map에 값 넣는 방법 // this.name = m["name"], // this.money = m["money"], // this.nickname = m["nickname"] Person.fromMap(Map<String, dynamic> m) : this.id = m["id"], this.name = m["name"], this.money = m["money"], this.nickname = m["nickname"] ?? "다른이름"; void init(){ if(money == 0){ for(int i=0; i<10; i++){ money = money + 1; } } } } void main(){ var m = { "id":2, "name":"임꺽정", "money":0 }; Person p2 = Person.fromMap(m)..init(); // cascade 사용해서 객체 생성과 동시에 method 실행 print(p2.id); print(p2.name); print(p2.money); print(p2.nickname); }
 

Composition과 mixin

// composition -> with ,사용가능해서 여러개의 composition 한번에 받을 수 있다. // 상속 -> extends 다형성 만족 mixin class Engine{ int power = 1000; } class Car with Engine {} void main(){ Car c = Car(); print(c.power); }
 

const와 final

  • const는 컴파일 시 상수로 초기화 되어 동일값에 대해 동일한 인스턴스 재사용할 수 있다.
  • final은 런타임 시 초기화되어 이 후에 값을 변경할 수 없다
    • const String primaryColor = "green"; // 컴파일 시 초기화 -> 상수 final String secondaryColor = "red"; // 런타임 시 초기화 -> 상수
  • const와 final은 타입 생략 가능하다.
    • // const와 final은 타입 생략 가능! -> 생략 시 var로 설정됨 const primaryColor = "green"; // 컴파일 시 초기화 -> 상수 -> class밖이든 안이든 final secondaryColor1 = "red"; // 런타임 시 초기화 -> 상수 -> 보통 class 안에서 사용한다. const secondaryColor2 = "red"; // 컴파일 시 초기화 -> 상수
 
// 1 // class Button { // String text; // -> 일반 변수로 객체 생성 이후에도 값 변경 가능 // Button(this.text); // } // 2 class Button { final String text; // -> final을 사용하나 const Button(this.text); } // 3 // class Button { // String text; // const Button(); // } void main(){ Button b1 = const Button("로그인"); Button b2 = const Button("로그아웃"); print(b1.hashCode); print(b2.hashCode); } /** * new method stack * ioc - 재사용 * -> dart에서는 const로 띄우면 같은데서 가져올 수 있으니까 편하게 사용가능하다 * * 위에서 final이 없으면 상수가 아닌 변수가 되므로 const사용 불가능하다. * 아니면 생성자에 매개변수를 안받으면 const를 생성자에 사용가능하다. */
 

Collection - List, Map

// var list = [1,2,3,"se"]; // var list = [1,2,3]; // List<Integer> list = [1,2,3]; // List<Object> list = [1,2,3]; -> Object 잘 안써 List<dynamic> list = [1,2,3]; var map = { "id" :1, "name":"홍길동" }; void main(){ print(list[1]); print(map["name"]); // 1. 값 추가 list.add(4); print(list); // map에 값 추가 map["phone"] = "01011111111"; print(map); } /** * 상태 관리를 위한 데이터 비교을 위해 add같은 거 안쓰고 * previous data와 next data 비교해야해 * 새로 data 만들어서 hash값 비교 * rerendering 데이터 새로 만들었을 때 */
 

List 다루기

var list = [1,2,3]; void main(){ // 0. 깊은 복사 var r1 = [...list]; // java의 .stream과 동일 ( 타입을 벗긴 데이터만 들어와 ) ... 전개 연산자 -> 흩뿌림 ...list는 1,2,3값이 나와서 여러개라 [안에 넣어준다] // 1. 추가 var r2 = [...list,4]; // 2. 삭제 java에서의 .filter = where -> true인 것은 모으고 false인 것은 버린다 var r3 = list.where((e) => e != 2).toList(); print(r3); // 3. 검색 java에서의 .filter var r4 = list.where((e) => e == 2).toList(); // 상태를 내가 쥐고 있어서 상태관리 시 db에 다녀오지 않아도 되어 편리하다 // 4. 수정 // var r5 = list.map((e) => e == 2 ?5 : e ).toList(); var r5 = list.map((e){ if(e == 2 ){ e = 5; } return e; }).toList(); print(r5); }
 
 
Share article

silver