Java abstract

별의개발자커비·2023년 2월 15일
0

Java

목록 보기
43/66
post-thumbnail

abstract 문법

  • 추상을 강제하는 애
abstract class A{ // 클래스 A = 추상클래스 --> 꼭 상속받아서 써야함
public abstract int b(); // 메소드 b는 추상메소드(abstract), {}이 없는 특징
// --> 메소드의 구체적인 로직을 담고 있는 본체는 없고 메소드의 시그니처만 정의됨.
// 사용하려면 메소드 b를 오버라이딩 해서 상속받은 애가 로직 새로 해서 써야함

    //본체가 있는 메소드는 abstract 키워드를 가질 수 없다.
    public abstract int c(){System.out.println("Hello")} // 안됨.
    //추상 클래스 내에는 추상 메소드가 아닌 메소드(void d)가 존재 할 수 있다. 
    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());
    }
}

abstract 사용 이유

사용자가 직접 조작해야하는 부분만 조작할 수 있게 유도하는 경우에 씀

abstract class Calculator{ // 사용자에게 계산할 수 있는 클래스를 제공해주면
    int left, right;
    public void setOprands(int left, int right){
        this.left = left;
        this.right = right;
    }
	
	int _sum(){ // 메소드인데 앞에 public 안 붙인 이유는 default 상태로 만들어서 다른 패키지에서는 _sum()을 변경하지 못하게 하려고 기능 (접근제어자에ㅔ서 배운 거)
		return this.left+this.right;
	}
    public abstract void sum();
    public abstract void avg();
    public void run(){
        sum(); // 위의 sum은 abstract애라 못하고 자식클래스의 sum()을 작동함
        avg();
    }
}

class CalculatorDecoPlus extends Calculator { // 계산할 수 있는 클래스 Cal을 상속받아서 자신의 클래스CalDeco를 직접 만든다음에 
	// 자신이 직접 만들도록 유도되어있는 sum 앞에 뭘 붙여서 결과를 보여줄지 사용자가 직접 구현
    public void sum(){
        System.out.println("+ sum :"+_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 :"+_sum());
    }
    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();
    }
}

0개의 댓글