2023.11.08 - [Client/Dart] - Dart 16. 클래스 생성과 호출 그리고 초기화 {유목민 알폰스}
명명된 생성자와 상수 생성자의 사용법과 특성을 알아봅시다.
명명된 생성자는 한 클래스의 여러 개의 다른 종류의 생성자를 작성할 수 있습니다. 점(.)으로 연결해서 다양한 생성자의 구현이 가능합니다. 오버로딩은 매개변수를 보고 용도를 구분하지만 이렇게 이름으로 명시함으로써 가독성이 더 높아진다고 볼 수 있습니다.
상수 생성자는 기존에 동일한 객체의 요청이 있을 때 새로 생성하지 않고 이미 생성된 객체를 활용하므로 애플리케이션의 성능을 개선할 수 있습니다.
명명된 생성자를 통한 여러 개의 다양한 생성자를 정의해 봅시다.
class TestClass {
TestClass() {}
TestClass.first() {}
TestClass.second() {}
}
main() {
var test1 = TestClass();
var test2 = TestClass.first();
var test3 = TestClass.second();
}
명명된 생성자에서 this의 활용방법을 소개합니다.
class TestClass {
TestClass(int arg1, int arg2) {
print("arg1 $arg1, arg2 $arg2");
}
TestClass.first(int arg) : this(arg, 111);
TestClass.second() : this.first(222);
}
main() {
var test1 = TestClass(10, 20);
var test2 = TestClass.first(10);
var test3 = TestClass.second();
}
결과)
arg1 10, arg2 20
arg1 10, arg2 111
arg1 222, arg2 111
팩토리 생성자
class TestClass {
TestClass._instance();
factory TestClass() {
return TestClass._instance();
}
}
main() {
var obj = TestClass();
}
상수 생성자
class Test {
final int n; //const생성자를 가지고 있는 경우 변수는 무조건 final로 선언해야 합니다.
const Test(this.n); //const는 본문 {}를 가질수 없는 생성자
}
main() {
var test1 = Test(10);
var test2 = Test(20);
print("test1.data : ${test1.n}, test2.data : ${test2.n}");
}
const로 객체 생성
const를 붙인 것과 안 붙인 것의 결과는 동일한데 차이점이 뭐지?
const 키워드를 사용하여 객체를 생성할 때와 그렇지 않을 때의 차이점은 다음과 같습니다.
1. const 키워드를 사용하여 객체를 생성할 때:
- 객체는 컴파일 타임에 생성됩니다.
- 동일한 값의 객체가 이미 존재하는 경우, 새로운 객체를 생성하지 않고 기존 객체를 재사용합니다. 즉, 객체의 인스턴스가 유일하게 유지됩니다.
- const 키워드를 사용하여 생성된 객체는 불변(immutable)입니다. 즉, 객체의 속성을 변경할 수 없습니다.
2. const 키워드를 사용하지 않고 객체를 생성할 때:
- 객체는 런타임에 생성됩니다.
- 매번 객체가 생성되며, 동일한 값을 가진 객체라도 별개의 인스턴스가 됩니다.
- 객체의 속성을 변경할 수 있습니다.
따라서, var test1 = const Test(10);은 컴파일 타임에 객체를 생성하고, 동일한 값의 객체가 이미 존재하는 경우에는 재사용합니다. 또한, 생성된 객체는 불변이므로 속성을 변경할 수 없습니다.
반면에 var test2 = Test(20);은 런타임에 객체를 생성하며, 동일한 값을 가진 객체라도 별개의 인스턴스가 됩니다. 이 객체는 속성을 변경할 수 있습니다.
class Test {
final int n; //const생성자를 가지고 있는 경우 변수는 무조건 final로 선언해야 합니다.
const Test(this.n); //const는 본문 {}를 가질수 없는 생성자
}
main() {
var test1 = const Test(10);
var test2 = Test(20);
print("test1.data : ${test1.n}, test2.data : ${test2.n}");
}
출력) test1.data : 10, test2.data : 20
const로 객체를 선언하면 두 값이 같을 때는 객체를 다시생하하지 않고 함께 공유해서 사용하기 때문에 리소스를 절약하면서 객체를 생성할 수 있습니다.
class Test {
final int n; //const생성자를 가지고 있는 경우 변수는 무조건 final로 선언해야 합니다.
const Test(this.n); //const는 본문 {}를 가질수 없는 생성자
}
main() {
var test1 = Test(10);
var test2 = Test(10);
print("${test1 == test2}");//false
var const1 = const Test(10);
var const2 = const Test(20);
print("${const1 == const2}");//true
}
출력)
false
true
By. 유목민 알폰스 - Nomadic Alphonse
'Dart' 카테고리의 다른 글
Dart 18. 상속과 추상 클래스 {유목민 알폰스} (1) | 2023.11.09 |
---|---|
Dart 16. 클래스 생성과 호출 그리고 초기화 {유목민 알폰스} (1) | 2023.11.08 |
Dart 15. 함수와 제어문 {유목민 알폰스} (2) | 2023.11.07 |
Dart 14. 널 안전성 변수선언 {유목민 알폰스} (1) | 2023.11.07 |
Dart 13. 컬렉션 타입 List Set Map {유목민 알폰스} (1) | 2023.11.06 |