안녕하세요~ 

이번 시간에는 추상클래스와 인터페이스에 대해 알아보려고 하는데요.

정확한 차이에 대해 알아볼까요?

Animal을 상속받는 Dog와 Cat 클래스

package day13_1;

public abstract class Animal {
    String name;
    int age;
    
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public void move() {System.out.println("움직이다");}
    public void eat() {System.out.println("먹다");}
    public abstract void sound();
}


package day13_1;

public class Dog extends Animal{
    public Dog(String name, int age) {
        super(name, age);
    }
    
    @Override
    public void sound() {
        System.out.println("멍멍");
    }; 
}

 

package day13_1;

public class Cat extends Animal{
    public Cat(String name, int age) {
        super(name, age);
    }
    
    @Override
    public void move() {
        System.out.println("살금살금");
    };

}

 

package day13_1;

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("강아지",10);
        Cat cat = new Cat("고양이",5);
        
        dog.move();
        dog.eat();
        dog.sound();
        
        cat.move();
        cat.eat();
        cat.sound();
    }
}

 



package day13_2;

public interface Animal {
    public static final String name = "동물";
    
    public abstract void move();
    public abstract void eat();
    public abstract void sound();
}

 

package day13_2;

public class Dog implements Animal{
    
    @Override
    public void move() {
        System.out.println("껑충껑충");
    }
    
    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}

 

package day13_2;

public class Cat implements Animal{

    @Override
    public void move() {
        System.out.println("살금살금");
    }
    
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}

 

package day13_2;

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        
        dog.move();
        dog.sound();
        dog.eat();
        
        cat.move();
        cat.sound();
        cat.eat();
    }
}

 추상클래스와 인터페이스를 상속받아 객체를 생성하고 메소드를 사용해보려고 합니다.


 

 

 추상클래스 Animal을 상속받은 Cat 클래스와 인터페이스 Animal을 상속받은 Dog와 Cat 클래스에서 오류가 발생했네요.

개념부터 알아보고 해결해봅시다!


오늘의 핵심 키워드

  • 추상클래스(Abstract Class)는 상속을 강제한다. 따라서, 추상메소드는 반드시 오버라이딩해야 한다. 객체 간의 필드, 메소드 이름을 통일하여 가독성을 높이기 위해 사용한다. ( extends )
  • 인터페이스(Interface)는 일종의 가이드라인이다. 추상클래스처럼 추상메소드는 반드시 오버라이딩해야 하고 가독성을 높이는 데 더해서 다중상속까지 가능하다. ( implements )

 

 추상클래스 Animal 클래스에서 sound 메소드를 추상메소드로 선언했기 때문에 상속받은 Cat 클래스에서 무조건 오버라이딩을 해야합니다.

따라서, sound메소드를 오버라이딩해주면 오류가 사라지는 것을 확인할 수 있습니다.


 

 인터페이스 Animal에서 move, sound, eat 메소드를 모두 추상메소드로 선언했기 때문에 상속받은 Dog, Cat 클래스에서 무조건 오버라이딩을 해야합니다.

따라서, Dog와 Cat 클래스 모두 move, sound 메소드만 오버라이딩했었는데 eat메소드까지 오버라이딩해주면 오류가 모두 사라지는 것을 확인할 수 있습니다.


추상클래스와 인터페이스 차이 비교 표


 최종 실행화면

 

 꼭 봐야되는 마무리 꿀팁

  • 상속을 강제하는 추상메소드와 기타 필드와 생성자 등을 사용해야 할 때는 추상클래스 사용하기!
  • 단순히 가이드라인용으로 추상메소드만 선언할 때는 인터페이스 사용하기!

▲영상으로 한번 더 복습하세요 :)