연습기록/JAVA

[JAVA] 리스트 연습-상품 품목 관리 프로그램 만들기

박박소현 2024. 11. 3. 10:12

[문제]

#상품 관리 프로그램 만들기

## 클래스 정보
1. ProductDTO
- 필드 : 상품이름(name), 가격(price), 재고 수량(quantity)

- 생성자 : 전체 필드 초기화 생성자

- 메서드 : getter와 setter, toString

2. ProductDAO
- 필드 : List<ProduectDTO> products

- 생성자 : 기본생성자에서 리스트를 초기화

- 메서드 :
   1. 상품 추가 메서드 : void addProduct(ProductDTO productDTO)
      필드의 리스트에 새 상품 추가
   2. 상품 조회 메서드 : void displayProduct() 
      리스트의 모든 상품 출력
   3. 상품 삭제 메서드 : void deleteProduct(String name)
      상품 이름으로 특정 상품 삭제
   4. 상품 검색 : ProductDTO searchProduct(String name)
      상품 이름으로 검색하여 특정 상품 정보 반환하기
      존재하지 않으면 null반환

 

[설계]

1.productDTO,productDAO 클래스 생성

2.상품 추가, 상품조회, 상품삭제, 상품 검색 메서드 테스트

3.메인클래스에 프로그램 생성

 

[풀이]

1.ProductDTO 클래스 생성

- 필드 : 상품이름(name), 가격(price), 재고 수량(quantity)

	private  String name;
	private  int price;
	private  int quantity;

 


- 생성자 : 전체 필드 초기화 생성자

public ProductDTO(String name, int price, int quantity) {
		
		this.name = name;
		this.price = price;
		this.quantity = quantity;
	}

+자동 생성 기능을 사용했다


- 메서드 : getter와 setter, toString

public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public int getQuantity() {
		return quantity;
	}

	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}

	@Override
	public String toString() {
		return "ProductDTO [name=" + name + ", price=" + price + ", quantity=" + quantity + "]";
	}

}

+자동생성기능을 사용했다

 

2.ProductDAO클래스 생성

- 필드 : List products

static List<ProductDTO> product;

+ProductDTO의 타입을 가진 리스트 product 선언


- 생성자 : 기본생성자에서 리스트를 초기화

public ProduectDAO() {
		product=new ArrayList<ProductDTO>();
	}

+product리스트를 배열과 똑같이 인덱스를 가지고 있는 ArrayList객체로 선언해주었다

- 메서드 :
   1. 상품 추가 메서드 : void addProduct(ProductDTO productDTO)
      필드의 리스트에 새 상품 추가

public void addProduct(ProductDTO productDTO) {
	  product.add(productDTO);
	  System.out.println("상품이 추가 되었습니다");
      }

 

+매개변수를 Prodtuct타입인 productDTO 인자를 받아 .add 기능을 이용해 productList에 넣어주었다

 +추가되었는지 확실히 보기 위해 추가되었다는 문자열을 출력하도록 했다

 

  2. 상품 조회 메서드 : void displayProduct() 
      리스트의 모든 상품 출력

public void displayProduct() {
		System.out.println(product);
	}

 

+이미 DTO클래스에서 toString재정의 해두었기 때문에 간단히 product를 출력하도록 했다
  

 3. 상품 삭제 메서드 : void deleteProduct(String name)
      상품 이름으로 특정 상품 삭제

 

void deleteProduct(String name) {
			
		for(ProductDTO produect: product) {
			if(product.getName().equals(name)) {
				product.remove(produect);
				System.out.println(name+"이 삭제되었습니다");
				return;
			}
			System.out.println("상품이 존재하지 않습니다")
            }

 

+반복문for문을 이용하여 메서드가 product의 모든 변수를 돌면서 실행할 수 있도록 했고, 그 안에서 if문을 이용해 product 안에 있는 name과 입력받은 name이 같은지 확인해 맞다면 .remove기능을 이용해 product리스트에서 삭제한 후 삭제됐는지 눈으로 확인하기 위해 삭제되었다는 문자열 출력하고 for문을 빠져나오라고 return을 걸어주었다

+잘못 입력한 경우를 대비해 상품이 존재하지 않다는 문자열을 출력하도록 해주었다(상품명이 동일하지 않을 경우 for문이 실행되지 않을 것이기 때문에)

 

   4. 상품 검색 : ProductDTO searchProduct(String name)
      상품 이름으로 검색하여 특정 상품 정보 반환하기
      존재하지 않으면 null반환

ProductDTO searchProduct(String name) {
		
		for(ProductDTO pro :product) {
			if(pro.getName().equals(name)) {
				return pro;
			}
				
		 }return null;

		}

+제거 메서드랑 비슷한 맥락으로 만들었으나 제거가 아닌 정보 반환이 목적이기에 상품명이 동일하기에 리턴으로 값을 반환시켜주었다

++문제가 반환만 명시되어있어 문제에 맞게 반환만 했으나 상품정보를 찾지못했습니다 같은 문자열을 추가하는 것도 좋은 방법일것 같다

 

2.기능 테스트

 static void addProductTest() {
	  ProductDTO productDTO=new ProductDTO("칫솔", 1500, 12);
	  ProductDTO productDTO2=new ProductDTO("칫솔3", 15020, 122);
	  ProductDAO proDao = new ProductDAO();
	  proDao.addProduct(productDTO);
	  proDao.addProduct(productDTO2);
	  proDao.displayProduct();
  }
  
static void deleteTast() {
	ProductDTO productDTO=new ProductDTO("칫솔", 1500, 12);
	  ProductDTO productDTO2=new ProductDTO("칫솔3", 15020, 122);
	  ProductDAO proDao = new ProductDAO();
	  proDao.addProduct(productDTO);
	  proDao.addProduct(productDTO2);
	  proDao.deleteProduct("칫솔");
	  proDao.displayProduct();
}
	
static void searchProductTest() {
	ProductDTO productDTO=new ProductDTO("칫솔", 1500, 12);
	  ProductDTO productDTO2=new ProductDTO("칫솔3", 15020, 122);
	  ProductDAO proDao = new ProductDAO();
	  proDao.addProduct(productDTO);
	  proDao.addProduct(productDTO2);
	 System.out.println(proDao.searchProduct("칫솔12")); 
	  
}

+임의로 두가지의 상품을 지정해 테스트 해보았다

+proDao라는 변수에 ProductDAO클래스의 객체를 초기화 시켜 proDao를 사용해 기능들을 꺼내 쓸 수 있게 만들었다

+모두 문제 없이 돌아가는 모습이었다

 

3.Main클래스에 프로그램 구현

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		ProductDAO produectDAO = new ProductDAO();
		Scanner sc = new Scanner(System.in);
		String msg = """
				1.상품추가
				2.상품 리스트 조회
				3.상품 삭제
				4.상품 검색
                		5.시스템 종료
				입력>>""";

		while (true) {
			System.out.println(msg);
			int choice = sc.nextInt();
			if (choice == 5) {

				System.out.println("프로그램을 종료합니다");
                break;
			} else if (choice == 1) {

				System.out.print("상품명 입력:");
				String name = sc.next();
				System.out.print("가격 입력:");
				int price = sc.nextInt();
				System.out.print("재고 입력:");
				int quantity = sc.nextInt();
				ProductDTO produectDTO = new ProductDTO(name, price, quantity);
				produectDAO.addProduct(produectDTO);
				
			} else if (choice == 2) {
				produectDAO.displayProduct();
			} else if (choice == 3) {
				System.out.print("삭제할 상품명 입력:");
				String proname = sc.next();
				produectDAO.deleteProduct(proname);
			} else if (choice == 4) {
				System.out.print("검색할 상품명 입력:");
				String searchName = sc.next();
				ProductDTO search = produectDAO.searchProduct(searchName);
				System.out.println(search);
			}
		}

	}
}

+직접 입력을 받기 위해 Scanner 클래스 호출시켜 각 메뉴에 정수를 부여해 정수를 입력받았다

+while(true)를 사용해 무한루프 돌아 한 기능사용이 끝나도 프로그램이 계속 돌아갈 수 있도록 하였다

+if문에 하나씩 조건을 달아 기능이 돌아가도록 했다 5번인 시스템 종료를 입력하면 while문을 탈출할 수 있도록 break;를 걸어주었다

+if문 대신 swiltch문을 사용할 수도 있을 거 같다

 

[느낀점]

하나하나 배워 하나씩 써볼때랑은 달리 여러가지를 복합적으로 사용해야하는 상황이 오니 어떤 것을 사용해야 현명할지 고민하는 시간이 길어졌지만 그만큼 더 재밌어졌다.

코드를 짜는 것은 어느정도 늘어가고 있는거 같은데 읽는법은 아직 제자리 걸음인거 같아 해석하는 연습도 해야될 거 같다