클래스
초기화 1
// 클래스
class User {
String username;
String password;
User(this.username, this.password);
}
void main() {
User u1 = User("ssar", "1234");
print(u1.username);
print(u1.password);
}
- 가장 기본 사용법
- 생성자의 인수를 바로 필드값으로 바인딩
- dart 에선 생성자의 중괄호 내용을 컴파일러가 볼 수 없다 → 중괄호 내에서 초기화를 해도 컴파일러는 모르기 때문에 초기화 에러, null 에러가 발생하여 빨간줄이 생긴다
초기화2
// 클래스
class User {
String username;
String password;
User({required this.username, this.password = "1234"});
}
void main() {
User u1 = User(username: "ssar");
print(u1.username);
print(u1.password);
}
- 생성자의 인수를 필드값으로 바로 바인딩
- 선택적으로 받는 방법
- dart 에선 생성자의 중괄호 내용을 컴파일러가 볼 수 없다 → 중괄호 내에서 초기화를 해도 컴파일러는 모르기 때문에 초기화 에러, null 에러가 발생하여 빨간줄이 생긴다
초기화3
// 클래스
class User {
String username;
String password;
User(String username, String password)
: this.username = username,
this.password = password == "1234" ? "5678" : password;
}
void main() {
User u1 = User("ssar", "1234");
print(u1.username);
print(u1.password);
}
- : 뒤 → 초기화 코드 작성
- 한 줄만 가능, 그래서 삼항연산자를 사용함
- dart 에선 생성자의 중괄호 내용을 컴파일러가 볼 수 없다 → 중괄호 내에서 초기화를 해도 컴파일러는 모르기 때문에 초기화 에러, null 에러가 발생하여 빨간줄이 생긴다
초기화4
// 클래스
class User {
String username;
String password;
User(this.username, this.password);
void init() {
if (username == "ssar") {
if (password == "1234") {
this.password = "9999";
}
}
}
}
void hello(User u) {}
void main() {
hello(User("ssar", "1234")..init());
}
- 초기화를 여러 줄 만들고 싶으면 init() 메서드 만들어서 사용
- .. 체인방식으로 사용 가능(케스케이드연산자)
- 변환이 필요하면 이 방식을 많이 사용한다
- 일단 받고 내부에서 변환하자
상속
상속1
// 상속
class Burger {
String name;
Burger(this.name);
}
// is
class ChickenBurger extends Burger {
int price;
ChickenBurger(this.price, super.name);
}
class CheeseBurger extends Burger {
CheeseBurger(String name) : super(name);
}
class CheeseBurger extends Burger {
String name
CheeseBurger(this.name, String name) : super(name);
} // 플러터의 생성자 권장 방식
void main() {
Burger b1 = CheeseBurger("치즈버거");
Burger b2 = ChickenBurger(1000, "치킨버거거");
}
- dart는 상속 객체를 초기화 할 때 자식을 먼저 초기화 다 하고 부모를 초기화 한다
- java는 상속 객체를 초기화 할 때 부모를 먼저 초기화 다 하고 자식을 초기화 한다
- 순서가 다른 것을 유의하자
추상클래스
abstract class Button {
void good();
void hello() {
print("hello");
}
}
class TextButton extends Button{
@override
void good() {
// TODO: implement good
}
}
생성자 오버로딩
// 상속
class Button {
String text;
String color;
int x;
int y;
int width;
int height;
Button(
this.text, {
this.color = "회색",
this.x = 0,
this.y = 0,
this.width = 200,
this.height = 150,
});
Button.block(
this.text, {
this.color = "회색",
this.x = 0,
this.y = 0,
this.width = 100000000,
this.height = 150,
});
static Button inlineButton(String text) {
return Button(text);
}
}
void main() {
Button basicButton = Button("로그인");
Button redButton = Button("로그인", color: "red");
Button blockButton = Button.block("회원가입");
Button inlineButton = Button.inlineButton("회원가입");
}
- 생성자 오버로딩과 static 메서드의 사용법이 동일하다
- 마우스를 올려 new 라고 표시되면 이름이 있는 생성자
- 마우스를 올려 new 가 안나오면 static 메서드
컴포지션
mixin class Engine {
int power = 5000;
}
mixin class Wheel {
int size = 21;
}
// has
class Car with Engine, Wheel {}
void main() {
Engine e = Engine();
Car c1 = Car();
print(c1.power);
print(c1.size);
}
- 컴포지션을 mixin 과 with 으로 할 수 있다
- 빨간색으로 칠한 부분처럼 내가 가진 것처럼 사용 가능
Share article