Java

abstract

Sun-Koo 2023. 3. 8. 17:03

abstract

- 메소드의 시그니처만이 정의된 비어있는 메소드를 의미

- abstract 클래스나 메소드를 사용하기 위해서는 반드시 상속해서 사용하도록 강제하는 것


ex ) 에러

abstract class A{
    public abstract int b();
    //본체가 있는 메소드는 abstract 키워드를 가질 수 없다.
    //public abstract int c(){System.out.println("Hello")}
    //추상 클래스 내에는 추상 메소드가 아닌 메소드가 존재 할 수 있다. 
    public void d(){
        System.out.println("world");
    }
}
public class AbstractDemo {
    public static void main(String[] args) {
        A obj = new A();
    }
}

추상 클래스이므로 에러 발생 상속해서 사용해야한다.

 메소드 b의 선언 부분에는 abstract라는 키워드가 등장하고 있다. 이 키워드는 메소드 b는 메소드의 시그니처만 정의 되어 있고 이 메소드의 구체적인 구현은 하위 클래스에서 오버라이딩 해야 한다는 의미다.

 

해결 방법

abstract class A{
    public abstract int b();
    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();
        System.out.println(obj.b());
    }
}

결론 :

  • 추상메소드는 바로 사용 불가 
  • 상속받아 사용해야 한다,
  • 상속받은 클래스에서 오버라이딩을 해줘야한다.
  • abstract 메소드를 가진 클래스도 abstract 클래스가 된다
  • 구체적인 로직을 가진 메소드도 가질 수 있다.

추상 클래스를 사용하는 이유

  • 상속을 강제하기 위한 규제
  • 메소드를 상속 받은 하위 클래스의 책임으로 위임하기 위해 사용
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(); 
        //결과 : + sum : 30 , + avg : 15
         
        CalculatorDecoMinus c2 = new CalculatorDecoMinus();
        c2.setOprands(10, 20);
        c2.run();
        // 결과 : - sum : 30 , - avg : 15
    }
   
}

디자인 패턴

프로그래밍이라는 것은 반복되는 패턴이 있다.

이런 패턴들을 모아서 정리한 것이 디자인 패턴(design pattern)이다

디자인 패턴의 장점

  • 좋은 설계를 단기간에 학습할 수 있다
  • 소통에 도움이 된다는 점이다.  설계 방법을 토의하거나 전달할 때 설계 방법에 따라 적절한 이름이 있다면 상호간에 생각을 일치시키는 데 큰 도움이 될 것이다