본문 바로가기

언어/Java

Product 예제 1

import com.my.product.dao.ProductDAO;
import com.my.product.dto.Product;

public class ProductUser {
	java.util.Scanner sc = new java.util.Scanner(System.in); // non-static 변수는 객체가 생성될 때 메모리에 할당된다 그래서 ProductUser user = new ProductUser(); 해줬음
	ProductDAO dao = new ProductDAO();
	// 추가가 안된 상태에서 코드를 확인하려면 검색부터 해야한다.
	void findAll() {
//		ProductDAO dao = new ProductDAO(); // 저장소가 findAll과 findByProdNo 각각 만들어지기 때문에, 같은 상품 객체를 써야하기 때문에 지역변수로 만들지말고 멤버변수로 만들기  
		System.out.println(">>상품 전체목록<<");
		Product[] all1 = dao.selectAll();
		if(all1 == null) {
			System.out.println("상품이 없습니다"); //출력됨
		}else {
			for(Product p: all1) {
//				System.out.println(p.prodNo + ":" + p.prodName + ":" + p.prodPrice);
				System.out.println(p.getProdNo() + ":" + p.getProdName() + ":" + p.getProdPrice());
			}
		}
		System.out.println("----------------");
	}
	
	void findByProdNo() {
//		ProductDAO dao = new ProductDAO();	// 저장소가 findAll과 findByProdNo 각각 만들어지기 때문에, 같은 상품 객체를 써야하기 때문에 지역변수로 만들지말고 멤버변수로 만들기  
		System.out.println(">>상품 번호로 검색<<");
		System.out.print("상품번호를 입력하세요:");
		String prodNo = sc.nextLine(); // String prodNo = this.sc.nextLine(); this가 생략되어있음. 현재 사용중인 객체의 메서드를 찾아감.
		// main 메서드는 String opt = user.sc.nextLine(); 이렇게 씀  참조변수를 user 찾아갔음. user의 메서드를 찾아야함.	
		Product p;
		p = dao.selectByProdNo(prodNo);	// p = this.dao.selectByProdNo("C0002"); this가 생략되어있음
		if(p == null) {
			System.out.println("상품이 없습니다"); 
		}else{
			//출력됨
//			System.out.println(p.prodNo +"번호 상품의 상품명:" + p.prodName + ", 가격:" + p.prodPrice);
			System.out.println(p.getProdNo() +"번호 상품의 상품명:" + p.getProdName() + ", 가격:" + p.getProdPrice());

		}
	}
	
	void add() {
		System.out.println(">>상품 추가<<");
		System.out.print("상품번호를 입력하세요:");
		String prodNo = sc.nextLine();
		System.out.print("상품명을 입력하세요:");
		String prodName = sc.nextLine();
		System.out.print("상품가격을 입력하세요:");
		String prodPrice = sc.nextLine();
		
		/* 방법1
		Product p1 = new Product();
		p1.prodNo = prodNo;	
		// p1이 참조하고있는 객체의 멤버변수. 사용자가 직접 대입하다보면 옳지않은 값 세팅할 수 있음. ex)p1.prodPrice = -10;
		// 그래서 접근 못하게 접근제어자 사용필요.
		p1.prodName = prodName;	
		p1.prodPrice = Integer.parseInt(prodPrice);
		//p1.prodPrice : int타입, prodPrice: String	 => 기본형과 참조형은 구조 자체가 다르기 때문에 형변환 불가능하다. 그래서 라이브러리의 도움을 받는다.
		// String -> int로 변환해주는 라이브러리 : int = Integer.parseInt(String);
		// String -> float로 변환해주는 라이브러리 : float = Float.parseFloat(String);
		dao.insert(p1);
		*/
		
		// 방법2 사용자입장에서 생성하기 편하도록 생성자(특수 메서드) 사용. 위의 방법1을 이걸로 줄일 수 있음.
		Product p = new Product(prodNo, prodName,Integer.parseInt(prodPrice));
		dao.insert(p);		
	}
	
	public static void main(String[] args) {
		ProductUser user = new ProductUser();
//		user.sc.nextInt();//숫자값
//		user.sc.nextFloat();; //실수값
//		user.sc.next(); // 토큰단위로 읽음
//		user.sc.nextLine(); // 줄바꿈 단위로 읽음, 줄단위로 입력된 값을 반환해주는 메서드
		
		// 반복의 횟수, 반복 최종도달해야하는 값이 결정되있으면 for문 사용하는게 좋으나
		// 반복횟수가 정해져있지 않은 반복문은 while이 적절하다.
		while(true) {
			System.out.println("작업을 선택하세요: 상품전체목록-1, 상품번호로검색-2, 상품추가-3, 종료-9;");
			String opt = user.sc.nextLine();
		
			if(opt.equals("1")) {
				user.findAll();
			} else if(opt.equals("2")) {
				user.findByProdNo();				
			} else if(opt.equals("3")) {
				user.add();
			} else if(opt.equals("9")) {
				break;
			}
		}		
	}
}
package com.my.product.dto;	// default package에서 여기로 옮기면 자동으로 한줄 추가
// default package - 논리적으로 구분해놓은 단위(물리적인 단위X, 실제로는 존재하지 않는다)
// package 나눠져도 소스코드에는 아무 의미 없다

public class Product {	// DTO, DTO설계가 제일 중요
//	String prodNo;
//	String prodName;
//	int prodPrice;
	
	private String prodNo;
	private String prodName;
	private int prodPrice;
	
	// 클래스 이름과 동일해야함
	// 메서드랑 구분짓기. void, return 탕비 자체가 없다
	// void Product(){}는 메서드다.
	// 객체가 생성될 때 자동 호출
	
	// 매개변수 없는 생성자
	// 이건 default 생성자가 아니다.
	// 	Product() {} 이거 없으면 default 생성자 안만들어진다.
    
	public Product() {
	}
	
	// 매개변수 2개짜리 생성자
	public Product(String prodNo, String prodName) {
//		this.prodNo = prodNo;
//		this.prodName = prodName;
		
		// 위의 2줄을 this생성자호출 을 통해 매개변수 3개짜리의 생성자가 호출이 된다.
		// 1 생성자에서 다른 생성자 호출하고 싶으면 this생성자 호출하면된다.
		// 매개변수의 갯수가 다른 생성자호출
		// String prodNo, String prodName, int prodPrice를 부를 수 있음.
		// 생성자의 첫줄에 와야 한다
		// this 생성자 위에 아래처럼 오면 에러발생
//		System.out.println("..."); 이거 이 자리에 있으면 X
		this(prodNo, prodName, 0);
	}
	
	
	// 매개변수 3개짜리 생성자
	public Product(String prodNo, String prodName, int prodPrice) {
		this.prodNo = prodNo;
		this.prodName = prodName;
		this.prodPrice = prodPrice;
	}
	
	// 위 처럼 이렇게 매개변수 갯수만 다르고 똑같은 이름으로 생성 = 오버로드
	
	public void setProdNo(String prodNo) {
		if(prodNo.length() != 5) {
			System.out.println("상품번호는 5자리어야합니다");
			return;
		}
		this.prodNo = prodNo;
	}
	
	public String getProdNo() {
//		return "prodNo의 암호화";
		return prodNo;
	}
	
	public void setProdName(String prodName) {
		this.prodName = prodName;
	}
	
	public String getProdName() {
		return prodName;
	}
	
	public void setProdPrice(int prodPrice) {
		this.prodPrice = prodPrice;
	}
	
	public int getProdPrice() {
		return prodPrice;
	}
}
package com.my.product.dao;
import com.my.product.dto.Product;

public class ProductDAO {
//	Product[] products = new Product[5]; //상품저장소, public,private도 안붙은 상태 = default 상태, 외부에서 접근 가능하니 접근 못하게 private붙이기
//	int totalCnt; //저장된 상품수. 0으로 자동 초기화
	
	private Product[] products = new Product[5];
	private int totalCnt;
	
	/**
	 * 상품을 저장소에 저장한다. 저장소가 꽉찬 경우 "저장소가 꽉찼습니다" 메시지가 출력되고 저장안된다.
	 * @param product 상품
	 */
	public void insert(Product product) { // 추가
		if(totalCnt == products.length) {
			System.out.println("저장소가 꽉찼습니다");
			return;
		}
		products[totalCnt] = product;
		totalCnt++;
		
//		products[totalCnt++] = product;	// 이렇게 쓰면 Exception 발생
		
	}
	
	/**
	 * 상품번호에 해당 상품을 저장소에서 검색하여 반환한다
	 * @param prodNo 상품번호
	 * @return 상품객체. 번호에 해당 상품을 찾지 못하면 null을 반환한다 
	 */
	public Product selectByProdNo(String prodNo) { // 상품번호로 검색하기
//		for(int i=0; i<products.length; i++) {	// 없는것도 조회하면 nullpointException 터질 수 있으니 아랫줄처럼
		for(int i=0; i<totalCnt; i++) {
			Product savedP = products[i]; // 이미 저장된 상품
			if(savedP.getProdNo().equals(prodNo)) {
				return savedP;
			}
		}
		return null;
	}
				
	/**
	 * 저장소에 저장된 상품들만 반환한다
	 * @return 상품들. 저장소에 저장된 상품이 한개도 없으면 null을 반환한다 
	 */
	public Product[] selectAll(){
		if(totalCnt == 0) {
			return null;
		}
		Product []all = new Product[totalCnt];
		for(int i=0; i<totalCnt; i++) {
			all[i] = products[i];
		}
		return all;
	}
}

결과

 

'언어 > Java' 카테고리의 다른 글

싱글톤  (0) 2023.07.31
패키지  (0) 2023.07.31
오버로드(Overload)  (0) 2023.07.31
접근제어자(Access Modifier)  (0) 2023.07.31
생성자  (0) 2023.07.31