Christmas Pikachu 생성자, 추상 클래스
개발일지/Dart

생성자, 추상 클래스

ZI_CO 2022. 11. 8.

생성자

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() {
  }

}

댓글