본문 바로가기



Dart 17. 명명된 생성자와 상수 생성자 {유목민 알폰스}



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