< 김영한의 실전 자바 - 기본편 > 강의를 보고 이해한 내용을 바탕으로 합니다.
동물(Animal
)과 같이 부모 클래스는 제공하지만, 실제 생성되면 안되는 클래스를 추상 클래스라 한다.
추상 클래스는 이름 그대로 추상적인 개념을 제공하는 클래스이다. 따라서 실체인 인스턴스가 존재하지 않는다. 대신에 상속을 목적으로 사용되고, 부모 클래스 역할을 담당한다.
abstract class AbstractAnimal {...}
abstract
키워드를 붙여주면 된다.new AbstractAnimal()
과 같이 ⭐️직접 인스턴스를 생성하지 못하는 제약이 추가된 것이다.⭐️부모 클래스를 상속 받는 자식 클래스가 반드시 오버라이딩 해야 하는 메서드를 부모 클래스에 정의할 수 있다. 이것을 추상 메서드라한다. 추상 메서드는 이름 그대로 추상적인 개념을 제공하는 메서드이다. 따라서 실체가 존재하지 않고, 메서드 바디가 없다.
public abstract void sound();
abstract
키워드를 붙여주면 된다.Abstract method in non-abstract class
Abstract methods cannot have a body
public abstract class AbstractAnimal {
public abstract void sound();
public void move(){
System.out.println("동물이 움직입니다.");
}
}
AbstractAnimal
은 abstract
가 붙은 추상 클래스이다. 이 클래스는 직접 인스턴스를 생성할 수 없다.sound()
는 abstract
가 붙은 추상 메서드이다. 이 메서드는 자식이 반드시 오버라이딩 해야한다.이 클래스는 move()
라는 메서드를 가지고 있는데 이 메서드는 추상 메서드가 아니다. 따라서 자식 클래스가 오버라이딩 하지 않아도 된다.
지금까지의 제약을 제외하고 나머지는 모두 일반적인 클래스와 동일하다. 추상 클래스는 제약이 추가된 클래스일 뿐이다. 메모리 구조, 실행 결과 모두 동일하다.
Animal
인스턴스를 생성할 문제를 근본적으로 방지해준다.sound()
를 오버라이딩 하지 않을 문제를 근본적으로 방지해준다.모든 메서드가 추상 메서드인 순수 추상 클래스는 코드를 실행할 바디 부분이 전혀 없다.
public abstract class AbstractAnimal {
public abstract void sound();
public abstract void move();
}
이러한 순수 추상 클래스는 실행 로직을 전혀 가지고 있지 않다. 단지 다형성을 위한 부모 타입으로써 껍데기 역할만 제공할 뿐이다.
순수 추상 클래스는 다음과 같은 특징을 가진다.
상속하는 클래스는 모든 메서드를 구현해야 한다.
"상속 시 자식은 모든 메서드를 오버라이딩 해야한다."라는 특징은 상속 받는 클래스 입장에서 보면 부모의 모든 메서드를 구현해야 하는 것이다.
이런 특징을 잘 생각해보면 순수 추상 클래스는 부모의 기능을 물려받기 보다는 마치 어떤 규격을 지켜서 구현해야하는 것처럼 느껴진다.
AbstractAnimal
의 경우 sound()
, move()
라는 규격에 맞추어 구현을 해야 한다.
=> 일반적으로 이야기하는 인터페이스와 같이 느껴진다.🤔
예를 들어 USB 인터페이스를 생각해보자.
USB 인터페이스는 분명한 규격이 있다. 이 규격에 맞추어 제품을 개발해야 연결이 된다. 순수 추상 클래스가 USB 인터페이스 규격이라고 한다면 USB 인터페이스에 맞추어 마우스, 키보드 같은 연결 장치들을 구현할 수 있다.
이런 순수 추상 클래스의 개념은 프로그래밍에서 매우 자주 사용된다. 자바는 순수 추상 클래스를 더 편리하게 사용할 수 있도록 인터페이스라는 개념을 제공한다.