1. 추상클래스의 문법
abstract class A {
// 이렇게 메소드 표준만 구현하고 그 구체적인 내용은 요 메소드를 포함하는 클래스를 상속하는 클래스가 작성!
public abstract int alpah();
// 다음은 틀린 문법!
/*
* public abstract void beta() { System.out.println("hello"); }
*/
// 추상 클래스내 일반 메소드 작성 가능!
public void gamma() {
System.out.println("안녕");
}
}
이렇게 작성한 A를 구현하는 B는 반드시 구체적인 내용을 작성해야 한다.
class B extends A {
public int alpah() {
return 1;
}
}
main 메소드에서는 추상 클래스인 A 클래스를 인스턴스화 할 수 없다.
public class AbstractDemo {
public static void main(String[] args) {
// 에러가 뜬다!
A obj = new A();
}
}
2. 추상 클래스를 사용하는 이유
상속을 강제한다.
하위클래스를 강제로 사용하게 함으로써, 공통된 로직은 중복이 안되게, 공통이 안 되는(개별적인) 로직만 따로 작성하기 위해서
예시
package org.opentutorials.javatutorials.abstractclass.example3;
public class CalculatorDemo {
public static void main(String[] args) {
CalculatorDecoPlus c1 = new CalculatorDecoPlus();
c1.setOperands(10, 20);
c1.run();
CalculatorDecoMinus c2 = new CalculatorDecoMinus();
c2.setOperands(10, 20);
c2.run();
}
}
abstract class Calculator {
int left, right;
public void setOperands(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 {
@Override
public void sum() {
System.out.println("+ sum :" + (this.left + this.right));
}
@Override
public void avg() {
System.out.println("+ avg :" + (this.left + this.right) / 2);
}
}
class CalculatorDecoMinus extends Calculator {
@Override
public void sum() {
System.out.println("- sum :" + (this.left + this.right));
}
@Override
public void avg() {
System.out.println("- avg :" + (this.left + this.right) / 2);
}
}
일단 결과
+ sum :30
+ avg :15
- sum :30
- avg :15
설명
run() 메소드와 setOperands()를 추상클래스에 작성함으로써, Calculator를 상속하는 모든 클래스에 대해 공통적인 로직을 제공
그런데 예제를 보니 공통된 것이 보이지 않는가?
요것도 상위클래스로 올려버리자
소스출처 : 생활코딩
참고 : 생활코딩