● 전체 코드 (강사님 ver.)
더보기
package product;
import java.util.Scanner;
public class ProductsService {
private Products[] prods = new Products[30];
private int cnt; // 제품 개수 카운트 변수
public ProductsService(int size) {
prods = new Products[size]; // size 만큼 방을 만든다.
}
// 새 상품 등록
public void addProduct(Scanner sc) {
if (cnt >= prods.length) { // cnt: 제품수, prods.length: 방의 개수
System.out.println("배열이 다 찼습니다.");
return; // 추가 취소.
}
int idx = 0;
Products p = new Products();
while (idx >= 0) {
System.out.println("num: ");
p.setNum(sc.nextInt());
idx = getByNum(p.getNum()); // 중복:0이상의 값. 중복안됨:-1
}
System.out.println("name: ");
p.setName(sc.next());
System.out.println("route: ");
p.setRoute(sc.next());
System.out.println("sellerId: ");
p.setSellerid(sc.next());
System.out.println("price: ");
p.setPrice(sc.nextInt());
System.out.println("amount: ");
p.setAmount(sc.nextInt());
prods[cnt++] = p; // 배열에 넣은 다음 cnt 1 증가.
}
// 번호 검색 메서드
public int getByNum(Scanner sc) {
System.out.println("검색/수정/삭제할 제품 방 번호:");
int num = sc.nextInt();
// 배열에서 요소를 하나씩 꺼내서 제품번호와 num을 비교해 같은 것 찾음.
for (int i = 0; i < cnt; i++) {
if (prods[i].getNum() == num) {
return i;
}
}
return -1; // 못찾으면 루프 밖으로 나오게 됨.
}
// 파라메터로 검색할 번호 받아서 방 번호 리턴.
public int getByNum(int num) {
for (int i = 0; i < cnt; i++) {
if (prods[i].getNum() == num) {
return i;
}
}
return -1;
}
// 검색해서 출력하는 메서드
public void printProduct(Scanner sc) {
int idx = getByNum(sc);
if (idx < 0) {
System.out.println("없다");
} else {
System.out.println(prods[idx]);
}
}
public void editProduct(Scanner sc) {
System.out.println("수정할 제품 방 번호:");
int idx = getByNum(sc);
if (idx < 0) {
System.out.println("없다");
} else {
System.out.println("수정 전 데이터");
System.out.println(prods[idx]);
boolean flag = true;
while (flag) {
System.out.println("수정할 제품 정보\n1.num 2.name 3.route 4.sellerId 5.price 6.amount 7.종료");
int x = sc.nextInt();
switch (x) {
case 1:
System.out.println("new num: ");
prods[idx].setNum(sc.nextInt());
System.out.println(prods[idx]);
break;
case 2:
System.out.println("new name: ");
prods[idx].setName(sc.next());
System.out.println(prods[idx]);
break;
case 3:
System.out.println("new route: ");
prods[idx].setRoute(sc.next());
System.out.println(prods[idx]);
break;
case 4:
System.out.println("new sellerId: ");
prods[idx].setSellerid(sc.next());
System.out.println(prods[idx]);
break;
case 5:
System.out.println("new price: ");
prods[idx].setPrice(sc.nextInt());
System.out.println(prods[idx]);
break;
case 6:
System.out.println("new amount: ");
prods[idx].setAmount(sc.nextInt());
System.out.println(prods[idx]);
break;
case 7:
System.out.println("수정 종료");
flag = false;
break;
}
}
}
}
// 삭제 메소드
public void deleteProduct(Scanner sc) {
System.out.println("삭제할 제품 방 번호:");
int idx = getByNum(sc);
if (idx < 0) {
System.out.println("없다");
} else {
System.out.println(idx + "번째 방의 제품 정보를 삭제합니다");
for (int i = idx; i < cnt - 1; i++) {
prods[i] = prods[i + 1];
}
cnt--; // 다음에 데이터가 추가되면 마지막 방에 덮어씌워짐.
}
}
public void printAll() {
for (int i = 0; i < cnt; i++) {
System.out.println(prods[i]);
}
}
}
▼ 내 주말 과제~
1. 중복검사
System.out.println("num: ");
int num = sc.nextInt();
for (int i = 0; i < cnt; i++) {
if (num == prods[i].getNum()) {
System.out.println("중복. 다시 입력하세요.");
return;
}
}
-----------------------------------
▽ 짝꿍이 구현한 버전
더보기
public boolean duplicate (int num) {
for (int i = 0; i < cnt; i++) {
if (cnt == 0) { //첫번째에는 통과
return false;
} else if (num == prods[i].getNum) {
System.out.println ("중복입니다. 다시 입력해주세요.");
return true; //중복이면 while문 다시 실행.
}
}
return false; //중복이 아니면 p.setNum 반환.
}
boolean flag = true;
while(flag){
System.out.println("num: ");
p.setNum(Scanner sc);
flag = duplicate(p.getNum());
}
-----------------------------------
▽ 강사님이 구현한 버전
더보기
// 파라메터로 검색할 번호 받아서 방 번호 리턴.
public int getByNum(int num) {
for (int i = 0; i < cnt; i++) {
if (prods[i].getNum() == num) {
return i; //중복 -> while문 다시 돎.
}
}
return -1; //중복 아님.
}
int idx = 0;
Products p = new Products();
while (idx >= 0) {
System.out.println("num: ");
p.setNum(sc.nextInt());
idx = getByNum(p.getNum()); // 중복:0이상의 값. 중복안됨:-1
}
2. 삭제
- 배열값 초기화 대신
prods[cnt] = null; 을 사용하면
삭제한 뒤 배열값들 다시 추가할 때 널포인트오류 뜸 .. 흠
대신 배열값을 초기화하고 다시 배열값을 넣으면
Products [num=2, name=2, route=2, sellerId=2, price=2, amount=2]
Products [num=3, name=3, route=3, sellerId=3, price=3, amount=3]
Products [num=0, name=null, route=null, sellerId=null, price=0, amount=0] << 이렇게 중간에 남음 ㅜ
Products [num=1, name=1, route=1, sellerId=1, price=1, amount=1]
public void deleteProduct(Scanner sc) {
System.out.println("삭제할 제품 방 번호:");
int idx = getByNum(sc);
if (idx < 0) {
System.out.println("없다");
} else {
System.out.println(idx + "번째 방의 제품 정보를 삭제합니다");
prods[cnt] = new Products(); // 배열값 초기화
for (int i = idx; i < cnt; i++) {
prods[i] = prods[i + 1];
}
}
}
-----------------------------------
▽ 강사님이 구현한 버전
더보기
public void deleteProduct(Scanner sc) {
System.out.println("삭제할 제품 방 번호:");
int idx = getByNum(sc);
if (idx < 0) {
System.out.println("없다");
} else {
System.out.println(idx + "번째 방의 제품 정보를 삭제합니다");
for (int i = idx; i < cnt - 1; i++) {
prods[i] = prods[i + 1];
}
cnt--; // 다음에 데이터가 추가되면 마지막 방에 덮어씌워짐.
}
}