추상클래스(abstract)
추상클래스의 이해
추상적으로 정의를 하고 사용자가 꼭 재정의(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());
}
}
@결과값
Author And Source
이 문제에 관하여(추상클래스(abstract)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yoonhoo/추상클래스abstract저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)