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 |