추상 메소드(abstract method)
- 선언은 되어 있으나 코드가 구현되지 않은 메소드
- abstract로 선언
public abstract String getName();
public abstract void setName(String s);
public abstract String fail(return "Good Bye";} //컴파일 오류, 코드가 작성됨
추상 클래스(abstract class)
- 서브 클래스에서 오버라이딩하여 구현해야 함
- abstract로 선언
- 추상 클래스가 되는 경우는 2가지
1. 추상 메소드를 하나라도 포함하는 클래스
- 추상 클래스를 가지고 있으면 반드시 추상 클래스로 선언(abstract로 선언)
abstract class Shape{ //추상 클래스 선언
public Shape(){}
public void paint(){ draw(); }
abstract public void draw(); //추상 메소드 선언
}
2. 추상 메소드가 없지만 abstract로 선언한 클래스
abstract class MyComponent{ //추상 클래스 선언
String name;
public void load(String name){
this.name = name;
}
}
추상 클래스는 객체 생성 불가
- 응용 프로그램은 추상 클래스의 객체(인스턴스) 생성 불가
- 추상 클래스는 객체를 생성할 목적으로 만드는 클래스가 아님
- 실행 코드가 없는 미완성 상태의 추상 메소드가 있을 수 있음
- 추상 클래스의 객체를 생성하는 코드에는 컴파일 오류 발생
abstract class Shape{ ... }
public class AbstractError{
public static void main(String[] args){
Shape shape; //레퍼런스 변수 선언은 오류 아님
shape = new Shape(); //컴파일 오류, 추상 클래스 Shape의 객체 생성 불가
}
}
추상 클래스의 상속
- 2가지 경우
1. 추상 클래스의 단순 상속
- 추상 클래스를 상속(추상 클래스의 추상 메소드를 그대로 상속받으므로)
- 서브 클래스도 추상 클래스이므로 abstract로 선언
abstract class Shape{ //추상 클래스
public Shape(){}
public void paint(){ draw(); }
abstract public void draw(); //추상 메소드
}
abstract class Line extends Shape{ //draw()를 상속받으므로 추상 클래스
public String toString(){ return "Line"; }
}
- Shape를 상속받는 Line 클래스에서 추상 메소드인 draw()를 오버라이딩하지 않으면 자동으로 추상 클래스가 됨
- Line은 abstract 키워드를 사용하여 추상 클래스임을 명시
2. 추상 클래스 구현 상속
- 추상 클래스 구현: 슈퍼 클래스에 선언된 모든 추상 메소드를 서브 클래스에서 오버라이딩하여 실행 가능한 코드로 구현
- 서브 클래스는 추상 클래스 아님
- 추상 클래스는 추상 메소드를 통해 서브 클래스가 구현할 메소드를 명료하게 알려주는 인터페이스의 역할
- 서브 클래스는 추상 메소드를 목적에 맞게 구현하는 다형성 실현
추상 클래스의 용도
설계와 구현 분리
- 슈퍼 클래스에서는 개념 정의: 서브 클래스마다 다른 구현이 필요한 메소드는 추상 메소드로 선언
- 각 서브 클래스에서 구체적 행위 구현: 서브 클래스마다 목적에 맞게 추상 메소드 다르게 구현
계층적 상속 관계를 맺는 클래스 구조를 만들 때
예제 5-7 다음 추상 클래스 Calculator를 상속받은 GoodCalc 클래스를 구현
abstract class Calculator{
public abstract int add(int a, int b);
public abstract int substract(int a, int b);
public abstract double average(int[] a);
}
'java > 개념' 카테고리의 다른 글
패키지(package) (0) | 2024.05.23 |
---|---|
인터페이스(interface) (0) | 2024.05.23 |
메소드 오버라이딩(+동적 바인딩) (0) | 2024.05.22 |
업캐스팅과 다운캐스팅(+instanceof 연산자) (0) | 2024.05.22 |
상속과 생성자 (0) | 2024.05.21 |