: 상속 클래스를 만들어, 그 클래스를 사용하도록 강제함
문법
abstract class A{
public abstract int b();
public void d() {
System.out.println("world");
}
}
public class AbstractDemo {
public static void main(String[] args) {
A obj = new A();
}
}
abstract class A{
public abstract int b(); => 메소드의 구체적 로직을 담는 본체 없고, 메소드에 대한 시그니처만 갖고 있는 추상적인 모습 => 반드시 메소드를 오버라이딩해야 함
public void d() {
System.out.println("world");
}
}
class B extends A {}
public class AbstractDemo {
public static void main(String[] args) {
B obj = new B();
}
}
abstract class A{ //메소드 중 하나라도 abstract면 그 클래스는 abstract 클래스
public abstract int b(); //본체 있는 메소드는 abstract 키워드 사용 불가 ex. public abstract int c(){System.out.println("hi")}
public void d() { //추상 클래스 내에는 추상메소드가 아닌 메소드도 존재할 수 있음
System.out.println("world");
}
}
class B extends A {
public int b() {
return 1;
}
}
public class AbstractDemo {
public static void main(String[] args) {
B obj = new B();
}
}
=> 구체적인 구현은 사용자에게 넘기는 것
사용 이유
부모 클래스 내 메소드의 시그니처만 정의하고, 그 메소드의 실제 동작 방법은 하위 클래스의 책임으로 위임함
=> 큰 프로젝트에서 사용됨
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);
}
}
public class CalculatorDemo {
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();
}
}
abstract class Calculator{
int left, right;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
int _sum(){
return this.left + this.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 :"+_sum()};
}
public void avg(){
System.out.println("+ avg :"+(this.left+this.right)/2);
}
}
class CalculatorDecoMinus extends Calculator {
public void sum(){
System.out.println("- sum :"+_sum());
}
public void avg(){
System.out.println("- avg :"+(this.left+this.right)/2);
}
}
public class CalculatorDemo {
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();
}
}
디자인 패턴
template method pattern