오전 실습과제
문제
실습 : 차량판매 시스템
선택하세요. [0:나가기, 1:차량등록, 2:고객등록, 3. 차량조회, 4: 고객조회, 5:차량판매]
[차량등록]
차량번호: 111
차량크기(소형(1)/중형(2)/대형(3)): 2
차량타입(세단(1)/SUV(2)): 1
[고객등록]
고객번호: 122
고객명: 홍길동
[차량조회]
차량번호: 111
차량크기(소형(1)/중형(2)/대형(3)): 2
차량타입(세단(1)/SUV(2)): 1
--------------
[고객조회]
고객번호: 111
고객명: 홍길동
-------------
[차량판매]
고객번호를 등록하세요[0:취소]: 122
차량번호를 등록하세요[0:취소]: 111
====================================================================
* 차량등록 시 중복체크
‘차량번호가 중복됩니다’
* 차량판매 시
- 존재하는 고객번호일 때까지 ‘고객번호를 등록하세요’
- 존재하는 차량번호일 때까지 ‘차량번호를 등록하세요’
- 판매된 차량번호이면 ‘판매된 차량번호 입니다. 차량번호를 등록하세요’
풀이
Car class
package p20200625;
import java.util.Scanner;
class Car{
private int carNumber, size, type;
public int getCarNumber() {
return carNumber;
}
public void setCarNumber(int carNumber) {
this.carNumber = carNumber;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
Customer class
class Customer{
private int cusNumber;
private String name;
private Car car = null;
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public int getCusNumber() {
return cusNumber;
}
public void setCusNumber(int cusNumber) {
this.cusNumber = cusNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
CarService class
class CarService{
int cusIndex = 0, carIndex = 0;
Customer[] customerList = new Customer[30];
Car[] carList = new Car[30];
public void inputCar(Car car) {
carList[carIndex] = car;
carIndex++;
}
public void inputCustomer(Customer customer) {
customerList[cusIndex] = customer;
cusIndex++;
}
public void searchCar() {
for(int i=0; i<carIndex; i++) {
System.out.printf("차량번호: %d%n차량크기(소형(1)/중형(2)/대형(3)): %d%n차량타입(세단(1)/SUV(2)): %d%n"
,carList[i].getCarNumber(),carList[i].getSize(),carList[i].getType());
System.out.println("--------------------------------");
}
}
public void searchCustomer() {
for(int i=0; i<cusIndex; i++) {
System.out.printf("고객 번호 : %d%n고객 이름 : %s%n",customerList[i].getCusNumber(),customerList[i].getName());
if(customerList[i].getCar() == null) {System.out.println("소유중인 차량 : 없음");}
else {System.out.printf("소요중인 차량 : 차량번호 %d번%n",(customerList[i].getCar()).getCarNumber());}
System.out.println("--------------------------------");
}
}
public void sellCar(int cusNum, int carNum) {
Car car = null;
Customer cus = null;
int cusI = 0;
for(int i=0; i<cusIndex; i++) {
if(cusNum == customerList[i].getCusNumber()) {
cus = customerList[i]; cusI = i; break;
}
}
for(int i=0; i<carIndex; i++) {
if(carNum == carList[i].getCarNumber()) {
car = carList[i]; break;
}
}
if( cus != null && car != null){
if(cus.getCar()!=null){System.out.println("이미 등록된 차량이 있습니다.");}
else{
cus.setCar(car);
customerList[cusI] = cus;
System.out.printf("%s 고객님에게 %d번 차량 판매 완료.%n",cus.getName(), car.getCarNumber());
}
}
else {System.out.println("고객번호나 차량번호를 확인하세요.");}
}
public boolean cusNumDup(int cusNum) {
boolean check = true;
for(int i=0; i<cusIndex; i++) {
if(cusNum == customerList[i].getCusNumber()) {
check = false; break;
}
}
return check;
}
public boolean carNumDup(int carNum) {
boolean check = true;
for(int i=0; i<carIndex; i++) {
if(carNum == carList[i].getCarNumber()) {
check = false; break;
}
}
return check;
}
}
CarApp class
public class CarApp {
public static void main(String[] args) {
CarService service = new CarService();
Scanner scanner = new Scanner(System.in);
Car car;
Customer cus;
while(true) {
System.out.println("[0:나가기, 1:차량등록, 2:고객등록, 3. 차량조회, 4: 고객조회, 5:차량판매]");
switch(scanner.nextInt()) {
case 0 : System.out.println("시스템 종료"); return;
case 1 :
car = new Car();
int caNum;
System.out.println("차량번호 : ");
caNum = scanner.nextInt();
if(service.carNumDup(caNum)) {
car.setCarNumber(caNum);
System.out.println("차량크기(소형(1)/중형(2)/대형(3)): ");
car.setSize(scanner.nextInt());
System.out.println("차량타입(세단(1)/SUV(2)): ");
car.setType(scanner.nextInt());
service.inputCar(car);
System.out.println("차량등록 완료되었습니다.");
}
else {System.out.println("중복된 번호입니다.");}
break;
case 2 :
cus = new Customer();
int cuNum;
System.out.println("고객번호 : ");
cuNum = scanner.nextInt();
if(service.cusNumDup(cuNum)){
cus.setCusNumber(cuNum);
System.out.println("이름 : ");
cus.setName(scanner.next());
service.inputCustomer(cus);
System.out.println("고객 등록이 완료되었습니다.");
}
else {System.out.println("중복된 번호입니다.");}
break;
case 3 :
service.searchCar();
break;
case 4 :
service.searchCustomer();
break;
case 5 :
int cusNum, carNum;
System.out.println("고객번호를 등록하세요");
cusNum = scanner.nextInt();
System.out.println("차량 번호를 등록하세요");
carNum = scanner.nextInt();
service.sellCar(cusNum, carNum);
break;
default :
System.out.println("정확한 메뉴를 선택하세요.");
break;
}
}
}
}
중복체크 메소드
public boolean cusNumDup(int cusNum) { // 신규 고객 등록시, 입력받은 고객 번호가 중복되는지를 판단하기 위한 메소드 생성. int를 매개변수로 받아 boolean값을 리턴하는 형태입니다.
boolean check = true; //먼저 check 불리언 변수를 선언한 후 true 값으로 초기화.
for(int i=0; i<cusIndex; i++) { // 입력받은 숫자가 기존 고객번호와 중복되는지 확인하기 위해 forLoop을 돌리겠습니다.
if(cusNum == customerList[i].getCusNumber()) { //만약 매개변수 cusNum이 customerList[i]번째의 cusNumber와 같다면 (정수값이므로 == 사용)
check = false; break; // check 변수를 false로 바꿔줍니다. 불필요한 연산을 막기 위해 break도 넣어줬음.
}
}
return check; //check를 리턴값으로 돌려줍니다. 이 메소드의 실행 결과는 중복이 발생했다면 false, 아니라면 true가 되겠네요.
}
메인메소드 실행부분
case 2 :
cus = new Customer(); // 데이터를 담을 Customer타입의 인스턴스 생성.
int cuNum; // 먼저 임시로 사용할 지역변수 cuNum 선언.
System.out.println("고객번호 : ");
cuNum = scanner.nextInt(); // 스캐너로 받아온 고객번호를 cuNum에 넣어줍니다.
if(service.cusNumDup(cuNum)){ //위에서 만든 중복확인 메소드 호출. 매개변수는 방금 입력받은 cuNum.
//중복이 없다면 if(true){} 형태가 되어 바디부분이 실행될 것이고 중복이 있다면 if(false){}가 되어 else로 빠져나갈 것입니다.
cus.setCusNumber(cuNum); //중복이 없는 경우이므로 신규 고객 등록 프로세스를 진행합니다. cus인스턴스에 세터 호출. 두 번 입력받을 필요 없으므로 매개변수는 그대로 위에서 받은 cuNum입니다.
System.out.println("이름 : ");
cus.setName(scanner.next()); //이름도 입력해주고
service.inputCustomer(cus); //CustomerList 배열에 cus 인스턴스를 넣어주는 메소드 호출
System.out.println("고객 등록이 완료되었습니다."); //확인용 메세지 출력
}
else {System.out.println("중복된 번호입니다.");} //중복될 경우 else로 바로 빠져나와 에러메세지 출력. break 이후 메뉴로 돌아갑니다.
break;
차량판매 메소드
public void sellCar(int cusNum, int carNum) { // 차량 판매 메소드. 정확히는 고객의 Car타입 car변수에 해당 car를 집어넣는 메소드입니다. 고객번호와 차량번호 두 정수를 매개변수로 받아 연산을 진행하겠습니다.
Car car = null;
Customer cus = null; // 임시로 사용할 Car 타입과 Customer타입의 인스턴스를 선언 후 null값으로 초기화 하겠습니다.
int cusI = 0; // 포문으로 찾아낸 고객 번호가 몇번인지 기록해두기 위해 사용할 변수입니다.
for(int i=0; i<cusIndex; i++) { // 만약 들어온 고객번호와 일치하는 번호의 고객이 존재한다면, 그 고객을 위에서 선언한 cus 인스턴스에 넣겠다는 의미입니다.
if(cusNum == customerList[i].getCusNumber()) {
cus = customerList[i]; cusI = i; break;//또한, 현재 i값을 기억해 두기 위해 cusI에 i값을 넣습니다.
}
}
for(int i=0; i<carIndex; i++) { // 위와 같습니다. 만약 차량번호와 고객번호 모두 정확했다면 car와 cus 모두 null값이 아닌 실제 데이터가 들어있겠죠.
if(carNum == carList[i].getCarNumber()) {
car = carList[i]; break;
}
}
if( cus != null && car != null){ // cus와 car 모두 null이 아니라면, 즉 하나라도 잘못됐다면 바로 else로 빠져 에러메세지를 출력하게 했습니다.
if(cus.getCar()!=null){System.out.println("이미 등록된 차량이 있습니다.");} // 두 번호가 모두 정확했다면 고객에게 car 게터를 사용, 널값이 아니라면(이미 등록된 차량이 있을 경우) 에러메세지 출력.
else{ // 고객번호 차량번호 모두 정확했고 고객에게 등록된 차도 없을 경우가 여기에 해당되겠습니다.
cus.setCar(car); // cus에 car를 등록해줍니다.
customerList[cusI] = cus; // 이후 아까 저장해둔 cusI 변수를 활용, 실제 해당되는 고객에게 cus값을 넣습니다.
System.out.printf("%s 고객님에게 %d번 차량 판매 완료.%n",cus.getName(), car.getCarNumber()); // 판매완료 확인 메세지.
}
}
else {System.out.println("고객번호나 차량번호를 확인하세요.");}
}
메인메소드 실행부분
case 5 :
int cusNum, carNum; //sellCar 메소드 호출시 사용할 두 정수변수 선언
System.out.println("고객번호를 등록하세요");
cusNum = scanner.nextInt();
System.out.println("차량 번호를 등록하세요");
carNum = scanner.nextInt();
service.sellCar(cusNum, carNum); // 스캐너로 받은 두 변수를 사용해 sellCar 메소드 호출.
break;
콘솔창
최초 요구하신 기능과 조금 차이가 있어 시간 내어 더 손 볼 예정입니다.
일단 구현한 기능은 모두 에러 없이 잘 돌아갑니다. 이상입니다.