[TIL-007] Dart로 콘솔 쇼핑몰 만들기-2

2025.03.10 - [TIL(Today I Learned)] - [TIL-006] Dart로 콘솔 쇼핑몰 만들기-1

 

[TIL-006] Dart로 콘솔 쇼핑몰 만들기-1

개요Flutter로 진짜 쇼핑몰을 만들면 좋겠지만, 아직은 잘 알지 못하는 관계로 불가능하다.대신 Dart언어에 익숙해지기 위해 콘솔에 값을 입력하여 진행되는 간단한 프로그램을 만들고자 한다. 기

skyhyunjinlee.tistory.com

 

문제 발생

class Product {
  String name;
  int price;

  Product({required this.name, required this.price});

  @override
  String toString() {
    return 'Product {name: $name, price: $price}';
  }
}

class ShoppingMall {
  int totalPrice = 0;
  List<Product> products = [];
  Map<Product, int> cart = {};

  void init() {
    List<Map<String, Object>> lists = [
      {'name': 'shirt', 'price': 10000},
      {'name': 'suit', 'price': 80000},
      {'name': 'jeans', 'price': 30000},
      {'name': 'shoes', 'price': 40000},
      {'name': 'tie', 'price': 10000},
    ];

    for (var list in lists) {
      products.add(
        Product(name: list['name'] as String, price: list['price'] as int),
      );
    }
  }

  void addToCart() {
    String productInput = stdin.readLineSync()!;
    List<Product> findProduct =
        products.where((product) => product['name'] == productInput).toList();
  }
}

void main() {
  var shop = ShoppingMall();
  shop.init();
}

 

 

빨간 줄 Error

 

Error 설명

 

`where()`의 콜백함수의 인자인 `product`의 타입은 `Product`클래스의 인스턴스이다. 즉, 객체라는 말.

객체의 속성에 접근하기 위해 `product['name']`을 사용했지만 접근할 수가 없는 문제 발생.

 

발생 이유 추측

전혀 이유를 알 수가 없었다. 기본 문법 강의도 봤지만 객체에 접근하기 위해서 저렇게 사용하는 것은 당연했다.

그래도 문제를 해결해야 하므로 방법을 찾아보았다.

 

시도 방법

[ ] 연산자를 새롭게 정의

자세히는 모르겠지만 클래스 생성자에 의해 생성된 인스턴스는 `[ ]`연산자로 속성에 접근하는 것이 불가능한 것 같았다.

class MyObject {
  Map<String, dynamic> _data = {};

  operator [](String key) => _data[key];
  operator []=(String key, value) => _data[key] = value;
}

void main() {
  MyObject myObject = MyObject();
  myObject['name'] = 'John';
  myObject['age'] = 30;

  print(myObject['name']); // Output: John
  print(myObject['age']); // Output: 30
}

 

위 코드를 사용하면 되는 것 같지만, 코드 자체를 이해할 수가 없었다.

내가 이해하지 못하는 코드로 해결하고 싶지 않아서 다른 방법을 찾아보았다.

 

인스턴스.property

생각해보니 객체의 속성에 접근하는 방법은 또 있었다.

`객체.property`였다.

 

 

놀랍게도 `product.name`으로 접근을 하니 에러가 해결이 됐다.

 

결과(느낀 점)

알고 있는 방법으로 해결은 했지만, 왜 그런지 이해가 가지 않아 다시 조사해봤다.

  • Map으로 만든 객체
    • `객체.property` 사용 불가
    • `객체['property']` 사용
  • 클래스로 만든 객체
    • `객체.property` 사용
    • `객체['property']` 사용 불가

 

Map으로 만든 객체에서 `객체.property`를 사용하면 getter를 호출한다. 그래서 에러가 발생한다.

속성과 값만 할당하는게 아니라 getter를 정의해야만 에러가 발생하지 않는 것 같다.

 

앞으로 `Map`타입으로 만든 객체는 '맵' 이라고 부르고,

클래스로 만든 인스턴스를 '객체' 라고 불러야 겠다.