구분 | 추상 클래스 | 인터페이스 |
---|---|---|
구현 가능 여부 | 일부 메소드는 구현 가능 | 모든 메소드 구현 불가능 |
다중 상속 여부 | 단일 상속만 가능 | 다중 구현 가능 |
필드 | 멤버 변수, 상수 모두 가능 | 상수만 가능 |
사용 목적 | 공통기능의 일부 구현 제공 | 규약 제공 및 구현 강제 |
추상 클래스 사용 시점
인터페이스 사용 시점
추상 클래스 예제: 공통 상태와 기능이 있는 경우
상황: 동물(Animal)
모든 동물은 이름과 소리라는 공통 속성이 있으며, 대부분 걷거나 특정 이동 방식을 가지고 있습니다.
이러한 공통된 상태와 동작은 추상 클래스로 구현하기 적합합니다.
추상클래스
abstract class Animal {
String name;
Animal(String name) {
this.name = name;
}
void sleep() { // 공통 동작
System.out.println(name + " is sleeping.");
}
abstract void move(); // 구체적인 이동 방식은 하위 클래스가 정의
}
구현
class Dog extends Animal {
Dog(String name) {
super(name);
}
@Override
void move() {
System.out.println(name + " runs on four legs.");
}
}
class Bird extends Animal {
Bird(String name) {
super(name);
}
@Override
void move() {
System.out.println(name + " flies in the sky.");
}
}
사용
public class Main {
public static void main(String[] args) {
Animal dog = new Dog("Rover");
Animal bird = new Bird("Tweety");
dog.move(); // 출력: Rover runs on four legs.
bird.move(); // 출력: Tweety flies in the sky.
dog.sleep(); // 출력: Rover is sleeping.
}
}
인터페이스 예제: 동작을 강제해야 하는 경우
상황: 특정 행동
동물들이 특정 행동(예: 날기, 수영하기)을 할 수 있는지를 명시하려면 인터페이스를 사용합니다.
이 행동은 동물 외에도 예를 들어, 로봇이나 장난감에도 적용될 수 있습니다.
인터페이스
interface Flyable {
void fly();
}
interface Swimmable {
void swim();
}
구현
class Duck extends Animal implements Flyable, Swimmable {
Duck(String name) {
super(name);
}
@Override
void move() {
System.out.println(name + " waddles on the ground.");
}
@Override
public void fly() {
System.out.println(name + " flies a short distance.");
}
@Override
public void swim() {
System.out.println(name + " swims in the pond.");
}
}
class Fish extends Animal implements Swimmable {
Fish(String name) {
super(name);
}
@Override
void move() {
System.out.println(name + " swims in the water.");
}
@Override
public void swim() {
System.out.println(name + " is swimming.");
}
}
사용
public class Main {
public static void main(String[] args) {
Duck duck = new Duck("Donald");
Fish fish = new Fish("Nemo");
duck.fly(); // 출력: Donald flies a short distance.
duck.swim(); // 출력: Donald swims in the pond.
duck.move(); // 출력: Donald waddles on the ground.
fish.swim(); // 출력: Nemo is swimming.
fish.move(); // 출력: Nemo swims in the water.
}
}
정리: 추상 클래스와 인터페이스의 역할 비교
추상 클래스:
인터페이스:
선택 기준
1) 공통된 속성/기능이 필요한 경우: