Contents
접기
[ 문제 ] 뮤지컬 공연을 위한 입장권을 판매하는 입장권 판매 클래스를 설계하여 보자.
일반 입장권 : 공연 당일에 구매 가능하며 가격은 100,000원이다.
예약 입장권 : 공연 10일 전에 구매하면 50,000원이고, 10일 이후에 구매하면 80,000원이다.
1) 위 두 가지 유형의 입장권에 대한 상위 클래스 Ticket 을 설계하라.
( Field )
① 입장권 번호 (정수)
② 입장권 가격
( Method )
① 입장권 번호를 반환하는 getNumber()
② 입장권 가격을 반환하는 getPrice()
③ 입장권의 현재 상태를 출력하는 Override 된 toString()
2) 위의 Ticket 클래스를 확장하여 일반 입장권을 나타내는 WalkupTicket 클래스를 설계하라.
이 클래스는 주어진 번호를 가지는 WalkupTicket 객체를 생성할 수 있다.
3) 위의 Ticket 클래스를 확장하여 예약 입장권을 나타내는 AdvanceTicket 클래스를 설계하라.
이 클래스는 객체 생성 시 입장권의 번호와 공연일을 기준으로 몇 일전에 구입했는지 알려주는 일 수를 Field로 가지고 있어야 한다.
4) 위에서 작성한 클래스를 시험하는 클래스를 설계하라.
실행 결과는 아래와 같다.
번호 : 101, 가격 : 100,000
번호 : 201, 가격 : 50,000
번호 : 202, 가격 : 80,000
해결 방법 : 1 > 3 > main > 2
1) Ticket
package ticket.vo;
public abstract class Ticket {
private int number;
private int price;
public Ticket() {
super();
}
public Ticket(int number, int price) {
super();
this.number = number;
this.price = price;
}
public int getNumber() {
return number;
}
public int getPrice() {
return price;
}
public void setNumber(int number) {
this.number = number;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Ticket [number=" + number + ", price=" + price + "]";
}
}
3) AdvanceTicket
package ticket.vo;
public class AdvanceTicket extends Ticket {
private int beforeDate; // 며칠 전?
public AdvanceTicket() {
super();
}
// sub용
public AdvanceTicket(int beforeDate) {
super();
this.beforeDate = beforeDate;
if (beforeDate < 10) this.setPrice(50000);
else if (beforeDate < 5) this.setPrice(80000);
}
//부모용
// price 는 받을 필요 없다.
public AdvanceTicket(int beforeDate,int number, int price) {
super(number,price);
this.beforeDate = beforeDate;
if (beforeDate < 10) this.setPrice(50000);
else if (beforeDate < 5) this.setPrice(80000);
}
public int getBeforeDate() {
return beforeDate;
}
@Override
public String toString() {
return super.toString()+ "AdvanceTicket [beforeDay=" + beforeDate + "]";
}
}
부적절한 조건문 | 적절한 조건문 |
if (beforeDate < 10) this.setPrice(50000); if (beforeDate < 5) this.setPrice(80000); // 만약 15일 전이라면 둘 다 해당되어진다. |
if (beforeDate < 10) this.setPrice(50000); else if (beforeDate < 5) this.setPrice(80000); if 문을 else 로 무조건 나눠야한다. |
main
적절한 티켓 가격 구하는 방법은 아니지만, 이렇게 상속이 흘러간다..로 아는 예시다.
package ticket.main;
import ticket.vo.AdvanceTicket;
// import ticket.vo.AdvanceTicket;
import ticket.vo.WalkupTicket;
public class TicketMain {
public static void main(String[] args) {
//이런 방법도 가능하다....
WalkupTicket w = new WalkupTicket(101,100000);
System.out.println(w);
// 부모한테 받은 것이라고 가정됨
// 자식은 자기 자신 것만 신경쓴다.
AdvanceTicket a = new AdvanceTicket(10,102,80000);
System.out.println(a);
// AdvanceTicket 안에는 자신의 것만 나오기 때문
// Ticket은 남은 두 클래스의 공통적인 부분을 뽑아낸것
// 객체를 생성하면 안된다는 경우 --> 추상클래스
//Ticket t = new Ticket();
}
}
2) WalkupTicket
package ticket.vo;
public class WalkupTicket extends Ticket {
public WalkupTicket() {
super();
}
public WalkupTicket(int number, int price) {
super(number,price);
// 부모로부터 상속받은 두 변수를 초기화 시키는 작업이다.
}
}
main 에서 데이터를 직접 대입하는 것이 아닌 날짜만 기입했을때 해당 가격이 나오게 하고 싶다면?
원래 코드 | 원하는 코드 |
AdvanceTicket a = new AdvanceTicket(10,102,80000); |
AdvanceTicket a = new AdvanceTicket(9); |
AdvancedTicket 에서 바꿔야한다. |
|
public AdvanceTicket(int beforeDate) { super(); this.beforeDate = beforeDate; if (beforeDate < 10) this.setPrice(50000); else if (beforeDate < 5) this.setPrice(80000); } |
public AdvanceTicket(int beforeDate) { super(); this.beforeDate = beforeDate; if (beforeDate < 10) { setPrice(50000); } else if (beforeDate < 5) { setPrice(80000); } |
일단 괄호를 확실히 하여 구분지어 준다 (이 사소한 차이로도 오류가 난다..) | |
public AdvanceTicket(int beforeDate,int number, int price) { super(number,price); this.beforeDate = beforeDate; if (beforeDate < 10) this.setPrice(50000); else if (beforeDate < 5) this.setPrice(80000); } |
해당 코드를 전부 주석 처리 하면 된다. |
Ticket [number=0, price=50000]AdvanceTicket [beforeDay=9] (원하는 출력값이 나오게 된다) |
'국비 교육 > 백엔드(Java, Spring)' 카테고리의 다른 글
[자바] ArrayList, HashSet, HashMap (0) | 2024.01.29 |
---|---|
[자바] 다형성(polymorphism) 예제 - 도형 프로그램 설계 (0) | 2024.01.29 |
[자바] 상속(Inheritance), 오버라이딩(Overriding), 추상화 클래스 (Abstract Class) (0) | 2024.01.25 |
[자바] 피트니스 관리 프로젝트 - v3 (0) | 2024.01.25 |