AR삽질러

Dart Class - (6) 본문

Dart

Dart Class - (6)

아랑팡팡 2023. 9. 4. 20:55
728x90

 

Dart Class

Class는 객체지향프로그래밍(OOP)에서 핵심적인 개념으로 데이터와 해당 데이터를 조작하는 함수를 하나로 묶어 표현하는 방법이다.
Class는 동일한 Class로 생성된 Object(객체)객체들은 클래스의 맴버변수와 메서드를 공유한다.

 

 - Function에서 Variable을 사용할때 var를 사용하면 타입을 명시할 필요가 없었지만

 - Class에서는 property를 선언할때 반드 타입을 사용해 정의한다. 

 

 

0. Class Definition(클래스 정의)

class Intro {
  String name = '아랑';
  int age = 25;
}

void main() {
  var intro = new Intro();
  print(intro.name); // 아랑
  intro.name = '랑랑';
  print(intro.name); // 랑랑
}

 - Class를 정의할때는 앞에 'class' 키워드를 사용한다.

 - Class 내부에는 맴버변수와 메서드를 정의할 수 있다.

 

정의된 Intro 클래스에는 name과 age 두개의 맴버 변수를 가지고 있다.

main()함수에서 Intro클래스의 인스턴스를 생성해 name을 출력한다.

 

class Intro {
  final String name = '아랑';
  int age = 25;
  void sayHello() {
    print("안녕하세요. 저의 이름은 $name 입니다.");
  }
}

void main() {
  var intro = new Intro();
  intro.sayHello(); // 안녕하세요. 저의 이름은 아랑 입니다.
  // intro.name = '랑랑';
  // print(intro.name); // 랑랑
}

맴버변수앞에 final 키워드를 붙이게되면 더 이상 값을 수정할 수 없다.

void sayHello() 함수 : 클래스 내부에서 사용되는 함수로 "안녕하세요. 저의 이름은 ${name} 입니다." 를 출력하게 되는데 $name은 메서드에 속해있는 클래스의 name변수 값을 사용하게된다.

 

 

1. Constructors(생성자)

lage키워드사용

class Intro {
  late String name;
  late int age;

  Intro(String name, int age) {
    this.name = name;
    this.age = age;
  }

  void sayHello() {
    print("안녕하세요. 저의 이름은 $name이고 나이는 $age입니다.");
  }
}

void main() {
  var intro = Intro("아랑", 25);
  intro.sayHello(); // 안녕하세요. 저의 이름은 아랑이고 나이는 25입니다.
  var intro2 = Intro("아린", 16);
  intro2.sayHello(); // 안녕하세요. 저의 이린이고 나이는 16입니다.
}

 - Intro클래스 : name, age 맴버변수에 late키워드를 선언하여 나중에 값을 할당할 수 있도록 한다.

 - Intro클래스 내부에 Introto생성자를 정의해 name, age를 받아 객체를 초기화 할 수 있도록 한고 this.name = name, this.age = age를 사용해 매개변수로 받은 값을 맴버 변수에 할달한다.

 - sayHello() 메서드를 정의해 name, age가 지정된 자리에서 출력되도록한다.

 

late키워드를 사용하지 않고 생성자를 사용

class Intro {
  String name;
  int age;

  Intro(this.name, this.age);

  void sayHello() {
    print("안녕하세요. 저의 이름은 $name이고 나이는 $age입니다.");
  }
}

void main() {
  var intro = Intro("아랑", 25);
  intro.sayHello(); // 안녕하세요. 저의 이름은 아랑이고 나이는 25입니다.
  var intro2 = Intro("아린", 16);
  intro2.sayHello(); // 안녕하세요. 저의 이린이고 나이는 16입니다.

  print(intro.name);
  print(intro2.name);
}

 - Intro클래스 정의 : name, age 맴버변수 선언후 late키워드를 사용하지 않고 Intro클래스에서 기본 생성자를 정의한다. name, age 맴버변수를 초기화하고 직접 name, age 변수를 초기화한다.

 

2. Named Constructor Parameters

class Intro {
  String name;
  int age;
  String hobby;
  int grade;

  Intro(this.name, this.age, this.hobby, this.grade);

  void sayHello() {
    print("안녕하세요. 저의 이름은 $name이고 나이는 $age입니다. 그리고 취미는 $hobby이고 $grade학년입니다.");
  }
}

void main() {
  var intro = Intro("아랑", 25, "보드", 4);
  intro.sayHello(); // 안녕하세요. 저의 이름은 아랑이고 나이는 25입니다. 그리고 취미는 보드이고 4학년입니다.
  var intro2 = Intro("아린", 16, "농구", 6);
  intro2.sayHello(); // 안녕하세요. 저의 이름은 아린이고 나이는 16입니다. 그리고 취미는 농구이고 6학년입니다.
}

 - 이전 Constructor에서는 Function처럼 변수의 순서를 지켜줘야한다.

 

class Intro {
  String name;
  int age;
  String hobby;
  int grade;

  Intro({this.name, this.age, this.hobby, this.grade});

  void sayHello() {
    print("안녕하세요. 저의 이름은 $name이고 나이는 $age입니다. 그리고 취미는 $hobby이고 $grade학년입니다.");
  }
}

void main() {
  var intro = Intro(
    name: "아랑",
    age: 25,
    hobby: "보드",
    grade: 4,
  );
  intro.sayHello(); // 안녕하세요. 저의 이름은 아랑이고 나이는 25입니다. 그리고 취미는 보드이고 4학년입니다.
}

 - Named Parameters를 이용하여 클래스의 생성자를 정의

 - { }중괄호를 이용해 Named Parameters를 사용하여 생성자를 호출할때 어떤값이 어떤 매개변수에 대응되는지 표현할 수 있다.

 

3. Named Constrictors

 - Named Constrictors는 함수나 메서드를 호출 할때 매개변수의 이름을 지정해 전달하는 기능을 갖는다.

class Intro {
  final String name;
  int age, grade;
  String hobby;

  Intro({
    required this.name,
    required this.age,
    required this.hobby,
    required this.grade,
  });

  Intro.create1({required String name, required int age})
      : this.age = age,
        this.name = name,
        this.hobby = '보드',
        this.grade = 4;

  Intro.create2({required String name, required int age})
      : this.name = name,
        this.age = age,
        this.hobby = "농구",
        this.grade = 6;

  void sayHello() {
    print("안녕하세요. 저의 이름은 $name이고 나이는 $age입니다. 그리고 취미는 $hobby이고 $grade학년입니다.");
  }
}

void main() {
  var intro = Intro.create1(
    name: "아랑",
    age: 25,
  );
  intro.sayHello();

  var intro2 = Intro.create2(
    name: "아린", // 안녕하세요. 저의 이름은 아랑이고 나이는 25입니다. 그리고 취미는 보드이고 4학년입니다.
    age: 16,
  );
  intro2.sayHello(); // 안녕하세요. 저의 이름은 아린이고 나이는 16입니다. 그리고 취미는 보드이고 4학년입니다.
}

 - Intro클래스의 생성자 : name, age, hobby, grade

create1 : name, age 매개변수를 필수로 받고 hobby와 grade는 초기값을 설정하여 값이 없을경우 기본값으로 설정한다.

create2 : name, age 매개변수를 필수로 받고 hobby와 grade는 초기값을 설정하여 값이 없을경우 기본값으로 설정한다.

 

 

클래스의 생성자를 활용해 JSON데이터 인스턴스생성과 메서드호출 예제

class Intro {
  final String name;
  int age;
  String hobby;

  Intro.fromJson(Map<String, dynamic> introJson)
      : name = introJson['name'],
        age = introJson['age'],
        hobby = introJson['hobby'];

  void sayHello() {
    print("안녕하세요. 저는 $name이고 나이는 $age입니다. 그리고 취미는 $hobby입니다.");
  }
}

void main() {
  var apiDate = [
    {
      "name": "아랑",
      "age": 25,
      "hobby": "보드"
    }, // 안녕하세요. 저는 아랑이고 나이는 25입니다. 그리고 취미는 보드입니다.
    {
      "name": "아린",
      "age": 16,
      "hobby": "농구"
    }, // 안녕하세요. 저는 아린이고 나이는 16입니다. 그리고 취미는 농구입니다.
    {
      "name": "아리",
      "age": 11,
      "hobby": "스키"
    }, // 안녕하세요. 저는 아리이고 나이는 11입니다. 그리고 취미는 스키입니다.
  ];
  apiDate.forEach((introJson) {
    var intro = Intro.fromJson(introJson);
    intro.sayHello();
  });
}

 - Intro클래스 : final name, age, hobby 필드

 - fromJson생성자 : JSON데이터를 받아 인스턴스를 초기화한뒤 JSON데이터는 각 필드의 인스턴스 맴버필드에 할당된다.

 - main함수에서 apiData.foEach로 JSON 객체를 순회하여 Intro.sayHello()생성자를 호출해 출력한다.

 

 

728x90
반응형
LIST

'Dart' 카테고리의 다른 글

Dart 기초 - Dart와 Flutter (0)  (0) 2024.04.24
Dart Class2 - (7)  (0) 2023.09.08
Dart Typedef - (5)  (0) 2023.09.02
Dart Functions - (4)  (0) 2023.09.02
Dart DataTypes - (3)  (2) 2023.08.28