일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 별 찍기
- 조합론
- 사칙연산
- 이분 탐색
- 프로그래머스
- 유클리드 호제법
- 정렬
- LeetCode 83번
- 자료 구조
- 연결리스트 정렬
- 재귀
- 정수론
- KMP알고리즘
- 큰 수 연산
- LeetCode Remove Duplicates from Sorted List in c
- 문자열
- 문자열제곱
- 큐
- 다이나믹 프로그래밍
- 수학
- 연결리스트 중복제거
- LeetCode 83 c언어
- 해시를 사용한 집합과 맵
- 스택
- 브루트포스 알고리즘
- 구현
- 실패함수
- 시뮬레이션
- Queue
- 임의 정밀도 / 큰 수 연산
- Today
- Total
hahn
JAVA 생성자 이해하기 - 실습 본문
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를
사용하시길래 찾아보니까 용도는 똑같은데 후자가 더 빠르다고 한다.
완성된 코드 고쳐야할 게 많지만 안할거다. ㅋㅋㅋㄲ
'개발 실습 > JAVA' 카테고리의 다른 글
JAVA Interface, abstract 이해(게임 만들기) (0) | 2021.07.19 |
---|