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("나는 강아지! 멍! 멍!");
// }
}
추상에 대한 정리
- 추상 클래스는 인스턴스, 즉 객체를 만들 수 없다. 즉, new를 사용할 수 없다.
- 추상 메서드는 하위 클래스에게 메서드의 구현을 강제한다. (오버라이딩이 강제된다.)
- 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 한다.