추상클래스
abstract로 선언된 클래스
abstract로 선언된 메소드 보유
흔히 미완성 설계도라고 표현
인터페이스
아직 구현하지 않은 설계도
차이?
추상클래스의 경우, 기본적으로 '클래스'이기 때문에 상속받는 클래스에서 기능의 확장에 초점을 둠
인터페이스는 기능의 구현에 초점
예를 들어
위 구조에서 Duck, Human, Dog, Cat등의 동물들은 Animal 이라는 추상 클래스를 상속 받고 있음
이 Animal 을 간단하게 코드화해보면
public abstract class Animal {
private int age;
public Creatrue(int age){
this.age = age;
}
public void breath(){
System.out.println("Breathing");
}
public abstract void animalSound();
}
동물들은 기본적으로 호흡을 하기 때문에 breath라는 메소드를 구현
그러나 울음소리는 동물마다 다르기 때문에 추상 메소드로 선언
public class Duck extends Animal {
public Duck(int age){
super(age);
}
@Override
public void animalSound(){
System.out.println("꽥꽥");
}
}
Animal 추상 클래스를 상속 받는 Duck 클래스는 animalSound() 메소드에서 '꽥꽥" 이라는 문자를 출력하도록 구현
breath() 메소드는 이미 상위 클래스인 Aniaml에서 구현이 되어 있기 때문에 별다른 구현 없이 사용 가능
여기에 더해 Duck은 수영과 비행을 할 수 있으므로
public interface Flyable {
public void fly();
}
public interface Swimable {
public void swim();
}
위의 인터페이스를 상속받아
public class Duck extends Animal implements Flyable, Swimable {
public Duck(int age){
super(age);
}
@Override
public void animalSound(){
System.out.println("꽥꽥");
}
@Override
public void fly(){
System.out.println("오리는 날 수 있어요");
}
@Override
public void swim(){
System.out.println("오리는 수영할 수 있어요");
}
}
fly(), swim() 메소드를 구현하여 사용 가능
public class Human extends Animal implements Talkable {
public Duck(int age){
super(age);
}
@Override
public void animalSound(){
System.out.println("인간은 울음소리가 아닌 언어를 활용");
}
@Override
public void talk(){
System.out.println("인간은 대화가 가능해요");
}
}
사람의 경우 Talkable 인터페이스를 상속받아 talk() 메소드를 구현한 형태
인터페이스의 경우, 공통된 기능을 정의만 해놓은 설계도라고 보면 됨
Flyable 인터페이스는 Animal을 상속받은 Duck은 물론이고, Pigeon, Sparrow 등의 클래스에서도 공통적으로 사용될 수 있는 기능
인터페이스는 다중 상속이 가능하기 때문에 사용 가능한 구조
만약 인터페이스가 아닌 클래스만으로 위 처럼 구현하려면 개체별로 공통된 메소드를 모두 직접 선언 및 구현해야 하며 코드의 가독성이 떨어질 수 있음
'끄적 > ?' 카테고리의 다른 글
업캐스팅 다운캐스팅 (0) | 2023.08.27 |
---|---|
Generic (0) | 2023.08.27 |
Java ArrayList와 List 차이 (0) | 2023.08.27 |
String, StringBuffer, StringBuilder (0) | 2023.08.27 |
Java 메모리 구조, JVM 동작 방식 (0) | 2023.08.27 |