✍ 추상메서드 (Abstract Method)
- 메서드 구현부(= 바디 { } )가 없는 메서드이다. 즉, 미완성 메서드.
- 메서드의 동작을 기술하는 구현부가 없는 추상메서드는 실행할 수 있는 코드가 없으므로
외부로부터 호출되면 안 된다.
--> 따라서, 추상메서드를 갖는 클래스는 반드시 추상클래스로 선언되어야 한다.
- 메서드 정의 시 선언부의 접근제한자 뒤에 abstract 키워드를 붙여서 정의한다.
--> abstract 키워드가 붙은 메서드는 추상메서드 이므로 바디 {} 를 가질 수 없다.
따라서, 메서드 선언부 마지막에 바디{} 대신 세미콜론(;)으로 끝낸다
- 서브클래스에서 반드시 오버라이딩 하도록 강제성을 부여해야하는 메서드는
슈퍼클래스에서 추상메서드로 선언하면 서브클래스가 무조건 오버라이딩을 해야한다.
--> 강제성을 통해 업캐스팅을 하면 코드의 통일성을 향상 시킬 수 있다. (동적바인딩)
✍ 추상메서드 정의 기본 문법
[접근제한자] abstract [리턴타입] 메서드명(매개변수...);
✍ 추상클래스 (Abstract Class)
- 객체를 생성할 수 없는 클래스(미완성 클래스)
--> 따라서, new 연산자를 통해 생성자 호출이 불가능하다. 즉, 객체 생성이 불가능하다.
- 추상메서드를 가질 수 있는 클래스
--> 상속받는 서브클래스에서 반드시 오버라이딩 해야한다!
- 추상클래스는 추상메서드, 일반메서드, 생성자, 멤버변수를 모두 가질 수 있다.
- 상속을 통해 서브클래스에서 사용가능하며, 업캐스팅을 통한 다형성 활용이 가능하다.
- 구현의 강제성을 부여하여 코드의 통일성이 향상된다. (일부 메서드에 대한 구현의 강제)
✍ 추상클래스 정의 기본 문법
abstract class 클래스명 {
// 멤버변수(인스턴스 멤버, 클래스(static) 멤버)
// 생성자
// 메서드 (abstract 추상 메서드 포함)
}
✍
abstract class AbstractClass {
public abstract void abstractMethod();
int a;
static int b;
public AbstractClass() {} // 생성자
public void print() {} // 일반메서드
public static void print2() {} // static 메서드
}
class SubClass extends AbstractClass { // 추상클래스를 상속받을 땐 오버라이딩 or 추상클래스화 둘 중에 하나는 해야함
@Override
public void abstractMethod() {
System.out.println("서브클래스에서 오버라이딩을 통해 구현한 추상메서드!");
}
}
🔍 추상메서드를 멤버로 가지는 클래스를 반드시 추상화 해주어야 하는 이유는?
--> 추상메서드는 구현부가 없는 메서드 이므로, 호출이 불가능 하다. 만약 추상메서드를 가진 클래스가 객체를 생성하여
추상메서드를 호출하려 할 수도 있다. 그래서 클래스도 반드시 추상화 하여, 객체 생성을 막아주어야 한다.
단, 추상클래스에 반드시 추상메서드가 필요한 것은 아니다.
추상메서드가 존재하는 경우에는 반드시 추상클래스가 필요하다.
🔍 추상클래스를 상속받는 경우에는?
--> 2가지 방법이 있다. 추상클래스화 하거나 또는 오버라이딩 해주어야 한다.
💻
public static void main(String[] args) {
SubClass sc = new SubClass(); // 추상클래스를 상속 받은 서브 클래스
sc.abstractMethod(); // 오버라이딩을 통해 구현한 추상메서드
AbstractClass ac = sc; // 업캐스팅
ac.abstractMethod();
}
🔍 추상클래스는 인스턴스 생성은 불가능하지만, 다형성 활용은 가능하다.
변수의 클래스 타입으로 사용할 수 있다.
추상클래스를 변수의 클래스 타입으로 사용하고, 업캐스팅 하였을 경우
참조영역이 축소된다. 그러나 서브클래스에서 추상메서드는 반드시 구현되어 존재하므로
슈퍼클래스 타입으로 상속되어 구현된 추상메서드 호출이 가능하다.
결론
🔍 추상메서드는 구현부가 없기 때문에 호출될 수 없다
🔍 추상클래스에 반드시 추상메서드가 필요한 것을 아니다.
🔍 하지만 클래스내에 추상메서드가 존재한다면 반드시 추상클래스화가 필요하다.
🔍 추상클래스는 인스턴스를 생성할 수 없지만 다형성으로 활용이 가능하다(변수의 클래스 타입으로 사용 가능)
🔍 추상클래스를 상속받은 서브 클래스내에 추상메서드가 존재할 경우, 반드시 오버라이딩 해주어야 한다.
오버라이딩 하지 않는다면 추상클래스화가 필요하다.
'개발 > Java' 카테고리의 다른 글
[Java] Enum (0) | 2023.02.20 |
---|---|
[Java] 인터페이스 (Interface) (0) | 2023.02.15 |
[Java] final 키워드 (0) | 2023.02.14 |
[Java] 다형성 (0) | 2023.02.11 |
[Java] 동적 바인딩 (0) | 2023.02.11 |