추상 클래스 vs 인터페이스
추상 클래스와 인터페이스를 각각 공부해보아도 차이점을 명확히 설명할 수 없어 찾아본 결과 납득하기 쉽게 정리해 놓은 블로그가 있어 이를 바탕으로 자세히 알아보았다.
📔 추상 클래스
https://giwon512.github.io/java/abstract/
→ 하위 클래스들이 공통으로 가지는 멤버들을 통합하여 가지고 있는 느낌으로, 하위 클래스들은 추상 클래스의 기능을 이어받고 확장해 나가는 느낌을 가진다.
→ 논리적인 상속 구조가 있음
📔 인터페이스
https://giwon512.github.io/java/interface/
→ 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현해 나간다.
추상 클래스 vs 인터페이스
📖 추상 클래스를 사용하는 경우
- 상속 받을 클래스들의 중복되는 멤버를 통합할 때
- 멤버에 public 이외의 접근자 선언이 필요한 경우
-
상태 변경을 위한 메서드가 필요하여 non-static, non-final 선언이 필요한 경우
→ 인터페이스는 public static final로만 선언이 가능하기에 위의 두 경우에는 추상클래스를 사용할 수밖에 없다.
- 요구사항과 함께 구현 세부 정보의 일부 기능만 지정했을 때
📖 인터페이스를 사용하는 경우
-
다중 상속을 통한 추상화 설계를 해야 할 때
→자바에서 클래스는 다중 상속을 지원하지 않는다.
- 필요에 의해서 서로 관련이 적은 클래스들끼리 형제 타입처럼 묶어버릴 때
- 특정 타입의 행동을 명시하고 싶지만 어디서 그 행동이 구현될 지는 신경쓰지 않는 경우
예시
//중복되는 멤버들을 animal 추상 클래스에 모아서 정의한다.
abstract class Animal {
String name;
int age;
abstract void sleeping();
}
//날 수 있는 기능을 따로 구현한다. 이를 Animal 추상클래스에 같이 넣게 되면,
//날 수 없는 사람도 일단 해당 기능을 빈 내용으로 구현해야만 하는 문제가 생긴다.
interface Flyable {
public static final int speed = 10;
void flying();
}
//마찬가지로 말하는 기능도 따로 구현한다.
interface Talkable {
void talking();
}
//인터페이스로는 다중 상속이 가능하다.
class Parrot extends Animal implements Flyable, Talkable{
Parrot(String name, int age){
this.name = name;
this.age = age;
}
@Override
void sleeping() {System.out.println("서서 잔다.");}
@Override
public void flying() {System.out.println("앵무새는 날 수 있다.");}
@Override
public void talking() {System.out.println("앵무새는 말할 수 있다.");}
}
//앵무새와 박쥐 클래스는 날 수 있는 기능을 상속받아 마치 형제처럼 관리될 수 있다.
class Bat extends Animal implements Flyable{
Bat(String name, int age){
this.name = name;
this.age = age;
}
@Override
void sleeping() {System.out.println("매달려서 잔다.");}
@Override
public void flying() {System.out.println("박쥐는 날 수 있다.");}
}
class People extends Animal implements Talkable{
People(String name, int age){
this.name = name;
this.age = age;
}
@Override
void sleeping() {System.out.println("누워서 잔다.");}
@Override
public void talking() {System.out.println("사람은 말할 수 있다.");}
}
class Test {
public static void main(String[] args) {
Parrot parrot = new Parrot("bird", 5);
Bat bat = new Bat("bat", 3);
People people = new People("tom", 12);
parrot.sleeping();
bat.sleeping();
people.sleeping();
parrot.flying();
parrot.talking();
bat.flying();
people.talking();
}
}
참고
https://inpa.tistory.com/entry/JAVA-☕-인터페이스-vs-추상클래스-차이점-완벽-이해하기
댓글남기기