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();
}
`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`타입으로 만든 객체는 '맵' 이라고 부르고,
클래스로 만든 인스턴스를 '객체' 라고 불러야 겠다.
'TIL(Today I Learned)' 카테고리의 다른 글
[TIL-009] Dart 실전 문법 파헤치기 - Cascade 연산자 (0) | 2025.03.14 |
---|---|
[TIL-008] Dart 실전 문법 파헤치기 - 타입 변환 메서드 (0) | 2025.03.12 |
[TIL-006] Dart로 콘솔 쇼핑몰 만들기-1 (0) | 2025.03.10 |
[TIL-005] Flutter 위젯 생명 주기(Widget Life Cycle) (0) | 2025.03.07 |
[TIL-004] 내가 Dart, Flutter 중에 무엇을 사용하고 있는 것일까? (0) | 2025.03.06 |