추상 클래스는 반드시 상속되거나 구현돼야 하는 클래스다. 따라서 추상 클래스의 특성을 물려 받는 실체 클래스가 있다. 클래스를 설계할 때 사용한다.
반대로 생각하면 추상 클래스는 실체 클래스들의 규격과 같다. 따라서 실체 클래스들은 공통된 특성을 물려 받고, 자신만의 특정한 특성도 설정할 수 있다.(인터페이스의 특징)
그래서 추상 클래스는 하위 클래스의 공통된 특성(필드, 메소드)을 추출하여 선언한 클래스라고도 할 수 있다.
추상 클래스는 클래스가 갖는 모든 속성과 기능을 가진다. 추상 메소드의 구현 및 상속의 기능을 갖는다. 또한 추상 클래스도 클래스이므로 단일 상속만 지원한다.
클래스 생성 시 abstract를 붙여 선언한다. 이를 통해 상속(구현)을 강제할 수 있다.
public abstract class parent(){}
추상 클래스만으로는 객체를 생성할 수 없다. 그러나 실체 클래스가 상속을 받으므로 실체 클래스의 객체가 생성될 때, 추상 클래스의 객체도 생성된다.(상속관계니까)
Parent parent = new Parent();//컴파일 에러 발생
Parent parent = new Child();
추상 클래스도 멤버 변수, 일반 메소드, 일반 생성자를 가질 수 있다.
추상 클래스는 추상 메소드를 가질 수 있다. 추상 메소드는 메소드 선언부만 있는 메소드다.(실행문이 없다)
public abstract void method();
추상 메소드는 반드시 실체 클래스에 의해 재정의 되어야 한다. 재정의되지 않은 추상 메소드를 갖고 있다면 그 클래스는 추상 클래스여야 한다.
추상 메소드는 메소드가 존재해야 하지만, 실체 클래스마다 기능이 다를 때, 구현 방법이 다를 때 사용한다. 따라서 추상 메소드를 구현한 클래스에 따라 같은 메소드 코드에서 다양한 결과가 나올 수 있다.
추상 클래스는 클래스를 설계할 때 사용한다. 그래서 보통 템플릿 메소드 패턴과 같이 사용한다.
템플릿 메소드 : 추상 메소드나 구현된 메소드를 활용하여 전체의 흐름(시나리오)를 정의한 메소드. 전체의 흐름은 바뀌면 안되므로 final 메소드로 선언한다.
템플릿 메소드 패턴: 디자인 패턴의 일종이고, 프레임워크에서 많이 사용되는 설계 패턴이다. -> 사용자가 추상 클래스를 구현하면 프레임워크는 템플릿 메소드를 통해 작동시킨다.
템플릿 메소드는 추상 클래스로 선언된 상위 클래스에서 추상 메소드를 이용하여 전체 구현 흐름을 정의하고 구체적인 각 메소드 구현은 하위 클래스에 위임한다.
public abstract class Car{ // 추상 클래스
public abstract void run(); // 추상 메소드
public abstract void stop(); // 추상 메소드
final public void drive(){ // 템플릿 메소드
System.out.println("자동차 드라이브 시작");
run();
stop();
System.out.println("자동 드라이브 끝");
}
}
추상 클래스 Car를 구현한 실체 클래스가 추상 메소드를 구현하면 그 메소드를 drive() 메소드(템플릿)에서 사용한다.
'study > java' 카테고리의 다른 글
자바/JAVA 인터페이스 - 타입 변환 다형성 (0) | 2021.01.05 |
---|---|
자바/JAVA 인터페이스 정리 (0) | 2021.01.05 |
자바/JAVA 다형성 구현 정리 (0) | 2021.01.04 |
자바/JAVA 객체지향 관련 정리 (0) | 2020.12.28 |
자바/JAVA 공부 정리 (0) | 2020.12.28 |