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 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();
}
}