반응형
클래스와 객체는 자바와 같고 특이한 정은 초기화나 명명된 생성자, 팩토리 생성자 등이다.
- 초기화 목록이라는 것이있다. 이를 사용하면 아래와 같이 클래스를 초기화 할 수 있다.
User(String name, int age): this.name = name , this.age = age {}
- 초기화 목록은 특정항목을 선택하거나 함수 호출로 멤버를 초기화 할 때 자주 사용합니다.
class MyClass{
late int data1;
late int data2;
MyClass(List<int> args): this.data1 = agrs[0], this.data2 = agrs[1] {}
}
class MyClass{
late int data1;
late int data2;
// 생성자의 초기화 목록이 실행되는 시점은 객체 생성이전이므로
//이곳에서 호출되는 함수는 static이 추가되어야 한다.
MyClass(int arg1, int arg2): this.data1 = cal(arg1), this.data2 = cal(arg2) {}
static int cal(int arg){
return arg * 10;
}
}
- 자바에서는 생성자를 여러개 생성할 때 똑같은 이름에 매개변수나 반환 타입만 다르게해서 선언해야하는데, 다트에서 생성자를 다양하게 이름을 주어 생성할 수 있는데, 이를 명명된 생성자라 한다.
class MyClass{
MyClass();
MyClass.first();
MyClass.second();
}
var obj1 = MyClass();
var obj2 = MyClass.first();
var obj3 = MyClass.second();
- this를 사용하여 생성자 안에서 다른 생성자를 호출하려고 하면 오류가 난다. 이유는 this는 생성자의 {}안에 작성할 수 없기 떄문이다. 그래서 다른 생성자 호출하는 this()는 생성자의 콜론(:) 오른쪽에 초기화 목록에 작성해야 한다.
class MyClass{
MyClass(int data1, int data2){
print("MyClass");
}
MyClass.first(int arg){
this(arg,0); //오류
}
}
// 초기화 목록에 this()호출문을 작성하면 생성자 본문을 작성할 수 없다. 그래서 {}를 작성하면 오류가 발생한다.
class MyClass{
MyClass(int data1, int data2){
print("MyClass");
}
MyClass.first(int arg) : this(arg,0){ } //오류
}
// 아래와 같인 {} 없이 작성해주어야 한다.
class MyClass{
MyClass(int data1, int data2){
print("MyClass");
}
MyClass.first(int arg) : this(arg,0);
}
//this()를 이용할 때 또하나의 규칙은 this() 호출문 외에 다른 구문을 사용할 수 없다.
// 즉, this()만 사용해야한다.
MyClass.first(int arg) : this(arg,0), this.data1 = arg // 오류
//최종적으로 아래와 같이 사용가능 하다
class MyClass{
late int data1;
late int data2;
MyClass(this.data1, this.data2);
MyClass.first(int arg): this(arg,0);
MyClass.second() : this.first(0);
}
- 팩토리 생성자는 factory 예약어로 선언한다. 팩토리 생성자는 반환타입을 지정할 수 없으며 클래스 타입으로 고정된다. 팩토리 생성자는 주로 객체를 생성할 때 식별자에 해당하는 객체가 없으면 객체를 새로 생성하고, 있으면 기존의 객체를 그대로 반환할때 많이 사용한다.
- 상수 생성자는 const 예약어로 선언하며 본문을 가질 수 없다. 즉, {}를 추가할 수 없다. 또한 , 상수 생성자가 선언된 클래스의 모든 멤버 변수는 final로 선언해야한다.
- 객체를 생성할 때도 필요하다면 const를 추가해서 상수 객체를 만들 수 있다. const로 객체를 생성하려면 생성자 또한 const로 선언되어야 한다.
class MyClass{}
main(){
var obj = const MyClasS(); //오류
}
class MyClass{
final int data1;
const MyClass(this.data1);
}
main(){
var obj = const MyClasS(10);
}
- 상수 생성자를 선언한 클래스더라도 일반 객체로 선언하면 서로 다른 객체가 생성된다.
var obj1 = MyClass(10);
var obj2 = MyClass(20);
print("${obj1 == obj2}"); // false
- const를 붙여서 상수 객체를 선언하면 생성자에 전달한 초기값이 똑같으면 객체를 다시 생성하지 않고 이전 값으로 생성한 객체를 그대로 사용한다.
var obj1 = const MyClass(10);
var obj2 = const MyClass(10);
var obj3 = const MyClass(20);
print("${obj1 == obj2}"); // true
print("${obj1 == obj3}"); // false
print("${obj2 == obj3}"); // false
- 똑같은 값으로 객체를 2개 생성할때 하나는 일반 객체, 하나는 const 붙여 상수 객체로 선언하면 다른 객체되 된다.
var obj1 = const MyClass(10);
var obj2 = MyClass(10);
print("${obj1 == obj2}"); // false
반응형
'2023년 부터 > Flutter' 카테고리의 다른 글
[Flutter] 버그 & 이슈(The following assertion was thrown building Scaffold(dirty, state: ScaffoldState#5a617(tickers: tracking 2 tickers)):No Directionality widget found.) (0) | 2024.03.26 |
---|---|
Dart - 믹스인(mixin) (0) | 2023.10.19 |
Dart - 함수와 제어문 (2) | 2023.10.19 |
Dart - 널 안정성 (0) | 2023.10.19 |
Dart - 데이터 타입 (0) | 2023.10.19 |