추상메소드를 포함하고 있는 클래스를 말한다.
1) 선언부만 있고 몸통부(body){}가 없는 메소드 - 본문이 없다
2) 추상클래스를 상속한 클래스는 반드시 추상메소드를 재정의해야한다
abstract class Shape { // 추상클래스
public String shapeType;
//추상메소드
abstract public void draw();
}
//추상클래스를 상속한 클래스
class Rect extends Shape {
public void draw() {
System.out.println("Draw Rect");
}
}
class Oval extends Shape {
public void draw() {
System.out.println("Draw Oval");
}
}
class Line extends Shape {
public void draw() {
System.out.println("Draw Line");
}
}
예시
public class Ex03AbstractClass {
public static void main(String[] args) {
//1. 추상클래스는 인스턴스 생성 X
//Shape shape = new Shape();
//2. 추상클래스 타입의 참조변수는 만들 수 있습니다.
Shape shape = null;
//3. 참조타입과 인스턴스타입이 다른 경우
// 참조타입에 없는 인스턴스 타입 메소드를 호출할 수 없습니다.
/* 에러 발생
Shape shape = new Rect();
shape2.draw();
*/
//4. 추상클래스와 추상메서드 사용 -> 다형성 적용
ArrayList<Shape> shapes = new ArrayList<>();
for (int i = 0; i < 10; i++) {
if (i % 3 == 0) {
shapes.add(new Rect());
} else if (i % 3 == 1) {
shapes.add(new Oval());
} else {
shapes.add(new Line());
}
}
for(Shape s : shapes) {
s.draw(); //다형성 : 같은 메소드 호출 코드가 인스턴스에 따라 다른 동작 수행
}
//5. 번외 연습 : Rect 타입만 골라서 그리기
for (Shape s : shapes) {
if (s instanceof Rect) { //s를 Rect로 형변환해도 되는지 확인
Rect r = (Rect)s;
r.draw();
}
}
}
}