문제

실습 : 차량판매 시스템

선택하세요. [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;

콘솔창
이미지1

최초 요구하신 기능과 조금 차이가 있어 시간 내어 더 손 볼 예정입니다.

일단 구현한 기능은 모두 에러 없이 잘 돌아갑니다. 이상입니다.