리셋 되지 말자

abstract 키워드 - 추상 메서드와 추상 클래스 본문

Java(폐지)/Java 공부

abstract 키워드 - 추상 메서드와 추상 클래스

kyeongjun-dev 2020. 7. 20. 11:49

추상 메서드(Abstract Method)


추상 메서드를 간단하게 설명하면 선언부는 있는데 구현부가 없는 메서드를 말한다. 추상 메서드를 하나라도 갖고 있는 클래스는 반드시 추상 클래스(Abstarct Class)로 선언해야 한다. 추상 메서드 없이도 추상 클래스를 선언할 수 있다.

추상 클래스(Abstract Class)


추상 클래스는 인스턴스, 즉 객체를 만들 수 없는 클래스가 된다.

몸체가 없이 선언만 있는 메서드는 어떤 것이고 왜 필요한가? - 코드 예제

동물 클래스가 있고, 이 동물 클래스를 상속(확장)하여 여러 동물 클래스를 만든다고 가정한다. 이 동물들의 울음소리를 동물 클래스에서 '울다()'라는 함수를 사용하여 출력할 때, 동물 클래스의 '울다()'라는 메서드는 사용하면 안된다. 고양이나 소가 우는건 이해가 가지만 만약 '동물 그냥동물 = new 동물()'로 생성했을 때, '그냥동물'이 무슨 동물인지 모르니 뭐라고 우는지를 알 수가 없기 때문이다.
이처럼 실수로 동물 클래스의 인스턴스를 만들고 그렇게 만들어진 동물 객체의 '울다()'메서드를 호출하면 안된다. 이를 방지하기 위해서 추상 메서드를 사용하게 된다.

package abstractionMethod02;

public abstract class 동물 {
//    void 울어보세요() {
//        
//    }
    abstract void 울어보세요();
}
  • 위와같이 추상 클래스를 정의하면 '동물'클래스의 인스턴스화를 방지할 수 있다.
  • '울어보세요()'메서드를 추상 메서드로 선언하여 구현부 없이 선언. 상속 받은 클래스에서 추상 함수를 구현한다.
package abstractionMethod02;

public class 강아지 extends 동물 {
    void 울어보세요() {
        System.out.println("나는 강아지! 멍! 멍!");
    }
}
  • 아래의 코드처럼 '동물' 클래스를 인스턴스화 하려고 하면 'Cannot instantiate the type 동물'이라는 에러 메시지가 출력된다.
package abstractionMethod02;

public class Driver {
    public static void main(String[] args) {
        동물[] 동물들 = new 동물[5];

        동물들[0] = new 쥐();
        동물들[1] = new 고양이();
        동물들[2] = new 강아지();
        동물들[3] = new 송아지();
        동물들[4] = new 병아리();

        for (int i = 0; i < 동물들.length; i++) {
            동물들[i].울어보세요();
        }

        동물 그냥동물 = new 동물();
    }
}
  • 이외에도, 추상 클래스를 상속 받았는데, 상속받은 클래스가 추상 클래스의 추상 메서드를 구현하지 않아도 에러가 출력된다. 'The type 강아지 must implement the inherited abstract method 동물.울어보세요()'
package abstractionMethod02;

public class 강아지 extends 동물 {
//    void 울어보세요() {
//        System.out.println("나는 강아지! 멍! 멍!");
//    }
}

추상에 대한 정리

  1. 추상 클래스는 인스턴스, 즉 객체를 만들 수 없다. 즉, new를 사용할 수 없다.
  2. 추상 메서드는 하위 클래스에게 메서드의 구현을 강제한다. (오버라이딩이 강제된다.)
  3. 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 한다.

'Java(폐지) > Java 공부' 카테고리의 다른 글

클래스의 static 블록  (0) 2020.07.20
생성자(constructor)  (0) 2020.07.20
참조 변수의 복사  (0) 2020.07.20
다형성: 사용편의성  (0) 2020.07.17
상속과 T 메모리  (0) 2020.07.16
Comments