본문 바로가기
국비 교육/백엔드(Java, Spring)

[자바] 상속, 오버라이딩, 추상화 클래스 예제 - 입장권 판매

by 육츠 2024. 1. 25.
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] (원하는 출력값이 나오게 된다)