Java] Abstract

Abstract class, 추상 클래스

추상 클래스에 대해서는 예제로 설명하는 것이 가장 와닿는다.

처음에는 추상 클래스와 Interface에 대해 차이를 못 느낄 수 있지만, Abstract 예제와 인터페이스를 보게 된다면 차이를 느낄 수 있다.

추상 클래스는 추상적인 객체를 담아둔다.

예를 들어서 커피가 있다고 하자.

커피는 종류가 다양하다. 원두에 따라서, 데코레이션에 따라서 다 다르다.

데코레이션의 부분을 얘기하는 이유는 추후에 다루고, 먼저 원두의 종류에 따른 아메리카노만 보자.

example)

커피 원두의 종류는 케냐, 콜롬비아, 에티오피아가 있다.

커피를 만드는 과정(make)에는 원두를 담고(put), 갈고(ground), 드립(drip)하면 만들어진다.

Coffee Abstract Class

1
2
3
4
5
6
7
8
9
10
11
12
public abstract class Coffee {

protected abstract void put();
protected abstract void ground();
protected abstract void drip();

final public void make() {
put();
ground();
drip();
}
}

KenyaCoffee Class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class KenyaCoffee extends Coffee {

private final String coffeeBean = "케냐";

@Override
protected void put() {
System.out.println(coffeeBean + " 원두를 담습니다.");
}

@Override
protected void ground() {
System.out.println(coffeeBean + " 원두를 갈아줍니다.");
}

@Override
protected void drip() {
System.out.println(coffeeBean + " 커피를 추출합니다.");
}
}

ColombianCoffee, EthiopiaCoffee class도 위에 만든 것처럼 만들어 주면 된다.

CoffeeTest Class

1
2
3
4
5
6
7
8
9
10
11
12
public class CoffeeTest {
public static void main(String[] args) {
// Coffee coffee = new Coffee(); //Abstract class는 인스턴스 생성 안됨
Coffee kenya = new KenyaCoffee();
Coffee colombian = new ColombianCoffee();
Coffee ethiopia = new EthiopiaCoffee();

kenya.make();
colombian.make();
ethiopia.make();
}
}
1
2
3
4
5
6
7
8
9
10
//결과값
케냐 원두를 담습니다.
케냐 원두를 갈아줍니다.
케냐 커피를 추출합니다.
콜롬비아 원두를 담습니다.
콜롬비아 원두를 갈아줍니다.
콜롬비아 커피를 추출합니다.
에티오피아 원두를 담습니다.
에티오피아 원두를 갈아줍니다.
에티오피아 커피를 추출합니다.

이런 예제와 같은 방도로 abstract를 사용한다.

abstract

메서드가 하나라도 abstract가 쓰여있다면, 클래스는 abstract class여야 한다.

abstract로 구현된 클래스는 인스턴스를 가질 수 없다.