hahn

JAVA 생성자 이해하기 - 실습 본문

개발 실습/JAVA

JAVA 생성자 이해하기 - 실습

hahn 2021. 6. 1. 18:59
728x90
반응형
package javabasic1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

class Car{
	
	private Map<String, Object> carInfo = new HashMap<String, Object>();
	
	//차량명
	public void setCarName(String carName) {
		this.carInfo.put("carName", carName);
	}
	
	//차량복합연비
	public void setComplexFuelEfficiency(double complexFuelEfficiency) {
		this.carInfo.put("complexFuelEfficiency", complexFuelEfficiency);
	}
	
	//차량연료탱크크기
	public void setFuelTankSize(double fuelTankSize) {
		this.carInfo.put("fuelTankSize", fuelTankSize);
	}
	
	public Map<String, Object> getCarInfo(){
		return carInfo;
	}
	
}

class Move{
	
	Move(double length, Map<String, Object> carInfo){
		if(length/(double)carInfo.get("complexFuelEfficiency")/(double)carInfo.get("fuelTankSize")*100 > 100) {
			System.out.printf("차량 이름은 %s(으)로 %.1f km이동 시 약 %.1f리터의 연료가 필요하고, 연료탱크의 약 %.1f퍼센트를 차지하므로 중간에 주유가 필요합니다.",carInfo.get("carName"),length,length/(double)carInfo.get("complexFuelEfficiency"),length/(double)carInfo.get("complexFuelEfficiency")/(double)carInfo.get("fuelTankSize")*100);
		}else {
			System.out.printf("차량 이름은 %s(으)로 %.1fkm이동 시 약 %.1f리터의 연료가 필요하고, 연료탱크의 약 %.1f퍼센트를 차지합니다.",carInfo.get("carName"),length,length/(double)carInfo.get("complexFuelEfficiency"),length/(double)carInfo.get("complexFuelEfficiency")/(double)carInfo.get("fuelTankSize")*100);
		}
	};
	
}


public class JavaBasic3 {

	public static void main(String[] args) throws IOException {
		
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		Car car = new Car();
		
		System.out.println("차량명");
		car.setCarName(bf.readLine());
		try {
			System.out.println("복합연비(km/l)");
			car.setComplexFuelEfficiency(Double.valueOf(bf.readLine()));
			System.out.println("연료탱크용량(l)");
			car.setFuelTankSize(Double.valueOf(bf.readLine()));
			System.out.println("이동 거리(km)");
			new Move(Double.valueOf(bf.readLine()), car.getCarInfo());
		}catch(Exception e){
			System.out.println("올바른 데이터를 입력해주세요");
			return;
		}
		
	}

}

지난주에 시험 준비한다고 수업을 하나도 못 들어서 선생님이 내주시는 실습을 1도 못하겠기에

 

그냥 인터넷에 검색하면서 어떻게 하는 건지 찾아보다 도저히 몰라서

 

컴활 문제나 풀어보고 있었는데 선생님께서 정색하시면서 앞에 있는 것 좀 해보라고 하셨다.

 

실습 문제는 Car 클래스를 생성하고 Move 클래스에 차량의 이동 정보를 담는 것이었다.

 

한 소리 듣고 쫄아서 그냥 되는대로 해보자 마음먹고 일단 차량에 관한 정보를 얻기 위해

 

차량 제원표를 검색해봤다 그중 이동과 관련하여 키워드 중 연비, 연료탱크용량을 이용하여

 

거리 이동 시 남은 연료량을 알려주는 코드를 짜려 했다. 나는 이를 map으로 담아서

 

다시 Move 클래스에 넣어 map을 풀어 데이터를 가공하여 정보를 출력하게 하였다.

 

선생님께서 와서 보시고는 map으로 속성을 입력하는 게 아니고,

 

전에 했던 dto처럼 객체를 하나 생성하고 거기에 속성을 담아주는 개념이라고 하셨다.

 

또한 Move 클래스는 이동 정보를 담는 거라고 그냥 두루뭉술하게 말씀해 주셨다.

 

package javabasic1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Car{
	
	private String carName;
	private double carSpeed;
	private double complexFuelEfficiency;
	private double fuelTankSize;
	
	//차이름
	public String getCarName() {
		return carName;
	}
	public void setCarName(String carName) {
		this.carName = carName;
	}
	
	//차속도
	public double getCarSpeed() {
		return carSpeed;
	}
	public void setCarSpeed(double carSpeed) {
		this.carSpeed = carSpeed;
	}
	
	//복합연비
	public double getComplexFuelEfficiency() {
		return complexFuelEfficiency;
	}
	public void setComplexFuelEfficiency(double complexFuelEfficiency) {
		this.complexFuelEfficiency = complexFuelEfficiency;
	}
	
	//연료탱크크기
	public double getFuelTankSize() {
		return fuelTankSize;
	}
	public void setFuelTankSize(double fuelTankSize) {
		this.fuelTankSize = fuelTankSize;
	}	
	
}

class Move{
	Move(Car carInfo){
		String car = "🚗";
		//남은 연료
		double extraFuel = carInfo.getFuelTankSize();
		System.out.printf("차량명은 %s 입니다.\n", carInfo.getCarName());
		//print 횟수 (100km/속도)
		for(int i = 1; i < Math.ceil(100/carInfo.getCarSpeed()) + 1; i++) {
			//시간 당으로 도식
			for(int j = 0; j < Math.floor(carInfo.getCarSpeed()); j++) {
				//100km까지만 진행
				car = "_" + car;
				if(i*j > 100) break;
			}
			
			//1시간 진행 가능한 연료 없을 시 종료
			if(extraFuel < carInfo.getComplexFuelEfficiency()) {
				System.out.println("연료가 부족합니다. 종료합니다.");
				break;
			}
			double finalPoint = i*carInfo.getCarSpeed();
			if(finalPoint > 100) finalPoint = 100;
//			System.out.println(i +"시간 후" + i*carInfo.getCarSpeed() + "km 지점입니다.");
			System.out.printf("%d 시간 후 약 %.1f km 지점입니다.\n", i, finalPoint );
			System.out.printf("%-99s\n", car);
			System.out.println("____________________________________________________________________________________________________");
			System.out.println("S         10        20        30        40        50        60        70        80        90       E");
			
			//남은 연료 계산
			extraFuel -= carInfo.getCarSpeed()/carInfo.getComplexFuelEfficiency();
		}
		System.out.printf("남은 연료는 %.0f입니다", extraFuel);
	}
}
	


public class JavaBasic4 {

	public static void main(String[] args) throws IOException {
		
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		try {
			Car car = new Car();
			System.out.println("차량이름");
			car.setCarName(bf.readLine());
			System.out.println("차량속도(km/h)");
			car.setCarSpeed(Double.parseDouble(bf.readLine()));
			System.out.println("복합연비(km/l)");
			car.setComplexFuelEfficiency(Double.parseDouble(bf.readLine()));
			System.out.println("연료탱크크기(l)");
			car.setFuelTankSize(Double.parseDouble(bf.readLine()));
			new Move(car);
		}catch(Exception e){
			System.out.println("올바른 데이터를 입력해주세요");
		}
	}
}

일단 Car 클래스는 어떻게 구성해야 하는지 바로 감이 잡혔는데

 

Move는 도대체 어떻게 작성해야 할지 감도 안 잡혀서 좀 고민을 하던 찰나

 

이를 도식화하는 방법으로 해보자고 마음을 먹고 일단 메모장에

 

도로에 해당하는 _을 100번 입력하고, 아래 숫자로 대략적으로 어디에 있는지

 

볼 수 있도록 표시하였다. 문제는 차를 어떻게 표현할지었는데 처음에는 그냥 

 

ㅁ으로 표시하였는데 교육원 동기가 이모지를 이용해서 좀 그럴듯한 문자를

 

넣어줬다. 일단 처음에는 그냥 장식용?으로 차 이름을 받고, 차량 속도를 받아서

 

이를 1시간당으로 불연속적으로 나타내고자 이중으로 for 문을 사용해서

 

내부 for 문이 종료되면 출력이 한 번씩 되게 구성하였고, 처음에는

 

공백으로 진행 상황을 보여주려 했는데 _와 공백의 너비가 맞지 않아서

 

_를 기준으로 잡아줬다. 암튼 실행했을 때 나름 만족할만한 결과가 나왔었는데

 

처음에 차량 속성으로 생각해둔 차량 연료 탱크와 연비를 어떻게 활용할까 생각하다가

 

차는 연료가 없으면 더 이상 진행하지 못하니 그를 나타내보고자

 

차량에 연료가 100%라는 가정 하에 for 문이 끝날 때마다 연료가 감소하게 설정하였고,

 

1시간 진행하지 못하면 for 문이 종료하게 하였다.

 

또한 차량이 100km 이상 진행 시 console 창에 _로 묘사해둔 레일을 벗어나 보기 안 좋아서

 

i*j가 100을 초과하게 될 때도 for 문이 종료하게 하였다.

 

대략적으로는 완성이 되었는데 여러 경우로 테스트를 해보니 고쳐야 할 게 너무 많아서

 

그냥 여기서 더 이상 건들지 않기로 했다. 중요한 것은 객체지향을 이해하는 것이니

 

목표는 달성했다고 생각한다. 


원래 팀 별로 발표하는 것이었는데 나는 팀이 없어 그냥 코드만 리뷰해 주신다고 했는데

 

갑자기 발표를 하라고 하셨다. 안 하려 했는데 분위기에 밀려 발표를 하게 되었다.

 

학교 졸업하고 나서 처음 해보는 발표라 그런지 별로 만족스럽지는 못했다.

 

특히 내가 고민했던 부분을 좀 자세하게 표현하지 못함에 아쉬움을 느꼈다.

 

선생님께서 피드백해 주신 내용으로는 어차피 하나의 역할을 묘사하니 필드를 구성 안한 것 같은데

(솔직히 필드가 뭔지도 몰랐고, 그냥 귀찮아서 생성하면 바로 출력되게 하였다.)

 

다음부터는 필드를 구성해서 다른 곳에서도 이용할 수 있도록 하는 것이 좋다고 하셨다.

 

나중에 찾아보니 필드가 Car에서 private로 선언된 부분이었다.

 

또 원래 입력받을 때 나는 Scanner를 사용했었는데 BufferedReader, InputStreamReader를

 

사용하시길래 찾아보니까 용도는 똑같은데 후자가 더 빠르다고 한다.

 

완성된 코드 고쳐야할 게 많지만 안할거다. ㅋㅋㅋㄲ

 

 

728x90
반응형

'개발 실습 > JAVA' 카테고리의 다른 글

JAVA Interface, abstract 이해(게임 만들기)  (0) 2021.07.19