본문 바로가기
2023년 부터/Flutter

Dart - 클래스와 객체

by JeongUPark 2023. 10. 19.
반응형

클래스와 객체는 자바와 같고 특이한 정은 초기화나 명명된 생성자, 팩토리 생성자 등이다.

  • 초기화 목록이라는 것이있다. 이를 사용하면 아래와 같이 클래스를 초기화 할 수 있다.
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
반응형