본문 바로가기

🖥️프로그래밍 언어/Java

[JAVA] 자바 추상클래스(Abstract) Part2

by 필트립 2022. 10. 8.

✔ 추상클래스 (abstract) 아래 Document 참고

https://www.w3schools.com/java/java_abstract.asp

 

Java Abstraction

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

 

 

Part 1에서 다뤘던 내용을 다시 가져오자면... ↓↓↓

 

🟥용어정리🟥

추상클래스(Abstract class)

: Abstract 이라는 키워드는 클래스와 메소드에서 사용되는 non-access modifier 이다.  

추상 클래스는 객체를 생성할 수 없는 제한된 클래스이다. (추상 클래스에 접근하기 위해서는 다른 클래스에서 상속되어져야한다.)Abstract 메소드는 abstract class 안에서만 사용될 수 있다. 그리고 abstract 메소드는 body를 가질 수 없다.

 

The abstract keyword is a non-access modifier, used for classes and methods: Abstract class: is a restricted class that cannot be used to create objects (to access it, it must be inherited from another class). Abstract method: can only be used in an abstract class, and it does not have a body.

 

 

즉, Abstract 로 지정되어 있는 method 나 class 는 직접적으로 사용할 수 없고,
반드시 상속하는 클래스를 만들어서 사용하도록 강제되어 있음!

 

 

 

보통 추상클래스(Abstract class)  인터페이스(interface)를 많이 헷갈려 하시더라구요.

↓ 아래서 차이점을 살펴보겠습니다.

 

 

🟪 abstract VS interface 차이점

  🟠 interface(인터페이스)

      1) 클래스가 아닌 인터페이스라는 고유한 형태를 가지고 있음. (그래서 정의할때 class 키워드를 붙이지 않음)
      2) 구체적인 로직이나 상태를 절대!! 못 가짐. (interface는 반드시 body(본체)가 없는 메소드들만을 가지고 있어야함!)


  🟡 abstract(추상클래스)

      1) 일반적인 클래스이다! (그래서 정의할때 class 라는 키워드가 있음)
      2) 구체적인 로직이나 상태를 가질 수 있음.
         (추상클래스 안에 추상메소드가 아닌 일반메소드가 존재할 수 있다는 말!)
         (추상클래스 안의 추상메소드일 경우에는 절대 body를 가질 수 없음!..
          ..말그대로 추상적인 것이라 그 추상클래스를 상속하는 자식클래스에서 body를 만들어서 구체화를 해주어야함!)

 

 

 

 

 

abstract class Calculator {
    int left, right;
    public void setOperands(int left, int right) {
        this.left = left;
        this.right = right;
    }
    // ↓ 앞에 접근제어자인 public 이 없다는 말은 _sum() method의 접근제어자는 default라는 뜻이고,
    //   default 접근제어자는 같은 패키지(package)에서만 사용가능한 것!
    //   public 접근제어자는 다른 패키지에서도 사용가능!
    int _sum() {
        return this.left + this.right;
    }
    public abstract void sum();
    public abstract void avg();
    public void run() {
        sum();
        avg();
    }
}

class CalculatorDecoPlus extends Calculator {
    // ↓ 아래 두 method 중 하나만 주석처리해도 에러가 뜨는 것을 볼수 있다!
    // Why?
    // -> Calculator class(abstract)을 상속한 이상,
    // Calculator class 안에 있는 abstract method(추상메소드)인 sum()과 avg() 모두를 구체화해주는 과정이 필요하다!
    public void sum() {
        System.out.println("+ sum: " + _sum());
    }
    public void avg() {
        System.out.println("+ avg: " + (this.left + this.right) / 2);
    }
}

// ↓ 아래 class도 ↑ 위의 class와 마찬가지로,
// 상황에 따라서 달라지는 부분은 사용자가 직접 구현하도록 강제화시킬 수 있는 기능이 바로..
// ..Abstract (추상)이라고 하는 기능!!
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 AbstractDemo2 {
    public static void main(String[] args) {
        CalculatorDecoPlus c1 = new CalculatorDecoPlus();
        c1.setOperands(10, 20);
        c1.run();
    }
}

 

 

 

 

↓↓↓↓ 코드 다운로드 ↓↓↓↓

AbstractDemo2.java
0.00MB

 

 

반응형