추상클래스(abstract)

6690 단어 JavaJava

추상클래스의 이해

추상적으로 정의를 하고 사용자가 꼭 재정의(Overriding)을 해야한다.
강제로 부모클래스에서 자식클래스에게 메서드를 강제로abstract를 사용하여 재정의 하게 할수 있다.

문법 : public abstract void 메서드명 ();
접근제한 abstract 리턴타입 메서드명 ();

추상 메서드를 사용하기위해서는 추상클래스 안에서 사용해야한다.

추상 클래스 상속과 일반적인 상속의 차이

부모클래스의 메소드를 자식 클래스에서 변경할 일이 없다면 일반 클래스를 이용한 상속이 좋다.
하지만 자식클래스에서 꼭 재정의 해야하는 부분이 있다면, 추상 클래스를 이용하여 강제로 재정의 하게 해야 합니다.

예제
ex) 본사에서는 메뉴에 대한 가격만 정해주고 매장에서 주변환경에 맞게 가격을 책정한다(Overriding)을 한다.

본사 클래스 
package sutdy.java.ex_14_extend_abstract_ex;

public abstract class BonsaClass {

	public abstract void kimchiWlro();
	public abstract void budaeWlro();
	public abstract void bibimbab();
	public abstract void sundaekook();
	public abstract void gonggibab();
	
}
package sutdy.java.ex_14_extend_abstract_ex;

public class StoreNum1 extends BonsaClass{

	/*
	 * 주택가에 매장 1호점
	 * 김치찌개 : 4500원
	 * 부대찌개 : 5000원
	 * 비빔밥 : 6000원
	 * 순대국 : 판매하지 않음
	 * 공기밥 : 1000원
	 */
	
	@Override
	public void kimchiWlro() {
		System.out.println(" 주택가의 김치찌개 가격은 : 4500원 입니다.");
	}

	@Override
	public void budaeWlro() {
		System.out.println(" 주택가의 부대찌개 가격은 : 5000원 입니다.");
	}

	@Override
	public void bibimbab() {
		System.out.println(" 주택가의 비빔밥 가격은 : 6000원 입니다.");
	}

	@Override
	public void sundaekook() {
		System.out.println(" 주택가의 순대국 가격은 : 없습니다. 판매하지 않습니다.");
	}

	@Override
	public void gonggibab() {
		System.out.println(" 주택가의 공기밥 가격은 : 1000원 입니다.");
	}

}
package sutdy.java.ex_14_extend_abstract_ex;

public class StoreNum2 extends BonsaClass{

	/*
	 * 대학가의 매장 1호점
	 * 김치찌개 : 5000원
	 * 부대찌개 : 5000원
	 * 비빔밥 : 5000원
	 * 순대국 : 4000원
	 * 공기밥 : 무료
	 */
	
	@Override
	public void kimchiWlro() {
		System.out.println(" 대학가의 김치찌개 가격은 : 5000원 입니다.");
	}

	@Override
	public void budaeWlro() {
		System.out.println(" 대학가의 부대찌개 가격은 : 5000원 입니다.");
	}

	@Override
	public void bibimbab() {
		System.out.println(" 대학가의 비빔밥 가격은 : 5000원 입니다.");
	}

	@Override
	public void sundaekook() {
		System.out.println(" 대학가의 순대국 가격은 : 4000원 입니다.");
	}

	@Override
	public void gonggibab() {
		System.out.println(" 대학가의 공기밥 가격은 : 무료입니다.");
	}

}
package sutdy.java.ex_14_extend_abstract_ex;

public class StoreNum3 extends BonsaClass{

	/*
	 * 증권가의 매장 3호점
	 * 김치찌개 : 6000원
	 * 부대찌개 : 7000원
	 * 비빔밥 : 7000원
	 * 순대국 : 6000원
	 * 공기밥 : 1000원
	 */
	
	@Override
	public void kimchiWlro() {
		System.out.println(" 증권가의 김치찌개 가격은 : 6000원 입니다.");
	}

	@Override
	public void budaeWlro() {
		System.out.println(" 증권가의 부대찌개 가격은 : 7000원 입니다.");
	}

	@Override
	public void bibimbab() {
		System.out.println(" 증권가의 비빔밥 가격은 : 7000원 입니다.");
	}

	@Override
	public void sundaekook() {
		System.out.println(" 증권가의 순대국 가격은 : 6000원 입니다.");
	}

	@Override
	public void gonggibab() {
		System.out.println(" 증권가의 공기밥 가격은 : 1000원 입니다.");
	}

}
package sutdy.java.ex_14_extend_abstract_ex;

public class MainClass {

	public static void main(String[] args) {
		
		BonsaClass bc = new StoreNum1();
		BonsaClass bc1 = new StoreNum2();
		BonsaClass bc2 = new StoreNum3();
		
		System.out.println("주택가의 가격표입니다.");
		bc.kimchiWlro();
		bc.budaeWlro();
		bc.bibimbab();
		bc.sundaekook();
		bc.gonggibab();
		System.out.println("----------------");
		
		System.out.println("대학가의 가격표입니다.");
		bc1.kimchiWlro();
		bc1.budaeWlro();
		bc1.bibimbab();
		bc1.sundaekook();
		bc1.gonggibab();
		System.out.println("----------------");
		
		System.out.println("증권가의 가격표입니다.");
		bc2.kimchiWlro();
		bc2.budaeWlro();
		bc2.bibimbab();
		bc2.sundaekook();
		bc2.gonggibab();
		System.out.println("----------------");
		
	}
}

예제 하면서 배운것 : 메인메서드에서 호출을 할때 추상클래스를 정의해놓은 클래스는 생성자를 생성할수 없다. 고로 사용할려는 클래스를 뒤에 붙여준다.

예제 - 어린이집 아이들의 식대 계산
시나리오
어린이들은 점심으로 쌀밥, 불고기, 두부조림, 미역국이 배식됩니다.
기본적으로 쌀밥, 불고기, 두부조림, 미역국은 모든 아이들이 먹습니다.
하지만 개인체질에 따라서 간식은 선택 할 수가 있습니다. 특히 알레르리기가 있는 아이들은 간식을 전부 선택하지 않을 수 도 있습니다.
!!가격은 따로 클래스를 만들어 변하지않는 고정값으로 해놓는다.

  • ChildClass1 아이들
    * 쌀밥, 불고기, 바나나
  • ChildClass2 아이들
    * 쌀밥, 불고기, 우유, 아몬드
package sutdy.java.ex14_extend_abstract_ex_ChildLunchMenu;

public abstract class LunchMenu {

	public int rice;
	public int bulgogi;
	public int banana;
	public int milk;
	public int almond;
	
	public LunchMenu(int rice, int bulgogi, int banana, int milk, int almond) {
		this.rice = rice;
		this.bulgogi = bulgogi;
		this.banana = banana;
		this.milk = milk;
		this.almond = almond;
	}
	
	public abstract int cal();
}
package sutdy.java.ex14_extend_abstract_ex_ChildLunchMenu;

public class PriceClass {

	public static final int RICE = 1000;
	public static final int BULGOGI = 2000;
	public static final int BANANA = 500;
	public static final int MILK = 300;
	public static final int ALMOND = 100;
}
package sutdy.java.ex14_extend_abstract_ex_ChildLunchMenu;

public class FirstChild extends LunchMenu{

	public FirstChild(int rice, int bulgogi, int banana, int milk, int almond) {
		super(rice, bulgogi, banana, milk, almond);
	}

	@Override
	public int cal() {
		return rice + bulgogi + banana;
	}

	
}
package sutdy.java.ex14_extend_abstract_ex_ChildLunchMenu;

public class SecondChild extends LunchMenu{

	public SecondChild(int rice, int bulgogi, int banana, int milk, int almond) {
		super(rice, bulgogi, banana, milk, almond);
	}

	@Override
	public int cal() {
		return rice + bulgogi + milk + almond;
	}

}
package sutdy.java.ex14_extend_abstract_ex_ChildLunchMenu;

public class MainClass {

	public static void main(String[] args) {
		
		LunchMenu lm = new FirstChild(PriceClass.RICE, PriceClass.BULGOGI, PriceClass.BANANA, PriceClass.MILK, PriceClass.ALMOND);
		LunchMenu lm2 = new SecondChild(PriceClass.RICE, PriceClass.BULGOGI, PriceClass.BANANA, PriceClass.MILK, PriceClass.ALMOND);
		
		
		System.out.println(" 첫번째 아이의 밥값은 ? " + lm.cal());
		System.out.println(" 두번째 아이의 밥값은 ? " + lm2.cal());
	}
}

@결과값

좋은 웹페이지 즐겨찾기