추상화(abstraction)
는 어떤 것에 대해 세부적인 사항은 생략하고 주요한 특징만 뽑아서 모델링하는 것을 말합니다.
예를 들어 자동차와 오토바이를 추상화한다면 바퀴가 있다, 엔진으로 구동된다 정도가 있겠죠?
추상클래스
는 인스턴스를 생성할 수 없는 클래스입니다. 추상메소드가 포함되어 있어서 인스턴스를 생성할 수 없습니다.
따라서 추상클래스
는 상속
을 통해 자식클래스로 추상메소드를 구현해야지만 인스턴스 생성이 가능해지는 클래스입니다. 즉, 추상클래스
상속만 할 수 있다는 것이 됩니다.
말만 들으면 구현도 하지못하는 클래스가 왜 필요한가라는 생각이 들 수 있는데요. 예를들면 같은 자동차라도 옵션에 따라서 90%는 동일하지만 10%의 다른 점이 생기게 됩니다. 이럴때마다 10%때문에 다 다른 클래스를 작성하느니 미완성된 90%를 그려놓고, 10%를 상속받아서 구현하는 것이 훨씬 효율이 좋겠죠? 그렇기 때문에 추상클래스를 이용하는 것 입니다.
추상클래스
는 클래스 선언부에 abstract
키워드를 붙여서 선언합니다.
abstract class 클래스명 {}
public abstract class Fruit {}
Fruit 추상클래스를 인스턴스화하려고하면 다음과 같이 오류가 발생합니다.
추상메소드
는 선언부만 존재하는 메소드입니다. 메소드의 기능 구현은 상속받은 클래스에서 메소드 오버라이딩을 통해 구현합니다.
추상클래스를 만드는 것을 추상화, 추상 클래스를 상속받아 오버라이딩해서 메소드를 구현하는 것(과 클래스의 확장)을 구체화라고 합니다.
마찬가지로 추상메소드
도 abstract
키워드를 붙여서 선언합니다. 이때 선언부만 존재해야하므로 메소드 블록{}
은 적지 않습니다.
abstract 반환값_타입 메소드명(매개변수, ...);
위에서 선언한 Fruit 추상클래스에 추상 메소드를 추가했습니다.
public abstract class Fruit {
abstract public void printFruitName(); //추상메소드
}
그리고 이 클래스를 상속받은 Apple 클래스를 만들어줍니다.
public class Apple extends Fruit {
@Override //오버라이딩을 알리는 Annotation
public void printFruitName() { //추상메소드를 구현
System.out.println("나는 사과다.");
}
}
public class Main {
public static void main(String[] args) {
Apple apple = new Apple();
apple.printFruitName();
}
}