Code/Flutter

Dart 클래스와 객체, late, cascade(..)

하말 ⍺ 2023. 10. 11. 02:23
반응형

* 해당 글은 '나무위키'와 책 '내일은 플러터'의 내용을 요약 정리 하였습니다.

클래스 Class

// class + 클래스명 {}
class Person {
  // 변수의 속성을 선언
  // 초기값을 정하지 않으면 타입뒤에 ? 넣어준다.
  // 혹은 late를 앞에 쓰면, 인스턴스가 생성된 후에 값을 할당 할 수 있다.
  String? name;
  late int age;

  // 생성자 선언 required 선언하면 class를 불러올때 꼭 값을 넣어줘야한다.
  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  // 클래스 메소드
  void sayHello() {
    print("Hello, my name is $name and I'm $age years old.");
  }
}

// output
// Hello, my name is Kim and I'm 22 years old.
// 일부 책들에선 인스턴스 생성시 초기값을 지정하지 않거나,
// late 혹은 ? 를 적용하지 않은데 dart 최신버전에선 그러면 코드가 돌아가지 않는다.
// String band; X   late String brand; O   String? brand; O
class Car {
  // String name; 실행안됨
  late String brand;
  int? price;
}

void main() {
  Car car1 = Car();
  car1.brand = 'Tesla';
  car1.price = 5000;

  Car car2 = Car();
  car2.brand = 'BMW';
  car2.price = 5000;

  print("Car 1: ${car1.brand}, ${car1.price} dallars");
  print("Car 2: ${car2.brand}, ${car2.price} dallars");
}

// output
// Car 1: Tesla, 5000 dallars
// Car 2: BMW, 5000 dallars

 

메서드 Method

  • 메서드는 클래스의 기능과 동작을 구현하는데 사용
  • 클래스는 메서드를 사용하여 특정 동작을 정의, 해당 동작을 여러번 호출 할 수 있다.
  • 메서드는 클래스의 내부에 저장되며 이름, 매개변수, 반환 값 등을 가질 수 있다.
  • 객체가 가지고 있는 데이터나 상태를 변환하거나 변경 할 수 있다.
// 메소드 기본형태
// void는 반환 값이 없는 리턴타입
// returnType methodName(parameters) {
// 	// method body
//     }

 

late 연산자

  • late 연산자를 사용하여 선언된 변수는 선언 시점에 초기 값을 할당하지 않아도 된다. 대신, 변수를 사용하기 전에 반드시 초기화해야 한다.
  • late 연산자를 사용하는 변수는 Non-nullable 타입

 

cascade 연산자 ..

  • 객체의 연속적인 작업을 처리하기 위해 사용되는 특수한 연산자로 ".." 이중 점 기호로 표시.
  • 객체의 메소드나 속성에 연속적으로 접근하거나 설정하는 작업을 한 줄로 표현
  • 동일한 객체에 대해 여러 개의 작업을 연속적으로 수행
  • 코드가 간결하고 가독성이 높아짐
  • 객체 초기화에서는 사용할 수 없다.
class Product {
  String? name;
  int? quantity;

  Product(this.name, this.quantity);

  void printDetails() {
    print("Product: $name, Quantity: $quantity");
  }
}

class Order {
  List<Product> products = [];

  // 반환타입이 Order로 되어 있어야 cascade를 사용할 수 있다.
  Order addProduct(String name, int quantity) {
    var product = Product(name, quantity);
    products.add(product);
    return this;
  }

  
  void printOrderDetails() {
    print('Order Details:');
    for (var product in products) {
      product.printDetails();
    }
  }
}

// cascade 연산자로 메서드 체이닝 구현
void main() {
  var order = Order()
    ..addProduct('Apple', 2)
    ..addProduct('Banana', 3);
    // printOrderDetails 의 반환 타입은 void인데도 된다? 왜지?
  order.addProduct('Orange', 1)..printOrderDetails();
}

/* output
Order Details:
Product: Apple, Quantity: 2
Product: Banana, Quantity: 3
Product: Orange, Quantity: 1
*/

'Code > Flutter' 카테고리의 다른 글

dart null safty  (6) 2024.09.02
dart 객체, 클래스, 인스턴스  (1) 2024.09.02
Dart 리스트, 맵  (1) 2023.10.09
Dart 반복문, 함수, 전역변수  (1) 2023.10.08
Dart 변수와 타입, 연산자, 제어문, 조건문  (0) 2023.10.07