📌Q094 Class
package com.test.question.q94;
import java.text.DecimalFormat;
public class Q094 {
public static void main(String[] args) {
/*
● 요구사항
과자(Bugles) 클래스를 설계하시오.
● 조건
- Bugles 객체의 정보
- 가격, 용량, 생산일자, 유통기한
- 모든 멤버 변수의 접근 지정자는 private으로 한다.
- 멤버 접근을 위한 Setter와 Getter를 정의한다.
- 용량 : 쓰기 전용, 300g, 500g, 850g
- 가격 : 읽기 전용, 850원(300g), 1200원(500g), 1950원(850g)
- 생산일자 : 쓰기 전용(Calendar)
- 남은유통기한 : 읽기 전용, 생산된 제품의 유통기한 기준 : 7일(300g), 10일(500g), 15일(850g)
- Bugles 객체 메소드
- void eat() : 과자 먹기
- 먹을수 있는 날짜 = 유통기한 - 현재 - 제조시간
- 5 : 먹을 수 있는 날짜가 5일 남음
- -3 : 먹을 수 있는 날짜가 3일 지남
● 기초 코드
class Bugles {
private int price;
private int weight;
private Calendar creationTime;
private int expiration;
//getter, setter 구현
public void eat() {
}
}
● 호출
Bugles snack = new Bugles();
snack.setSize(500);
snack.setCreationTime("2023-07-27");
System.out.println("가격 : " + snack.getPrice() + "원");
System.out.println("유통 기한이 " + snack.getExpiration() + "일 남았습니다.");
snack.eat();
Bugles snack2 = new Bugles();
snack2.setSize(300);
snack2.setCreationTime("2023-07-19");
System.out.println("가격 : " + snack2.getPrice() + "원");
System.out.println("유통 기한이 " + snack2.getExpiration() + "일 남았습니다.");
snack2.eat();
● 출력
가격 : 1,200원
유통기한 : 5일 남았습니다.
과자를 맛있게 먹습니다.
가격 : 850원
유통 기한이 -6일 남았습니다.
유통기한이 지나 먹을 수 없습니다.
*/
DecimalFormat formatter = new DecimalFormat("###,###");
Bugles snack = new Bugles();
snack.setWeight(500);
snack.setCreationTime("2023-07-27");
System.out.println("가격 : " + formatter.format(snack.getPrice()) + "원");
System.out.println("유통 기한이 " + snack.getExpiration() + "일 남았습니다.");
snack.eat();
Bugles snack2 = new Bugles();
snack2.setWeight(300);
snack2.setCreationTime("2023-07-19");
System.out.println("가격 : " + formatter.format(snack2.getPrice()) + "원");
System.out.println("유통 기한이 " + snack2.getExpiration() + "일 남았습니다.");
snack2.eat();
}
}
📌Bugles Class
package com.test.question.q94;
import java.util.Calendar;
public class Bugles {
private int price;
private int weight;
private Calendar creationTime;
private int expiration;
// 남은 유통기한 검증
public void eat() {
if (getExpiration() >= 0) {
System.out.println("과자를 맛있게 먹습니다.");
} else {
System.out.println("유통기한이 지나 먹을 수 없습니다.");
}
}
public int getPrice() {
return price;
}
/*
// 다른 방법
public String getPrice() {
return String.format("%,d", price);
}
*/
// 용량별 가격 850원(300g), 1200원(500g), 1950원(850g)
public void setWeight(int weight) {
if (weight == 300 || weight == 500 || weight == 850) {
this.weight = weight;
}
if (weight == 300) {
this.price = 850;
} else if (weight == 500) {
this.price = 1200;
} else if (weight == 850) {
this.price = 1950;
}
}
public void setCreationTime(String date) {
// 생산일자 추출
int year = Integer.parseInt(date.substring(0, 4));
int month = Integer.parseInt(date.substring(5, 7)) - 1;
int day = Integer.parseInt(date.substring(8));
Calendar c = Calendar.getInstance();
c.set(year, month, day);
this.creationTime = c;
}
// 남은 유통기한 7일(300g), 10일(500g), 15일(850g)
public int getExpiration() {
Calendar now = Calendar.getInstance();
// 유통기한 계산
if (this.weight == 300) {
expiration = 7;
} else if (this.weight == 500) {
expiration = 10;
} else if (this.weight == 850) {
expiration = 15;
}
// 남은 유통기한 계산
return this.expiration - (int) ((now.getTimeInMillis() - this.creationTime.getTimeInMillis()) / 1000 / 60 / 60 / 24);
}
}
📌요구사항 분석
클래스 디자인
public class Bugles {
private int price;
private int weight;
private Calendar creationTime;
private int expiration;
}
'과자'를 나타내는 Bugles 클래스의 설계와 구현 과정을 살펴보고, 남은 유통기한을 계산하는 기능을 구현해보도록 하자.
Bugles 클래스는 과자의 정보를 담고 있다. 그리고 가격, 용량, 생산일자, 유통기한 등의 정보를 멤버 변수로 가진다.
이러한 멤버 변수는 private으로 선언되어 캡슐화가 되며, Setter와 Getter 메소드를 통해 캡슐화된 멤버 변수들을 접근하도록 설계하도록 한다.
캡슐화를 통해 데이터를 외부로부터 보호하고 필요할 때에만 멤버 변수를 수정할 수 있게 된다.
Setter & Getter 메소드
public void setWeight(int weight) {
if (weight == 300 || weight == 500 || weight == 850) {
this.weight = weight;
}
if (weight == 300) {
this.price = 850;
} else if (weight == 500) {
this.price = 1200;
} else if (weight == 850) {
this.price = 1950;
}
}
Bugles 클래스에서 용량과 가격의 설정은 Setter 메소드를 통해 설정된다.
용량에 따른 가격 설정은 조건문을 활용하여 구현하고, 생성일자를 문자열로 입력받아 Calendar 객체로 변환하여 저장하는 로직을 구현했다.
남은 유통기한 계산
public int getExpiration() {
Calendar now = Calendar.getInstance();
// 유통기한 계산
if (this.weight == 300) {
expiration = 7;
} else if (this.weight == 500) {
expiration = 10;
} else if (this.weight == 850) {
expiration = 15;
}
// 남은 유통기한 계산
return this.expiration - (int)((now.getTimeInMillis() - this.creationTime.getTimeInMillis()) / 1000 / 60 / 60 / 24);
}
남은 유통기한을 구하는 계산식은 유통기한(expiration) - 현재 날짜(now) - 제조시간(creationTime) 값을 milliSecond(1000), second(60), minute(60), hour(24)로 나누어 일(day) 단위로 계산 결과가 나오도록 했다.
Calendar 클래스를 사용하여 현재 날짜를 가져오고, 해당 클래스의 생성일자와 유통기한을 기준으로 계산하여 반환하는 방식으로 구현했다.
조건부 메소드 호출
public void eat() {
if (getExpiration() >= 0) {
System.out.println("과자를 맛있게 먹습니다.");
} else {
System.out.println("유통기한이 지나 먹을 수 없습니다.");
}
}
Bugles 클래스의 eat() 메소드는 남은 유통기한에 따라 다른 메시지를 출력하도록 했다.
남은 유통기한이 0보다 크거나 같으면 과자를 맛있게 먹을 수 있다는 메시지를 출력하며, 그렇지 않으면 유통기한이 지나 먹을 수 없다는 메시지를 출력한다.
각각의 메소드는 그 기능이 명확해야 한다. 그리고 그러기 위해선 메소드마다 각각 하나의 기능만을 가지게 하는 것이 좋다. 유통기한을 계산하는 기능을 getExpiration() 메소드로 분리하고, eat() 메소드에서는 유통기한을 판별하기만 하는 이유가 이 때문이다.
이렇듯 소프트웨어의 규모를 여러 조각으로 분할하는 것을 모듈화라고 한다. 소프트웨어를 개발할 때 모듈화는 굉장히 중요하다. 추가적인 정보는 다음 글을 참고하도록 하자!