추상클래스와 인터페이스
추상클래스와 인터페이스
추상 클래스
추상 메서드는 선언은 되어있는데 구현은 해두지 않은 함수를 말한다.
추상 클래스는 일부 메서드만 구현하거나 아예 구현하지 않고 설계만 해두고 자식 클래스(상속받은 클래스)가 반드시 오버라이딩 하도록 강제하는 클래스로 자식 클래스는 반드시 추상 클래스 안에 있는 모든 추상 메서드를 구현해야한다.
또한 추상 클래스는 실제로 구현이 이루어져 있는 일반 메서드를 포함할 수도 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
abstract class Animal {
void breathe() { // 일반 메서드로 상속받은 클래스에서 구현하지 않는다.
System.out.println("Breathing...");
}
abstract void sound(); // 추상 메서드로 상속받은 클래스에서 반드시 구현
}
class Dog extends Animal {
public void sound() {
System.out.println("Bark!");
}
}
인터페이스
인터페이스는 어떠한 기능을 제공한다는 기능 명세와 같은 개념으로 그러한 기능에 대한 선언만 해두고 구현은 해두지 않는다.
즉, 전부 추상 메서드로만 이루어진다.(Java 8 이후부터는 default 메서드나 static 메서드를 포함할 수 있음)
한 번 만들어두면 서로 관계가 없을 수도 있는 다양한 객체에서 이 인터페이스를 구현할 수 있다.
예시 인터페이스: Chargeable
1
2
3
public interface Chargeable {
void charge();
}
이 인터페이스를 구현한 클래스들
1
2
3
4
5
public class Smartphone implements Chargeable {
public void charge() {
System.out.println("Smartphone is charging via USB-C.");
}
}
1
2
3
4
5
public class ElectricCar implements Chargeable {
public void charge() {
System.out.println("Electric car is charging at charging station.");
}
}
여기서 두 객체는 인터페이스 Chargeable
을 사용함으로써 해당 기능을 가지고 있다는 것을 나타낸다. 즉, 각 객체가 해당 기능을 가져야 하는지 여부에 따라 어떤 인터페이스를 사용할지 말지 결정하면 된다.
추상 클래스와 인터페이스
Dog extends Animal → “개는 동물이다” (is-a 관계 → 추상 클래스)
Dog implements Runnable → “개는 달릴 수 있다” (can-do 관계 → 인터페이스)
- 추상클래스는 상위클래스로서 하위클래스의 틀을 강제한다.
- 인터페이스는 하나의 규약으로서 각 클래스에서 필요에 따라 선택하여 구현한다.
- 추상클래스는 상위클래스이므로 여러개의 추상클래스를 상속받을 수는 없다.
- 인터페이스는 기능 규약이므로 하나의 클래스가 여러 인터페이스를 구현할 수 있다.
Java에서는 클래스 선언 시 추상클래스 상속과 인터페이스를 둘 다 사용한다면, extends가 먼저 오고, implements는 그 다음에 와야 한다. (순서를 바꾸면 컴파일 오류 발생)
1 2 3
class SubClass extends SuperClass implements Interface1, Interface2 { // ... }
- 추상 클래스는 “공통 동작과 상태를 자식 클래스에게 물려주면서 일부 구현을 강제”하는 상속 구조
- 인터페이스는 “기능 규약”을 정의하여 여러 클래스가 “동일한 역할을 수행할 수 있게 하는 설계 도구”
This post is licensed under CC BY 4.0 by the author.