추상클래스는 추상메소드를 포함하고 있는 클래스이다.
추상클래스의 인스턴스는 생성할 수 없으며, 상속을 통해 자손 클래스에서만 완성된다.
추상클래스도 일반 클래스와 같이 생성자가 필요하고 일반 메소드도 가질 수 있다.
그렇다면 추상메소드란 선언부(리턴타입과 메서드이름)만 작성하고 메소드 내부에서
실행할 동작을 작성하지 않은 메소드를 말한다.
이렇게 추상메소드를 만드는 이유는, 메소드의 내용이 추상클래스를 상속받는 클래스가 누구냐에 따라
메소드의 실행을 다르게 하기 위함이다. 따라서 조상 클래스(추상 클래스) 에서는 메소드가 어떤 기능을
할 지만 주석으로 설명해두고, 상속받은 자손 클래스에서 그것을 구체화시키는 것이다.
/* 메소드의 기능 설명*/
abstract 리턴타입 메소드명();
추상 메소드는 구현 내용이 없으므로 { }대신 ; 를 써서 끝마친다.
추상클래스를 상속받는 자손클래스는 오버라이딩으로 추상메소드를 모두 구현해야한다.
모두 구현하지않는다면 그 자손클래스도 추상클래스가 된다.
// 추상클래스
abstract class WorkManager{
/*누가 업무를 하고 있는지 알려줌*/
abstract void employee{}; // 추상 메소드
}
class TeamLeader extends WorkManager{
@Override
void employee{
System.out.println("TeamLeader is working now");
}
}
또한 번외로
// 추상클래스 Heap
abstract class Heap{
/*Heap에 노드를 추가*/
abstract void heappush(heap, i);
...
}
//...//
// Heap을 상속받은 MinHeap
class MinHeap extends Heap{
@Override
void heap heappush(min_heap, i){
//...//
}
}
// Heap을 상속받은 MaxHeap
class MaxHeap extends Heap{
@Override
void heap heappush(max_heap, i){
//...//
}
}
Heap[] h = new Heap[2]; // Heap 타입 참조배열 생성
h[0] = new MinHeap(); // h[0]은 MinHeap 인스턴스 참조
h[1] = new MaxHeap(); // h[1]은 MaxHeap 인스턴스 참조
min_heap = ...;
max_heap = ...;
for(int i=0;i<2;i++){
h[0].heappush(min_heap,i); // MinHeap의 heappush가 호출됨
h[1].heappush(max_heap,i); // MaxHeap의 heappush가 호출됨
}
h는 추상클래스인 Heap 타입의 참조변수배열이고, heappush가 Heap에 추상 메소드로 정의되어있지만!
h[0].heappush(~); 는 MinHeap에서 오버라이드한 heappush가 호출된다.
그 이유는 인스턴스 메소드는 참조변수의 타입과 관계없이, 그 참조변수가 참조하고 있는 인스턴스에 따라
호출되기 때문이다.
'JAVA' 카테고리의 다른 글
자바의 컴파일: 바이트코드와 JVM (0) | 2024.07.18 |
---|---|
컬렉션 프레임워크 (0) | 2024.06.21 |
인터페이스 (0) | 2022.10.03 |
애너테이션(2) - 메타 애너테이션 (0) | 2022.10.03 |
지네릭스(1) (2) | 2022.09.02 |
다형성 - 참조변수 형변환 (0) | 2022.08.15 |