1. 추상 클래스의 정의
- 추상 메서드(abstract method)
- 메서드의 본체가 완성되지 않은 미완성 메서드
- 중괄호 자체가 없음
- 중괄호가 없기 때문에 끝을 알리는 세미콜론(;)으로 끝나야 함
abstract 리턴 타입 메서드명(입력매개변수);
abstract void abc();
- 추상 클래스 (abstract class)
- 추상 메서드를 1개 이상 포함하고 있는 클래스는 반드시 추상 클래스로 정의돼야 함
- 추상 클래스는 메서드의 기능이 정의돼 있지 않은 미안성메서드가 1개 이상 있다는 의미
abstract class 클래스명 {
}
abstract class A {
abstarct void abc();
void bcd(){
//...
}
}
2. 추상 클래스의 특징
- 추상 클래스는 내부의 미완성 메서드 때문에 객체를 직접 생성할 수 없음
- 힙 메모리에 생성되는 객체는 내부 요소가 미완성된 상태로 들어 갈 수 없음
- A a = new A()와 같이 생성자의 호출 자체를 할 수 없음
- 일반 클래스 = 붕어빵 기계
- 객체 = 붕어빵
- 추상 클래스 = 붕어빵 기계 부품
- 붕어빵 기계 부품으로 붕어빵을 찍을 수는 없지만, 붕어빵 기계는 붕어빵 기계 부품으로 만들 수 있으며, 최종적으로 만들어진 붕어빵 기계로 붕어빵을 찍을 수 있음
- 추상클래스는 직접 객체를 생성할 수 없지만 이 추상클래스를 상속한 자식 클래스를 생성하면 그 자식 클래스로 객체 생성가능
- 생성된 객체 내부에는 부모 클래스의 추상메서드가 구현돼 있음
-추상 클래스를 상속하는 자식 클래스는 부모에게 상속받은 미완성 메서드(추상 메서드)를 반드시 완성(오버라이딩)해야 함
- 오버라이딩 : 부모에게 상속받은 메서드를 자식 클래스에서 재정의 하는 것
- 구현(implement) : 부모에게 물려받은 미완성 메서드를 자식 클래스에서 완성하는 것
3. 추상 클래스 타입의 객체 생성 방법
- 추상 클래스의 객체를 생성하는 방법은 자식 클래스의 생성 여부에 따라 2가지로 나뉨
1) 추상 클래스를 일반 클래스로 상속해 객체 생성
- 자식 클래스 B가 일반 클래스로 정의되기 위해서는 반드시 상속 받은 추상 메서드 abc()를 구현해야 함
- 클래스 B는 일반 클래스이므로 객체를 생성할 수 있고, 이렇게 생성한 객체는 다형적 표현으로 부모 추상 클래스 타입으로 선언 가능
- 직접 자식 클래스를 생성하므로 일단 한 번 정의한 이후에는 자식 클래스 생성자의 호출만으로도 객체를 몇개든 생성 가능
- 객체를 여러 개 만들어야 하는 상황에서 적절
package Abstractclass;
abstract class A {
abstract void abc();
}
class B extends A{
void abc() {
System.out.println("방법 1. 자식 클래스 생성 및 추상 메서드 구현");
}
}
public class Abstractclass1 {
public static void main(String[] args) {
//객체 생성
A b1 = new B();
A b2 = new B();
//메서드 호출
b1.abc();
b2.abc();
}
}
2) 익명 이너 클래스 활용
- 컴파일러가 내부적으로 추상 클래스를 상속해 메서드 오버라이딩을 수행한 클래스를 생성하고,
그 클래스로 객체를 생성하는 방법
- 익명 이너 클래스
클래스명 참조 변수명 = new 생성자() {
//추상 클래스에 포함된 추상 메서드 오버라이딩
};
- A()는 클래스 A의 생성자를 호출하는 것이 아니라
컴파일러가 클래스 A를 상속받아 abc() 메서드를 오버라이딩한 익명 클래스의 생성자를 호출한다는 것을 의미
- 클래스명을 알 수 없기 떄문에 객체를 정의할 때 마다 익명 이너 클래스를 정의해야함
- 한 번만 만들어 사용할 객체일 때 적절
package Abstractclass;
abstract class A {
abstract void abc();
}
public class Abstractclass2 {
public static void main(String[] args) {
//객체 생성
A a1 = new A() {
void abc() {
System.out.println("방법 2. 익명 이너 클래스 방법으로 객체생성");
}
};
A a2 = new A() {
void abc() {
System.out.println("방법 2. 익명 이너 클래스 방법으로 객체생성");
}
};
//메서드 호출
a1.abc();
a2.abc();
}
}
'Java' 카테고리의 다른 글
13 -1 장 이너 클래스 (0) | 2023.06.04 |
---|---|
12 - 2장 인터페이스 (0) | 2023.06.04 |
11-2장 abstract 제어자 (0) | 2023.06.02 |
11-1장 final 제어자 (0) | 2023.06.02 |
6-1 장 클래스와 객체의 개념 (2) | 2023.04.24 |