Java/java

java :) abstract, abstract class(추상클래스)/abstract method(추상메소드) [수정 1]

euncheol kim 2022. 5. 13. 13:42

 

 

 

goal

abstract class와 method에 대해서 이해한다.

 

[수정전 내용 : 2022.03.13 작성]

1] abstract method


  • child class에서 반드시 Overriding해야만 사용할 수 있는 메소드를 의미한다.
  • abstract class에 선언된 abstract method를 반드시 선언하게하는 강제성 부여
  • 추상 메소드는 선언부만 존재하며 구현부는 작성되지 않는다. (동작을 정의하지 않는다.)
  • abstract 반환타입 메소드이름();

1. 사용이점


  • 모듈처럼 중복되는 부분, 공통적인 부분은 미리 다 만들어진 것을 사용하고
  • 이를 받아 사용하는 쪽(child class)은 자신에게 필요한 부분만을 재정의하여 사용함으로써 생상선 향상, 배포 등이 쉬워진다는 이점을 갖는다.

 

2. abstract class


  • java에서는 하나 이상의 추상 모소드를 포함하는 클래스를 가리켜 abstract class라고 한다.
  • abstract class에 선언된 abstract method는 child class에서 반드시 Overriding을 해줘야한다.
  • abstract class는 단독적으로 instance를 생성할 수 없다.
  • abstract class는 구현부가 존재하는 method도 생성할 수 있으니 헷갈리지 말자.
  • abstract class는 static이 붙는 클래스 변수, 클래스 메소드를 절대 만들 수 없으니 상기한다.
    • 생각해보면 당연하다... abstract class 자체가 객체화 될 수 없으므로 필요하지 않다.
abstract class 클래스이름{
    abstract 반환타입 메소드이름();
}

 

 

 

 

 

[수정후 내용 : 2022.05.13 작성]

 

goal

java의 abstract를 이해한다.
 - abstract
 - abstract 클래스

 

 

1. java의 abstract


java맥락에서 abstact가 내포하는 의미는 "미완성"이라고 할 수 있다.

즉, abstract 제어자는 기본적으로 "미완성"을 의미하며, 주로 클래스메소드앞에 사용하게 된다.

  • abstract class Animail : Animal 추상 클래스를 의미하며 추상 메소드가 있는 클래스임을 나타낸다.
  • abstract void cry(); : cry 추상 메소드를 의미하며 반환타입은 void다. 구현체는 없는 상태로 존재한다.

추상 클래스 자체만으로 인스턴스 생성은 불가능하다.

 

 

[1] 추상클래스 (abstract class), 어떻게 사용해야 하는가? (+ 추상메소드)


다시 짚고 넘어간다면 추상 클래스는 미완성 설계도와 같다. 따라서 미완성 설계도로 집을 지으려고 한다는 것은 있을 수 없는 일이다. 추상 클래스 내부의 코드는 추상 메소드를 포함한다. 여기서 주의할 것이 추상 메소드를 포함한다는 것이지 일반 메소드나 일반 변수도 올 수 있다.

abstract class MakeAbstractClass {
    int num1 = 10;
    int num2 = 20;

    abstract void name();
    public int sum(int num1, int num2){
        return num1 + num2;
    };
}

 

 

abstract class 사용하기

abstract class Animal {
    String kind;
    public abstract void cry();
}

class Dog extends Animal {
    public Dog() {
        this.kind = "포유류";
    }

    @Override
    public void cry(){
        System.out.println("멍멍");
    }
}

public class TestCode {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.cry();
    }
}

/*
    output
    -------------
    멍멍
    -------------
*/

만약, Dog클래스cry메소드와 구현부를 주석처리한다면 오류가 날 것이다.

  • 이유 : abstract class의 미완성 설계도(들)를 상속받은 상태이기 때문에 Dog클래스에서 완성시켜줘야할 의무가 있다. -> 자바의 룰과 같은 것..!

하지만, Dog클래스의 생성자 부분을 주석처리하더라도 오류가 발생하지 않고 실행된다.

  • 이유 : String kind는 인스턴스 변수로써 꼭 정의해줄 의무가 없다.