생성자 (constructor)

ssh·2023년 12월 3일
0

dart

목록 보기
1/22

생성자

개요

  • “클래스명과 동일 명칭으로, 리턴 값의 타입이 명시되어 있지 않은 메소드"는 생성자로 사용된다.
  • 생성자는 new 에 의한 인스턴스화의 직후에 자동적으로 실행 된다.
  • Dart에서 new는 생략 가능하다.
  • 인수를 가지는 생성자를 정의하면, new 를 할 때에 인수를 지정하여 생성자를 실행할 수 있다.
  • 생성자는 오버로드에 의한 복수 정의가 된다.
  • 클래스에 생성자 정의가 1개도 없는 경우에 한해, 컴파일러가 “인수없음, 처리내용없음"의 기본 생성자를 자동정의 해 준다.
  • class를 선언할 때는 생성자를 가지고 외부에서 파라미터를 받을수도 있고 named constructor를 통해서 파라미터를 받을 수도 있다.
  • 어떤 생성자를 통해서도 instance를 만들 수 있다.

Named Parameter

  • 함수를 정의할 때, 매개변수에 이름을 부여하는 것을 Named Parameter라고 한다.
  • Named Parameter를 정의하려면 {param1: defaultValue1, param2: defaultValue2, ...} 형식으로 정의하면 된다.
  • Named Parameter에는 기본값을 지정할 수 있으며, 기본값을 지정하지 않으면 필수적으로 전달되어야 한다.
  • 함수를 호출할 때 콜론으로 매개변수의 이름을 지정한다.
  • 전달받은 파라미터는 중괄호로 묶어 사용한다.
  • Dart는 null safety로 인해 함수로 넘어오는 파라미터가 null 이면 안된다.
  • 따라서 함수에 정의된 파라미터대로 넘어오지 않더라도, default value를 지정하여 null 이 발생하지 않도록 하거나, required를 이용하여 컴파일되지 않도록 할 수 있다.

Named Parameter default value 지정 방법

// 파라미터를 중괄호로 묶음
class Human {
  String name;
  int age;

  Human({
    this.name = '',
    this.age = 0,
  });

  
  String toString() {
    return 'Human {name: $name, age: $age}';
  }
}

// 매개변수의 이름을 지정
void main() {
  Human human = Human(name: 'ssh', age: 26);
  print(human.name);
  print(human.age);
}

// 함수를 호출할 때 콜론으로 매개변수의 이름을 지정한다. 전달받은 파라미터는 중괄호로 묶어 사용한다.

Named Parameter required 사용 방법

// 파라미터를 중괄호로 묶음
class Human {
  String name;
  int age;

  Human({
    required this.name,
    required this.age,
  });

  
  String toString() {
    return 'Human {name: $name, age: $age}';
  }
}

// 매개변수의 이름을 지정
void main() {
  Human human = Human(name: 'ssh', age: 26);
  print(human.name);
  print(human.age);
}
 
// 함수를 호출할 때 콜론으로 매개변수의 이름을 지정한다. 전달받은 파라미터는 중괄호로 묶어 사용한다.

예제

클래스 정보

Human 클래스

  • String name;
  • int age;

Student 클래스 Human 상속

  • String studentNo; // 학번
  • String? subject; // 과목

Professor 클래스 Human 상속

  • String major; //전공 - 필수

main() - 메서드 main() 있는 클래스에 작성

  1. 이름, 나이, 학번 을 전달받아 ‘학생’객체를 생성하고, Human 타입을 리턴하는 ‘createStudent()’메서드를 만들고, 리턴받은 데이터로 - 학생정보 [ name: messi / age: 35 / studentNo: S01 / subject: ‘’ ] 형식을 출력하시오.
  2. 이름, 나이, 전공 을 전달받아 ‘교수’객체를 생성하고, Human 타입을 리턴하는 ‘createProfessor()’메서드를 만들고, 리턴받은 데이터로 - 교수정보 [ name: peb / age: 52 / major: ‘foorboll’ ] 형식을 출력하시오.

Human class

class Human {
  String name; // 이름
  int age; // 나이

  Human({
    required this.name,
    required this.age,
  });

  
  String toString() {
    return 'Human{name: $name, age: $age}';
  }
}

Student class

import 'human.dart';

class Student extends Human {
  String stdNo; // 학번
  String? subject; // 과목

  Student({
    required super.name,
    required super.age,
    required this.stdNo,
     this.subject,
  });

  // name: messi / age: 35 / studentNo: S01 / subject: ‘’
  
  String toString() {
    return '학생정보 [ name: $name / age: $age / stdNo: $stdNo / subject: ${subject ?? ''} ]';
  }
}

Professor class

import 'human.dart';

class Professor extends Human {
  String major; // 전공

  Professor({
    required super.name,
    required super.age,
    required this.major,
  });

  // name: peb / age: 52 / major: ‘foorboll’
  
  String toString() {
    return '교수정보 [ name: $name / age: $age / major: $major ]';
  }
}

void main()

import 'package:basic/temp/professor.dart';
import 'package:basic/temp/student.dart';
import 'human.dart';

void main() {

  // 이름, 나이, 학번 을 전달받아 ‘학생’객체를 생성
  Human h1 = createStudent(name: 'messi', age: 35, stdNo: 'S01');

  // 리턴받은 데이터로 - 학생정보 [ name: messi / age: 35 / studentNo: S01 / subject: ‘’ ] 형식을 출력
  print(h1.toString());

  // 이름, 나이, 전공 을 전달받아 ‘교수’객체를 생성
  Human h2 = createProfessor(name: 'peb', age: 52, major: 'foorboll');

  // 리턴받은 데이터로 - 교수정보 [ name: peb / age: 52 / major: ‘foorboll’ ] 형식을 출력
  print(h2.toString());
}

// Human 타입을 리턴하는 ‘createStudent()’메서드
Human createStudent(
    {required String name, required int age, required String stdNo}) {
  return Student(name: name, age: age, stdNo: stdNo);
}

// Human 타입을 리턴하는 ‘createProfessor()’메서드
Human createProfessor(
    {required String name, required int age, required String major}) {
  return Professor(name: name, age: age, major: major);
}

마치며

자바에서 쓰던 생성자 구조와 달리 dart는 함수의 매개변수에 이름을 부여하는 Named Parameter를 사용할 수 있다.
Named Parameter는 함수 호출 시 매개변수를 직관적으로 전달할 수 있고 함수의 가독성과 확장성을 향상해 주는 장점이 있다.
dart에서는 required를 사용해 좀 더 직관적인 코딩이 가능하고 에러 또한 줄일 수 있으므로 자주 쓰면서 익숙해져야겠다.

0개의 댓글

관련 채용 정보