728x90
반응형
abstract 은 상속을 강제하는 일종의 규제
abstract 클래스나 메서드를 사용하기 위해서는 반드시 상속해서 사용하도록 강제하는 것이다
추상메소드 : 메서드의 시그니처만이 정의된 비어있는 메소드
추상클래스에는 추상 메소드가 아닌 메소드가 존재할 수 있다
메소드의 시그니처만 정의되어 있고(내용이 비어있음) 이 메소드의 구체적인 구현은 하위클래스에서 오버라이딩해야함. 인스턴스화 시킬수도없음.
//Please don't change class name 'Main'
abstract class A{
public abstract int b();
public void d(){
System.out.println("world");
}
}
class B extends A{
public int b(){return 1;}
}
class Main {
public static void main(String[] args) {
B obj = new B();
System.out.println(obj.b());
}
}
//1
//Please don't change class name 'Main'
abstract class Calculator{
int left, right;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
public abstract void sum();
public abstract void avg();
public void run(){
sum();
avg();
}
}
class CalculatorDecoPlus extends Calculator {
public void sum(){
System.out.println("+ sum :"+(this.left+this.right));
}
public void avg(){
System.out.println("+ avg :"+(this.left+this.right)/2);
}
}
class CalculatorDecoMinus extends Calculator {
public void sum(){
System.out.println("- sum :"+(this.left+this.right));
}
public void avg(){
System.out.println("- avg :"+(this.left+this.right)/2);
}
}
class Main {
public static void main(String[] args) {
CalculatorDecoPlus c1 = new CalculatorDecoPlus();
c1.setOprands(10, 20);
c1.run();
CalculatorDecoMinus c2 = new CalculatorDecoMinus();
c2.setOprands(10, 20);
c2.run();
}
}
실행결과
+ sum :30
+ avg :15
- sum :30
- avg :15
경우에 따라서 합계와 평균을 화면에 출력하는 모습을 달리해야될 수도 있다.
이처럼 동작방법이 상황에 따라 달라지는 메소드는 추상메소드로 만들어서 하위클래스에서 구현하도록 하고
모든 클래스의 공통분모의 경우는 상위 클래스에 둬서 코드의 중복이나 유지보수의 편의성 을 꾀할수있다.
728x90
반응형