플러터 – named constructor

  • by

이 기사는 (Do it!
강삼의 플러터 & 다트 프로그래밍)의 내용을 발췌한 것입니다.



책의 모든 내용을 저자의 직강에서 실시한 강의는 ssamz.com에서 들을 수 있습니다.

다트 언어에서는 클래스 생성자를 다양하게 사용할 수 있습니다.

명명된 생성자는 이름이 있는 생성자라는 의미에서 한 클래스에 이름이 다른 생성자를 여러 선언하는 기법입니다.

다른 프로그래밍 언어도 여러 생성자를 선언할 수 있는 오버로드 기능을 제공하지만 같은 이름으로 매개변수와 반환 유형만 다르게 선언해야 하기 때문에 다트와 차이가 있습니다.


예를 들어, 다음 코드는 Java 언어로 생성자 오버로드를 구현한 예입니다.

그러나 다트는 이러한 오버로드를 지원하지 않습니다.

대신 다른 기술로 여러 생성자를 선언할 수 있습니다.

public class MyClass {
	MyClass() {}
	MyClass(int data1) {}
	MyClass(int data1, int data2) {}
}

명명된 생성자는 한 클래스에 다른 이름을 지정하여 여러 생성자를 정의하는 기술입니다.

즉, 다트에서는 클래스와 같은 이름뿐만 아니라 다른 이름으로 생성자를 만들 수 있습니다.

명명된 생성자는 클래스와 생성자 이름을 점(.)으로 연결하여 만듭니다.


한 클래스에 클래스와 같은 이름의 생성자를 하나만 정의할 수 있지만 명명된 생성자는 클래스와 다른 이름으로 여러 정의할 수 있습니다.

class MyClass {
	MyClass() { }
	MyClass.first() { }
	MyClass.second() { }
}

이렇게 선언한 명명된 생성자에서 객체를 만드는 코드는 오른쪽과 같습니다.

var obj1 = MyClass();
var obj2 = MyClass.first();
var obj3 = MyClass.second();

this()로 다른 생성자를 호출합니다.

한 클래스에서 여러 생성자를 선언하면 생성자에서 다른 생성자를 호출해야 할 수도 있습니다.

이것에 의해, 오브젝트의 작성시에 생성자 가 중첩되어 불려 갑니다.


예를 들어, 오른쪽과 같이 기본 생성자 MyClass()와 명명된 생성자 MyClass.first()를 선언하고 MyClass.first()가 호출될 때 MyClass()도 실행하고 싶습니다.

이 때, this() 구문을 이용하면 됩니다만, this() 는 constructor 의 {} 안쪽의 본문에 작성할 수 없습니다.

class MyClass {
	MyClass(int data1, int data2) {
		print('MyClass() call....');
	}
	MyClass.first(int arg) {
		this(arg, 0); // 오류
	}
}

다른 생성자를 호출하는 this() 는 생성자 콜론(:)의 오른쪽 초기화 목록에 기록해야 합니다.

그러나 초기화 목록에 this() 호출 문을 작성하면 생성자 본문을 작성할 수 없습니다.

따라서 다음과 같이 본문 영역을 나타내는 {}을 작성하면 오류가 발생합니다.

class MyClass {
	MyClass(int data1, int data2) {
		print('MyClass() call....');
	}
	MyClass.first(int arg) : this(arg, 0) { } // 오류
}

다음은 명명된 생성자가 호출될 때 this() 에서 기본 생성자를 호출하는 올바른 코드입니다.

class MyClass {
	MyClass(int data1, int data2) {
		print('MyClass() call....');
	}
	MyClass.first(int arg) : this(arg, 0); // 성공
}

this() 를 사용하는 경우 다른 규칙은 this() 호출 문 이외의 구문을 사용할 수 없습니다.

즉, 콜론의 오른쪽에는 this()만을 만들어야 합니다.

MyClass.first(int arg) : this(arg, 0), this.data1=arg1; // 오류

또한 클래스에 생성된 명명된 생성자도 this()로 호출할 수 있습니다.

this.first() 와 같이 this 뒤에 생성자 이름을 붙이십시오.

class MyClass {
	late int data1;
	late int data2;
	MyClass(this.data1, this.data2);
	MyClass.first(int arg) : this(arg, 0); // 기본 생성자(MyClass) 호출
	MyClass.second() : this.first(0); // 명명된 생성자(MyClass.first) 호출
}



책의 모든 내용을 저자의 직강에서 실시한 강의는 ssamz.com에서 들을 수 있습니다.