문제 해결
첫번째 코드에서 products라는 배열을 구성했고, String Pname, int Pprice로 구성되어있습니다. 저 배열을 이용해서 아래의 코드에서 키보드 입력과 비교해서 배열이 Pname과 같은 것을 찾고 그 물건의 Pprice를 찾고 총가격(totalPrice)에 추가하는 방식을 구성했다.
아래는 완성한 코드의 문제였던 일부를 가져온것이다.
List<Product> products = [
Product("셔츠", 45000),
Product("원피스", 30000),
Product("반팔티", 35000),
Product("반바지", 38000),
Product("양말", 5000),
];
String? inumber = stdin.readLineSync()!;
Product product =
products.firstWhere((product) => product.Pname == inumber);
if (products.any((products) => products.Pname == inumber) == false) {
print("입력값이 올바르지 않아요1");
} else {
int? sdnumber = int.parse(stdin.readLineSync()!);
if (sdnumber <= 0) {
print("입력값이 올바르지 않아요2");
} else {
totalPrice += (product.Pprice * sdnumber);
print("장바구니에 상품이 담겼어요");
}
}
여기서 막혔던것이 물건을 입력할때 물건이 있는 것인지 확인하는 방법과 그 물건의 가격을 이용한는 것이었다. 처음에는 List<Product>가 보통은 <>안에 배열의 자료형이 들어가 있는데 여기서는 Product로 되어있어서 어려웠는데, 도움을 받아서 Product를 만들었다. 이후에 저기서 어떻게 값을 찾아야할지 생각을 많이 해보았다.
Product product =
products.firstWhere((product) => product.Pname == inumber);
위의 문장을 보자. 완전히 갈피를 못잡아서 여러가지 함수는 다 사용해봤지만 접근하는 방식이 틀렸었다.
먼저 firstWhere는 요소를 반복하고 주어진 조건의 첫 번째 요소를 반환한다. 이를통해 products에 firstWhere를 통해서 변수 product는 키보드로 입력한 inumber와 product.Pname(prodcut의 상품이름인 Pname)에 일치하는 것이 있는지 확인하고 반환했다. firstWhere는 요소가 중복되더라도 첫번째 일치한 요소를 이용하기 때문에 간단하게 중복해서 요소를 사용하지 않는 이번 코드에서는 사용할 수 있다. 하지만 중복된 요소가 존재하게 된다면 firstWhere을 사용하기에는 무리가 있을 것 같다.
print(product);를 해보면 Instance of 'Product'가 출력되는데, 저렇게 출력되는 것 때문에 헷갈려서 진행을 더 못한것이 있는데, 생각을 해보면 저렇게 출력되는 이유가 Product("셔츠", 45000)처럼 어느 하나의 값을 출력할 수 없이 그저 저런 인스턴스로 되어 있기 때문인것같다. 그래서 안에 있는 값을 출력하기위해서는 product.Pname, product.Pprice 로 특정해야 하는 것 같다. 저런 것을 알지 못해서 혼자 끙끙거렸는데 다음부터는 바로 질문을 해야겠다. 왜냐하면 검색을 하더라고 정보가 잘 안보여서 혼자 해결하기에는 굉장히 어려울 거 같다.
그래서 저렇게 Product의 인스턴스를 특정하고 product.요소이름? 이런식으로 사용하면 금방 해결할 수 해결할 수 있다는 것을 배웠다. 오래 고민했기 때문에 다음에 사용한다면 바로 기억 할 수 있을 거같다.
저부분을 죄외하면 다른 것을 조건문과 반복문을 잘 이용하면 쉽게 해결 할 수 있었다.