추상 클래스
추상 클래스는 상속에서 슈퍼 클래스로 사용됩니다.
추상 메소드
선언은 되어 있으나 코드가 구현되어 있지 않은, 즉 껍데기만 잇는 메소드입니다.
추상 메소드를 작성하려면 abstact 키워드와 함께 원형만 선언하고 코드는 작성하지 않습니다.
public abstract String getName();
public abstract void setName(String s);
다음은 코드가 작성되어 있기 때문에 추상 메소드가 될 수 없습니다.
public abstact String fail() { return "Good Bye"; } // 컴파일 오류
추상 메소드 만들기
추상 클래스(abstract class)가 되는 경우는 다음 2가지로서, 모두 abstract 키워드로 선언해야 합니다.
추상 메소드를 포함하는 클래스
abstract class Shape { // 추상 클래스 선언
public Shape() { }
public void paint() { draw(); }
abstract public void draw(); // 추상 메소드 선언
}
추상 메소드가 없지만 abstact로 선언한 클래스
abstract class MyComponent { // 추상 클래스 선언
String name;
public void load(String name) {
this.name = name;
}
}
추상 메소드를 가지고 있으면 반드시 추상 클래스로 선언되어야 합니다. 다음은 추상 클래스로 선언되지 않는 잘못된 코드입니다.
class Fault { // 오류. 추상 클래스로 선언되지 않았음
abstract public void f(); // 추상 메소드
}
추상 클래스는 객체를 생성할 수 없다
응용 프로그램은 추상 클래스의 객체(인스턴스)를 생성할 수 없습니다. 추상 클레스는 본디 객체를 생성할 목적으로 만드는 클래스가 아닙니다. 추상 클래스에는 실행 코드가 없는 미완성 상태인 추상 메소드가 있기 때문에, 다음과 같이 추상 클래스의 객체를 생성하는 코드에는 컴파일 오류가 발생합니다.
public class AbstractError {
public static void main(String[] args) {
Shape shape;
shape = new Shape(); // 컴파일 오류. 추상 클래스 Shape의 객체를 생성할 수 없다.
...
}
}
위의 코드를 컴파일하면 다음과 같은 오류가 발생합니다.
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot instantiate the type Shape
이 오류는 추상 클래스는 객체를 생성할 수 없다는 뜻입니다. 앞은 코드를 자세히 보면 main()의 다음 코드에는 오류가 발생하지 않습니다.
Shape shape; // 오류 아님
추상 클래스의 레퍼런스 변수를 선언하는 것은 오류가 아닙니다.
추상 클래스의 상속
추상 클래스를 단순히 상속받는 서브 클래스는 추상 클래스가 됩니다. 추상 클래스의 추상 메소드를 그대로 상속받기 때문입니다. 그러므로 서브 클래스에 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"; }
}
추상 클레스의 구현과 목적
추상 클래스의 구현이란, 슈퍼 클래스에 선언된 추상 메소드를 서브 클래스에서 오버라이딩하여 실행 가능한 코드로 구현하는 것을 말합니다.

추상 클래스는 추상 메소드를 통해 서브 클래스가 구현할 메소드를 명료하게 알려주는 인터페이스의 역할을 하고, 서브 클래스는 추상 메소드를 목적에 맞게 구현하는 다형성을 실현할 수 있습니다.
추상 클래스의 용도
추상 클래스를 이용하면 응용 프로그램의 설계와 구현을 분리할 수 있습니다. 추상 클래스로 기본 방향을 잡아놓고 서브 클래스에서 구현하면 구현 작업이 쉬워집니다. 또한, 추상 클래스는 계층적 상속 관계를 가지는 클래스들의 구조를 만들 때 적합합니다.
추상 클래스의 구현 연습
abstract class Calculator {
public abstract int add(int a, int b); // 두 정수의 합을 구하여 리턴
public abstract int subtract(int a, int b); // 두 정수의 차를 구하여 리턴
public abstract double average(int[] a); // 배열에 저장된 정수의 평균 리턴
}
public class GoodCalc extends Calculator {
@Override
public int add(int a, int b) { // 추상 메소드 구현
return a + b;
}
@Override
public int subtract(int a, int b) { // 추상 메소드 구현
return a - b;
}
@Override
public double average(int[] a) { // 추상 메소드 구현
double sum = 0;
for (int i = 0; i < a.length; i++)
sum += a[i];
return sum / a.length;
}
public static void main(String[] args) {
GoodCalc c = new GoodCalc();
System.out.println(c.add(2, 3));
System.out.println(c.subtract(2, 3));
System.out.println(c.average(new int[] { 2, 3, 4}));
}
}
실행결과
5
-1
3.0
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
| 패키지(Package) (0) | 2025.02.19 |
|---|---|
| 인터페이스 (1) | 2025.02.16 |
| 메소드 오버라이딩 (0) | 2025.02.10 |
| 업캐스팅과 instanceof 연산자 (0) | 2025.02.09 |
| 상속과 생성자 (0) | 2025.02.08 |