생성자
1. 기본 생성자 - default constructor
: (이름이 없는 생성자)
※ 이름이 없는 생성자는 단 하나만 만들 수 있다!
2. 이름이 있는 생성자 - Named constructor
: 다트에서는 오버로딩이라는 기능이 없다!
3. 초기화 리스트 - Initializer list
4. 리다이렉 생성자 - Redirecting constructor
5. 상수 생성자 - Constant constructor
6. 팩토리 생성자 - Factory constructor
기본 생성자 & 이름이 있는 생성자
void main (){
Person person1 = Person();
Person person2 = Person.init();
Person person3 = Person.ageInit(100);
print(person1);
print(person2);
print(person3);
}
class Person{
var name;
var age;
// 이름이 없는 생성자
// 주의 ! 이름이 없는 생성자는 단 하나만 만들 수 있다.
Person(){
}
//이름이 있는 생성자
Person.init(){
this.name = '홍길동';
this.age = 1;
}
// 이름이 있는 생성자
Person.ageInit(this.age);
@override
String toString() {
return 'Person{name: $name, age: $age}';
}
}
초기화 리스트
- 초기화 리스트를 사용하면 생성자의 구현부가 실행되기 전에
인스턴스 변수를 초기화 할 수 있다.
(인스턴스 변수 초기화 대상 - 부모 클래스 / this)
-생성자 옆에 :(콜론)으로 선언 가능하다.
1) 생성자 : 초기화 리스트 { }
2) 생성자 : 변수명 = 값 { } ex) Person () : name = '홍길동' { }
void main() {
Person p1 = Person();
Person p2 = Person.init(); // 이름이 있는 생성자 호출
print(p1.name);
print(p2.name + " : ${p2.age}");
}
class Person {
var name;
var age;
Person() : name = '홍길동'; //이것도 가능
// Person( ) : name = '홍길동'{}
// 이름이 있는 생성자 + 초기화 리스트
Person.init() : age = 10 {
this.name = '홍길동';
}
}
리다이렉 생성자 - Redirecting constructor
- 생성자에서 다른 생성자를 호출하는 것
- 초기화 리스트를 약간 응용 하면서 단순히 리다이렉팅을 위한 생성자를 만들 수 있다.
- 이러한 생성자는 본체가 비어있고, 메인 생성자에게 위임(delegate) 하는 역할을 한다.
void main() {
Person person = Person.init("티모");
print(person);
print(person.name);
print(person.age);
}
class Person {
var name;
var age;
Person(this.name, this.age) {
print("this is Person ${name} , ${age}");
}
// 초기화 리스트를 활용한 리다이렉팅 생성자
Person.init(String name) : this(name, 20);
}
[상수 생성자] - Constant constructor
-상수 생성자는 말 그대로 상수처럼 만들어 준다.
이 말은 해당 클래스가 상수처럼 변하지 않는 객체를 생성한다는 것!
(즉, .(점)연산자로 들어가서 객체의 값을 변경 할 수 없게 하는 것)
상수 생성자를 만들기 위해서 인스턴스 변수가 모두 final이어야 한다.
또한 생성자는 const 키워드가 붙어야 한다.
void main (){
Person person1 = const Person('kim', 20);
print(person1);
// 런타임 시점에 한번 값이 정해지면 상수로 확정
//person1.age = 100; // 오류 발생
}
class Person {
// final --> 데이터 타입 명시 !(var로 불가함)
final String name;
final int age;
// 상수 생성자
const Person(this.name, this.age);
@override
String toString() {
return 'Person{name: $name, age: $age}';
}
}
Person person1 = const Person('kim', 20);
Person person2 = const Person('kim', 20);
Person person3 = new Person('kim', 20);
Person person4 = Person('kim', 20);
Person person5 = const Person('hong', 100);
★ Dart에서 주소값을 비교할 수 있는 함수 --> identical
// 상수풀 원리와 비슷함
print(identical(person1, person2));
print(identical(person3, person4));
print(identical(person1, person4));
print(identical(person5, person1));
// new로(생략가능) 새로 객체를 만들면 서로 다른 객체임!
// 현재 객체로 생성된 Person은 총 4개
추상 클래스-abstract
다트에서도 추상 클래스가 존재한다.
추상 메서드를 가질 수 있는 클래스 (필수는 아님!)
일반 클래스에서는 추상 메서드를 가지고 싶어도 가질 수 없다.
미완성된 메서드 (선언부만 있고, 바디가 없는 메서드)
따라서, 추상 클래스도 미완성 클래스이고 인스턴스 할 수 없다.
>>>결론<<<
일반적으로 new 할 수 없는 녀석
추상 메서드를 가질 수 있는 녀석 (필수 조건은 아님)
참조형 변수 타입으로 사용 가능 (데이터 타입으로 선언 가능)
추상 클래스를 사용할 때는 extends와 implements 키워드를 모두 사용 가능하나
extends
|
상속을 받기 때문에, 추상 메서드만 오버라이드 된다.
|
implements
|
기능 구현을 하기 위함으로 모든 메서드가 오버라이드 된다.
|
void main() {
Car aiCar = AICar();
aiCar.run();
}
abstract class Car {
drive();
stop();
void startCar() {
print('시동을 켭니다');
}
void turnOff() {
print('시동을 끕니다');
}
run() {
// 다트에서는 메서드에 final이 안된다
startCar();
drive();
stop();
turnOff();
}
}
class AICar extends Car {
@override
drive() {
print('운전합니다');
}
@override
stop() {
print('브레이크로 자동 멈춤');
}
}
class MenualCar implements Car{
@override
drive() {
}
@override
run() {
}
@override
void startCar() {
}
@override
stop() {
}
@override
void turnOff() {
}
}
'개발일지 > Dart' 카테고리의 다른 글
매개변수(옵셔널 변수(optional parameter) (0) | 2022.11.09 |
---|---|
제네릭, Isolate (0) | 2022.11.08 |
Dart (접근제어 지시자, getter / setter, 상속 & 다형성, Maxin(with), 생성자) (0) | 2022.11.07 |
Collections, List, Set, Map (0) | 2022.11.07 |
do while, break, continue, Switch and Case, (0) | 2022.11.06 |
댓글