변수와 함수명 정의 - 카멜표기법
파일명 정의 - 언더스코어
클래스명 정의 - 파스칼표기법
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에서는 오버로딩을 하지 않고 선택적 매개변수를 사용한다.
오버로딩과 오버라이딩
* 오버로딩 - 매개변수의 개수, 타입, 순서가 다르게하여 같은 이름의 메서드를 여러 개 정의하는 방식
* 오버라이딩 - 자식 클래스에 부모클래스의 타입을 일치시키기 위해 부모클래스에서 메서드를 상속시켜서 구현하는 방식


이름이 있는 생성자
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