코드 분석하는 법
1. 클래스별 전역변수와 메서드 분석
2. 시작메서드부터 직접 실행하면서 흐름을 이해
미니 프로젝트
주제: 쇼핑몰 관리 프로그램
클래스
1.메인 클래스
2.메뉴 클래스
3.상품관리 클래스
4.회원관리 클래스
5.상품 클래스
6.회원 클래스
7.장바구니 물건 클래스
주요기능
상품 관리
1.1상품등록: 상품의 이름, 아이디, 수량, 단가를 입력받아 상품 목록에 저장하는 기능
1.2상품수정: 수정할 상품의 이름을 입력받고 상품 목록에 같은 이름이 있으면 수량과 가격을 입력받아 수정,
같은 이름이 없으면 이름이 없다고 안내 한 후 상위 메뉴로 돌아가는 기능.
1.3전체보기: 상품 목록에 있는 모든 상품의 정보를 보여주는 기능.
1.4상품삭제: 삭제할 상품의 이름을 입력받고 상품 목록에 같은 이름이 있으면 상품을 삭제,
같은 이름이 없으면 이름이 없다고 안내 한 후 상위 메뉴로 돌아가는 기능.
1.5상품검색: 검색할 상품의 이름을 입력받고 상품 목록에 같은 이름이 있거나 단어가 포함된 이름이 있으면
상품의 정보를 보여주고 같은 이름이 없으면 이름이 없다고 안내 한 후 상위 메뉴로 돌아가는 기능.
1.6이전메뉴: 상위 메뉴로 돌아가는 기능.
쇼핑몰
2.1회원가입: 회원의 이름, 아이디 , 비밀번호를 입력 받아 회원 목록에 저장하는 기능
아이디 중복 검사기능: 회원 목록에 있는 아이디일 경우 이미 사용중인 ID라고 안내후 상위메뉴로 돌아감.
비밀번호 확인 기능: 비밀번호와 비밀번호 확인을 두어 두개의 입력값이 같을 경우만 회원 목록에 저장하고
두 입력값이 다르면 비밀번호를 확인하세요라고 안내후 상위메뉴로 돌아감.
2.2로그인: 회원의 아이디와 비밀번호를 입력 받은 후 회원 목록에서 같은 아이디와 비밀번호가 있다면 로그인을 해주는 기능
만일 회원 목록에 회원이 아무도 없다면 회원이 없습니다. 회원가입부터 해주세요 안내 후 상위메뉴로 돌아감.
로그인 후 보이는 기능
2.2.1회원 관리
2.2.1.1 내정보 : 로그인 되어있는 회원의 이름, 아이디, 비밀번호를 보여주는 기능.
2.2.1.2 회원수정 : 새로운 이름과 새로운 비밀번호를 입력받아 로그인 되어있는 회원의 정보를 수정.
비밀번호 확인 기능: 새로운 비밀번호를 입력받고 비밀번호 확인을 입력받아
두 입력값이 같을 경우 수정하고 다르면 비밀번호 확인 출력후 상위메뉴
2.2.1.3 회원탈퇴 : 정말로 탈퇴할지 한번더 묻고 y를 입력하면 회원 목록에서 삭제 후 상위메뉴로 돌아감.
y이외의 문자 입력하면 상위 메뉴로 돌아감.
2.2.2쇼핑하기: 상품목록에 있는 모든 상품의 리스트를 보여주고 구매할 상품의 번호와 구매할 수량을 입력 받아 장바구니 리스트에 저장하는 기능.
상품과 구매수량 연동기능: 구매가 발생될때 구매한 수량만큼 상품의 재고가 줄어들고
재고가 구매할 수량보다 적다면 수량이 부족하다고 안내
구매수량과 단가를 곱하여 가격을 저장하는 기능: 구매할때 상품의 가격과 내가 구매한 수량을 곱하여 장바구니에 가격을 저장
2.2.3장바구니 보기: 장바구니 리스트에 있는 상품의 이름, 수량, 가격을 보여주는 기능
2.2.4이전메뉴: 상위메뉴로 돌아가는 기능
2.3이전메뉴: 상위메뉴로 돌아가는 기능
프로그램 종료
모든 프로그램을 종료하는 기능
메인클래스
package Market;
public class Main {
public static void main(String[] args) {
System.out.println("프로그램 시작");
new Menu();
System.out.println("프로그램 종료");
}
}
메뉴클래스
package Market;
import java.util.Scanner;
public class Menu {
Scanner in = new Scanner(System.in);
GoodsManager a = new GoodsManager();
MemberManager b = new MemberManager(a);
Menu() {
//숫자를 입력받아야 되는데 실수로 문자를 입력하여 생기는 오류를
//방지하기 위해 모든 숫자 입력은 문자로 입력받아
//equals를 사용하였습니다.
for (;;) {
menu();
String selMenu = in.nextLine();
if (selMenu.equals("1")) {//상품관리
a.runGoods();
} else if (selMenu.equals("2")) {//쇼핑몰
b.menu();
} else if (selMenu.equals("3")) {//프로그램종료
break;
} else {
System.out.println("잘못된 입력입니다.");
}
}
}
private void menu() {
System.out.println("-----------");
System.out.println("1. 상품관리");
System.out.println("2. 쇼핑몰");
System.out.println("3. 프로그램종료");
System.out.println("-----------");
}
}
상품등록 클래스
package Market;
import java.util.ArrayList;
import java.util.Scanner;
public class GoodsManager {
ArrayList<Goods> gList = new ArrayList<>();
Scanner in = new Scanner(System.in);
public void runGoods() {
for (;;) {
menu();
String selMenu = in.nextLine();
if (selMenu.equals("1")) {// 상품등록
addGoods();
} else if (selMenu.equals("2")) {// 상품수정
modGoods();
} else if (selMenu.equals("3")) {// 상품전체보기
listGoods();
} else if (selMenu.equals("4")) {// 상품삭제
delGoods();
} else if (selMenu.equals("5")) {// 상품조회
searchGoods();
} else if (selMenu.equals("6")) {// 이전메뉴
break;
} else {
System.out.println("잘못된 입력입니다.");
}
}
}
private void searchGoods() {//상품조회
System.out.println("검색할 이름을 입력하세요");
String b = in.nextLine();
boolean flag = false;
for (int i = 0; i < gList.size(); i++) {
if (gList.get(i).name.equals(b)) {//검색할 이름과 일치할때
System.out.println(b + "와 같은 이름");
gList.get(i).prt();
flag = true;
System.out.println("--------------");
} else if (gList.get(i).name.indexOf(b) != -1) {//검색할 이름이 포함될때
System.out.println(b + "를 포함하는 이름");
gList.get(i).prt();
flag = true;
System.out.println("--------------");
}
}
if (flag == false) {// 검색한 이름이 없을때
System.out.println("이름이 없습니다.");
}
}
private void delGoods() {//상품삭제
System.out.println("삭제할 이름을 입력하세요");
String b = in.nextLine();
boolean flag = true;
for (int i = 0; i < gList.size(); i++) {
if (gList.get(i).name.equals(b)) {//상품 리스트에 이름이 있을때
gList.remove(i);
System.out.println(b + "삭제 완료");
flag = false;
}
}
if (flag) {// 상품리스트에 상품이 없을때
System.out.println("이름이 없습니다.");
}
}
private void modGoods() {//상품수정
System.out.println("수정할 이름을 입력하세요");
String b = in.nextLine();
boolean flag = true;
for (int i = 0; i < gList.size(); i++) {
if (gList.get(i).name.equals(b)) {//상품 리스트에 이름이 있을때
//수량과 가격만 수정가능
System.out.println("수량을 입력하세요");
int newInt = in.nextInt();
in.nextLine();
gList.get(i).cnt = newInt;
System.out.println("가격을 입력하세요");
newInt = in.nextInt();
in.nextLine();
gList.get(i).price = newInt;
flag = false;
}
}
if (flag) {// 상품리스트에 상품이 없을때
System.out.println("이름이 없습니다.");
}
}
private void addGoods() {//상품등록
Goods newGoods = new Goods();
System.out.println("이름 입력");
String name = in.nextLine();
System.out.println("아이디 입력");
String id = in.nextLine();
System.out.println("수량 입력");
int cnt = in.nextInt();
in.nextLine();
System.out.println("단가 입력");
int price = in.nextInt();
in.nextLine();
newGoods.setting(name, id, cnt, price);
gList.add(newGoods);//상품의 주소값을 상품리스트에 저장
}
public void listGoods() {//상품리스트에 있는 상품을 보여주는 메서드
for (int i = 0; i < gList.size(); i++) {
System.out.println(i + "번 정보-------");
gList.get(i).prt();
System.out.println("------------");
}
}
private void menu() {
System.out.println("-----------");
System.out.println("1. 상품등록");
System.out.println("2. 상품수정");
System.out.println("3. 전체보기");
System.out.println("4. 상품삭제");
System.out.println("5. 상품검색");
System.out.println("6. 이전메뉴");
System.out.println("-----------");
}
}
상품클래스
package Market;
public class Goods {
String name = null;//상품의 이름
String id = null;//상품의 아이디
int cnt = 0;//상품의 수량
int price = 0;//상품의 가격
//상품의 이름, 아이디, 수량, 가격을 입력받아 저장하는 메서드
public void setting(String name, String id, int cnt, int price) {
this.name = name;
this.id = id;
this.cnt = cnt;
this.price = price;
}
public void reCnt(int cnt) {//회원이 구매하는 수량을 받아 상품의 재고를 빼주는 메서드
this.cnt -= cnt;
}
public void prt() {//상품의 정보를 보여주는 메서드
System.out.println("이름: " + this.name);
System.out.println("아이디: " + this.id);
System.out.println("수량: " + this.cnt);
System.out.println("가격: " + this.price);
}
}
회원관리 클래스
package Market;
import java.util.ArrayList;
import java.util.Scanner;
public class MemberManager {
ArrayList<Member> mem = new ArrayList<>();
Scanner in = new Scanner(System.in);
int memberIdx;
GoodsManager b = null;
public MemberManager(GoodsManager a) {
b = a;
}
public void menu() {
for (;;) {
System.out.println("------------");
System.out.println("1. 회원 가입");
System.out.println("2. 로그인");
System.out.println("3. 이전메뉴");
System.out.println("------------");
String selMenu = in.nextLine();
if (selMenu.equals("1")) { //회원가입
memberJoin();
} else if (selMenu.equals("2")) { //로그인
if (mem.size() != 0) { //회원리스트에 회원이 있을때
chkMember();
} else { //회원리스트에 회원이 한명도 없을때
System.out.println("회원이 없습니다. 회원가입부터 해주세요.");
}
} else if (selMenu.equals("3")) {//이전메뉴
break;
} else {
System.out.println("잘못된 입력입니다.");
}
}
}
private void chkMember() {//로그인 메서드
System.out.println("ID를 입력하세요");
String memberId = in.nextLine();
System.out.println("비밀번호를 입력하세요");
String memberPwd = in.nextLine();
int flag = 0;
for (int i = 0; i < mem.size(); i++) {//회원리스트에서 아이디와 비번을 찾아 모두 같으면 로그인
if (mem.get(i).memberId.equals(memberId) && mem.get(i).memberPwd.equals(memberPwd)) {
System.out.println(memberId + "님 환영합니다.");
memberIdx = i;//아이디와 비번이 같은 회원의 인덱스 값을 전역 변수에 저장해서 다른 메서드에서 사용
joinMenu();
flag = 1;
}
}
if(flag == 0) {
System.out.println("회원정보를 확인하세요");
}
}
private void joinMenu() {
for (;;) {
System.out.println("------------");
System.out.println("1. 회원 관리");
System.out.println("2. 쇼핑하기");
System.out.println("3. 장바구니보기");
System.out.println("4. 이전메뉴");
System.out.println("------------");
String selMenu = in.nextLine();
if (selMenu.equals("1")) {
System.out.println("------------");
System.out.println("1. 내정보");
System.out.println("2. 회원 수정");
System.out.println("3. 회원 탈퇴");
System.out.println("------------");
String selMenu2 = in.nextLine();
if (selMenu2.equals("1")) { //내 정보
mem.get(memberIdx).memberPrt();
} else if (selMenu2.equals("2")) { //회원수정, 아이디는 유일하므로 수정 안됨.
System.out.println("------------");
System.out.println("새로운 이름을 입력하세요");
String memberName = in.nextLine();
System.out.println("새로운 비밀번호를 입력하세요");
String memberPwd = in.nextLine();
System.out.println("비밀번호 확인");
String memberChkPwd = in.nextLine();
if (memberPwd.equals(memberChkPwd)) {//비번과 비번확인이 같으면 수정
mem.get(memberIdx).memberName = memberName;
mem.get(memberIdx).memberPwd = memberPwd;
} else {
System.out.println("비밀번호를 확인하세요.");
}
} else if (selMenu2.equals("3")) {
System.out.println("정말로 탈퇴하시겠습니까?(Y/N)");
String b = in.nextLine();
b.toLowerCase();//입력받은 문자를 소문자로 바꿈
if (b.equals("y")) {
mem.remove(memberIdx);
System.out.println("탈퇴완료");
break;
} else {
System.out.println("메뉴로 돌아갑니다.");
}
} else {
System.out.println("잘못된 입력입니다.");
}
} else if (selMenu.equals("2")) {//쇼핑하기
mem.get(memberIdx).shopping(b);
} else if (selMenu.equals("3")) {//장바구니 보기
System.out.println("장바구니 정보-------");
mem.get(memberIdx).viewBasket();
System.out.println("----------------");
} else if (selMenu.equals("4")) {//이전메뉴
break;
} else {
System.out.println("잘못된 입력입니다.");
}
}
}
private void memberJoin() {//회원가입
Member save = new Member();
System.out.println("이름을 입력하세요");
String memberName = in.nextLine();
System.out.println("ID를 입력하세요");
String memberId = in.nextLine();
System.out.println("비밀번호를 입력하세요");
String memberPwd = in.nextLine();
System.out.println("비밀번호 확인");
String memberChkPwd = in.nextLine();
int flag = 0;
if (mem.size() != 0) {//회원리스트에 회원이 있을때
for (int i = 0; i < mem.size(); i++) {//회원 ID 중복체크
if (mem.get(i).memberId.equals(memberId)) {
System.out.println("이미 사용중인 ID입니다.");
flag = 1;
}
}
if (flag == 0) {//중복된 아이디가 아닐때 가입
if(memberPwd.equals(memberChkPwd)) {//비번과 비번확인이 같을때 저장
save.inputMember(memberName, memberId, memberPwd);
mem.add(save);
System.out.println("회원가입 되었습니다.");
}else {//비번과 비번확인이 다를때
System.out.println("비밀번호를 확인하세요.");
}
}
} else {// 회원 리스트에 회원이 없을때
if (memberPwd.equals(memberChkPwd)) {//비번과 비번확인이 같을때 저장
save.inputMember(memberName, memberId, memberPwd);
mem.add(save);
System.out.println("회원가입 되었습니다.");
} else {//비번과 비번확인이 다를때
System.out.println("비밀번호를 확인하세요.");
}
}
}
}
회원 클래스
package Market;
import java.util.ArrayList;
import java.util.Scanner;
public class Member {
String memberName = null;//회원이름
String memberId = null;//회원아이디
String memberPwd = null;//회원비번
//회원의 이름, 아이디, 비번을 매개변수로 받아 저장하는 메서드
public void inputMember(String memberName, String memberId, String memberPwd) {
this.memberName = memberName;
this.memberId = memberId;
this.memberPwd = memberPwd;
}
public void memberPrt() {//회원의 정보를 출력하는 메서드
System.out.println("이름: " + memberName);
System.out.println("ID: " + memberId);
System.out.println("Pwd: " + memberPwd);
}
ArrayList<GoodsBasket> basket = new ArrayList<>();
public void viewBasket() { //장바구니에 있는 상품을 출력하는 메서드
for (int i = 0; i < basket.size(); i++) {
System.out.println("------------");
basket.get(i).basketPrt();
}
}
Scanner in = new Scanner(System.in);
public void shopping(GoodsManager c) {
c.listGoods();//상품리스트에 있는 상품 목록을 보여줌
System.out.println("구매할 물건의 번호를 입력하세요");
System.out.println("이전메뉴로 가려면 100을 입력하세요");
String a = in.nextLine();
int b = Integer.parseInt(a);
if (b < c.gList.size()) {//구매할 상품의 번호의 범위 안에 있을때
Goods g = c.gList.get(b);
System.out.println("구매할 수량을 입력하세요");
String a1 = in.nextLine();
int b1 = Integer.parseInt(a1);
if (g.cnt - b1 < 0) {//상품의 재고가 사려는 수량보다 적을 경우
System.out.println("수량이 부족합니다.");
} else {//모든 조건에 만족될때 구매 가능
GoodsBasket gb = new GoodsBasket();
gb.name = g.name;
g.reCnt(b1);//상품의 재고 수량을 구매수량만큼 빼기
gb.plusCnt(b1);//구매 수량만큼 장바구니 물건 객체에 저장
gb.sumPrice(g.price);//구매수량에 상품의 가격을 곱하여 장바구니 상품 가격에 저장
basket.add(gb);// 장바구니 상품의 주소값을 장바구니 리스트에 저장
System.out.println(g.name + " " + b1 + "개 구매 완료");
}
} else if (b == 100) {//상품을 구매하지 않고 상위메뉴로 가고 싶을때
System.out.println("이전메뉴로 갑니다.");
} else {//구매할 물건의 번호를 넘어가는 숫자를 입력할때
System.out.println("잘못된 입력입니다.");
}
}
}
장바구니 클래스
package Market;
public class GoodsBasket {
String name = null; //장바구니 상품의 이름
int cnt = 0;// 장바구니 상품의 수량
int goodsPrice = 0;// 장바구니 상품의 가격
//회원이 구매하는 수량을 장바구니 상품 수량에 저장
public void plusCnt(int cnt) {
this.cnt += cnt;
}
//회원이 구매하는 수량과 상품의 가격을 곱하여 장바구니 상품 가격에 저장
public void sumPrice(int goodsPrice) {
this.goodsPrice = cnt * goodsPrice;
}
public void basketPrt() {//장바구니의 상품 정보를 보여주는 메서드
System.out.println("물건:" + name);
System.out.println("수량:" + cnt);
System.out.println("가격:" + goodsPrice);
}
}