Q : product vo 객체를 생성하고 입력 값을 받아 ArrayList로 프로그램을 완성해보세용
① product vo 객체 생성
package equals재정의;
public class product {
private int code;
private String name;
private String path;
private String userId;
private int price;
private int qty;
public product() { // defalut 생성자 생성
}
public product(int code, String name, String path, String userId, int price, int qty) {
super();
this.code = code;
this.name = name;
this.path = path;
this.userId = userId;
this.price = price;
this.qty = qty;
}
// 소스에 오버라이드 클릭 -> 이퀄스 클릭
// equals 는 this 하고 파라미터로 받은 obj 를 비교
@Override
public boolean equals(Object obj) { // 객체 비교하는 용도
// TODO Auto-generated method stub
if (obj instanceof product) {
// 만약에 파라미터로 받는 obj가 product 인지 상속받는지 확인 하여 true 혹은 false 로 반환
product p = (product) obj; // obj와 product 를 비교 하고 싶으니까
// 모든 클래스의 부모인 obj를 product 형태로 다운캐스팅해서 비교 하려고
if (p.code == this.code) {
// 프러덕트(obj)의 code와 product class의 code 같으면 같은 객체로 처리
return true; // 그게 맞으면 true
}
}
return false;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getQty() {
return qty;
}
public void setQty(int qty) {
this.qty = qty;
}
@Override
public String toString() {
return "product [code=" + code + ", name=" + name + ", path=" + path + ", userId=" + userId + ", price=" + price
+ ", qty=" + qty + "]";
};
}
② 프로그램을 구상 해 줄 사용자 정의 클래스 생성
package equals재정의;
import java.util.ArrayList;
import java.util.Scanner;
import 과제0227.product;
public class PService {
// product 에 대한 arraylist 생성
private ArrayList<product> list;
public PService() { // PService 생성자를 arraylist 로 생생하여 초기화시켜주겠다.
list = new ArrayList<>();
}
// 제품추가
public void addProduct(Scanner sc) {
product p = new product(); // product 객체 생성하고
int idx = 0; // 중복값을 확인 하기 위한 idx 변수 생성
while (idx >= 0) {
// 변수가 0 이상일때, -1이면 그만 둠 밑에 idx=list.indexOf(p) 와 연결
System.out.println("code : ");
p.setCode(sc.nextInt());
// 코드 리스트에 넣을껀데 code가 private 이니까 setCode
idx = list.indexOf(p);
// equals() 메서드에 의해 번호가 같은 객체를 찾아준다.
// indexOf (a,b) indexOf 는 배열에서 값을 찾아주는데 a는 찾을 값 b는 배열의 몇번쨰 부터찾을지 b는 생략 가능
// 값이 있으면 해당 위치를 반환하며 못찾았따면 -1 을 반환한다.
}
System.out.println("name : ");
p.setName(sc.next());
System.out.println("path : ");
p.setPath(sc.next());
System.out.println("userId : ");
p.setUserId(sc.next());
System.out.println("price : ");
p.setPrice(sc.nextInt());
System.out.println("qty : ");
p.setQty(sc.nextInt());
list.add(p); // ArrayList 에 추가
// 어레이리스트는 방의 개수에 제약이 없어서 배열처럼 cnt 써서 굳이 체크 안해줘도 된다.
}
// 제품 번호로 검색하여 출력
public void getProduct(Scanner sc) {
System.out.println("검색 할 제품 번호");
int num = sc.nextInt();
product p = new product();
// 검색할 번호를 product 객체에 담는다.
// 왜? 이 코드는 equals를 사용해서 객체를 비교하는데
// equals() : 객체끼리를 비교함. 그래서 product 객체 p에 검색할 번호만 저장
// ArrayList 에서 product 객체를 하나씩 꺼내서 p와 equals()로 비교 -> 어떤 형태로?
// p.equals(list.get(i)
p.setCode(num);
int idx = list.indexOf(p); // indexOf 안에서 equals로 비교함
if (idx < 0) {
System.out.println("없다"); // 없다고 말하고
} else {
// product p = list.get(idx);
// System.out.println(p);
// 위와 아래 같은 거임
System.out.println(list.get(idx)); // 0보다 크면 그 idx 번호 리스트를 출력
}
}
// 수정
public void edit(Scanner sc) {
System.out.println("수정할 제품 번호:");
int num = sc.nextInt();
product p2 = new product();
// 여기서 객체를 p2 라고 다른 이름으로 생성 해 주었음
// 왜야하면 어차피 입력 값을 받아 비교 하는 역할 만 할꺼니까.
p2.setCode(num);
int idx = list.indexOf(p2);// 제품 번호로 검색
if (idx < 0) {
System.out.println("없다");
} else {
product p = list.get(idx);// idx 방의 객체를 꺼내서 변수 p에 저장
System.out.println("new name:");
p.setName(sc.next());
System.out.println("new price:");
p.setPrice(sc.nextInt());
System.out.println("new amount:");
p.setQty(sc.nextInt());
}
}
// 삭제
public void delProduct(Scanner sc) {
System.out.println("삭제 할 제품 번호 ");
int code = sc.nextInt();
product p = new product();
p.setCode(code);
if (list.remove(p)) {
// remove(객체) : 파라미터와 동일한 객체를 equals 로 찾아서 삭제한다
// 삭제할 내용이 있다면 remove! 없애버려
// remove (방번호) : 배열처럼 해당 방에 있는 값을 삭제. -> 삭제할 데이터의 값이 어디있는지 알아야 삭제가능함
// remove(객체):파라미터로 넣은 (객체) 이 값을 자기가 찾아서 삭제해준다. -> 즉 검색할 메서드를 만들 필요도 없다.
// (객체) 이 객체를 찾으려면 어떻게 하겠어? 우리가 만든 것과 같은 방식으로 번호, 혹은 이름으로 찾겠지?
// 얘는 근데 뭐로 찾아? equals() 를 이용해서 삭제를 함.
// 따라서 remove(객체) 를 사용하려면 equals() 내용을 재정의 해주어야 한다.
System.out.println("제품이 삭제되었음");// 정상 삭제되면 출력
} else {
System.out.println("없는 제품. 삭제 취소"); // 아니면 안된다고 반환
}
}
//전체 출력
public void getAll() {
for (int i = 0; i < list.size(); i++) {
product p = list.get(i);
System.out.println(p); // 모든 것을 프린팅~
}
// for(product p : list) { // 이 방법으로도 사용가능
// System.out.println(p);
// }
}
// 제품명은 중복 가능함으로 여러개가 검색 될 수 있음
public ArrayList<product> getByName(Scanner sc) { // 반환값을 array list로 줘도 된다
// 반환 값을 Arraylist 로 줘서 반환 할떄 list로 나온다. 문제 없음.
System.out.println("검색할 제품을 입력하시오");
String name = sc.next();
// 위에 arraylist<product> 와는 별개
ArrayList<product> datas = new ArrayList<>();
// 이건 같은 이름이 여러개 일 수도 있으니까 이름이 똑같은 검색된 결과를 담을 리스트를 하나 생성
// 여러개가 들어 갈 수 있으니까 변수 하나에 못담아 그래서 arrarylist datas 를 만들어 준거임
for (int i = 0; i < list.size(); i++) {
// 0번 리스트 부터 데이터가 들어가 있는 사이즈 까지
product p = list.get(i);
// i 번째에 있는 객체를 하나씩 꺼내서 변수 p에 담아.
if (name.equals(p.getName())) {
// 현재 그 product 의 이름과 검색하라고 하는 문자열과 같은지 비교
// 입력받은 name = 현재 객체, (product의 getter) p,getName .
// 그리고 product 에서 equals(object obj)의 그 파라미터로서의 역할
// 여기서 쓰인 equals 는 objuect class의 equals이다.
datas.add(p); // 같다면 생성해 놓은 datas 리스트에 라는 곳에다 추가.
}
}
return datas;
// datas 타입이 arraylist 니까 반환 값도 array list.
// 리턴 값은 무조건 메소드 선언시 값을 반환 할 값이면 된다.
// 리턴 값이 없으면 그냥 void 써.
}
// 위에서 이름으로 검색한 결과를 출력하는 메소드
public void printByName(Scanner sc) {
ArrayList<product> datas = getByName(sc);
// getByName의 입력값을 datas 에 넣겠다.
if (datas.isEmpty()) { // 텅텅비었으면
System.out.println("검색된 제품 없음");
return; // 종료
}
for (int i = 0; i < datas.size(); i++) { // 있다면 루프 돌면서
product p = datas.get(i); // datas 에 있는 i 번째를 뽑아서 P 객체를 넣어
System.out.println(p);
}
}
}
③ 조작을 위한 메뉴 클래스 생성
package equals재정의;
import java.util.Scanner;
public class menu {
Scanner sc = new Scanner(System.in);
private PService service;
public menu() {
service = new PService();
}
public void run(Scanner sc) {
boolean flag = true; // flag 를 true 로 지정 해 놓고
int m;
while (flag) { // flag 가 false 가 될 때 까지
System.out.println("1.추가 2.번호로검색 3.제품명으로검색 4.수정 5.삭제 6.전체출력 7.종료");
m = sc.nextInt();
switch (m) {
case 1:
service.addProduct(sc);
break;
case 2:
service.getProduct(sc);
break;
case 3:
service.printByName(sc);
break;
case 4:
service.edit(sc);
break;
case 5:
service.delProduct(sc);
break;
case 6:
service.getAll();
break;
case 7:
flag = false; // 종료 하기 위해 flag 를 바꿔줌
break;
}
}
}
}
④ 메인클래스에서 해당 메뉴를 구현
package equals재정의;
import java.util.Scanner;
public class main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in); //입력 받을 수 있는 객체 생성
menu m = new menu(); //메뉴 객체를 생성
m.run(sc);//시작!
}
}
'JAVA' 카테고리의 다른 글
[JAVA] 입출력 스트림 ② 바이트 단위 스트림 _ 입력 (0) | 2023.03.10 |
---|---|
[JAVA] 입출력 스트림 ① 표준 입출력 (0) | 2023.03.08 |
[JAVA] equals( ) 메소드 (0) | 2023.03.08 |
[JAVA] == 과 equals( ) 메서드 차이 (0) | 2023.03.08 |
[JAVA] Map 컬렉션 클래스 (0) | 2023.03.07 |