추상클래스 vs 인터페이스

newVelog·2024년 4월 18일
1

CS

목록 보기
15/31

추상클래스 vs 인터페이스

추상클래스

  • abstract 지시자로 정의되며 추상메서드가 하나 이상 포함

인터페이스

  • interface 지시자로 정의하며 모든 메서드가 추상메서드로 정의

그러나 java8 이상부터는 인터페이스에서 메서드를 정의할 수 있게 되었다.
이 두개의 경계가 점점 더 모호해 지고 있다. 따라서 이 차이를 알고있는지 더 물어본다.

추상클래스와 인터페이스의 차이는 존재의 목적에 있다.

  • 추상클래스 - 상속
    • 추상클래스를 통해 상속을 받아 부모클래스의 기능을 재활용하고 확장시키는데 목적이 있다.
  • 인터페이스 - 보장
    • 함수의 구현을 강제해서 구현한 객체들이 같은 동작을 하는것을 보장하는 것에 그 목적이 있다.

예제

추상클래스

package Example;

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 bark(); //짖는 소리는 동물마다 다르므로 추상메서드로 생성
}

추상클래스도 일반클래스와 마찬가지로 필드, 생성자, 메서드를 선언할 수 있다.
자식 객체가 생성될 때 super를 호출하므로 생성자는 반드시 있어야 한다.
bark() 추상메서드는 자식 클래스에서 오버라이드를 강제할 수 있다.

package Example;

public class Dog extends Animal{

    public Dog(String name, int age) {
        super(name, age);
    }
    
    @Override
    public void bark() { //메서드 오버라이딩
        System.out.println("멍멍!!");
    }; 
}
package Example;

public class Cat extends Animal{
    public Cat(String name, int age) {
        super(name, age);
    }
    
    @Override
    public void bark() { //메서드 오버라이딩
        System.out.println("야옹~~");
    }; 
}

개, 고양이 클래스를 생성해 동물 클래스를 상속받고 bark() 추상메서드를 오버라이드해 재정의한다.

package Example;

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("강아지",3);
        Cat cat = new Cat("고양이",3);
        
        dog.move();
        dog.bark();
        
        cat.move();
        cat.bark();
    }
}
이동한다
멍멍!!
이동한다
야옹~~

인터페이스

package Example;

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

java8 이전에는 상수, 추상메서드만 가능했지만
java8 이후에는 default, static, private method 도 인터페이스에 추가할 수 있다.

package Example;

public class Dog implements Animal{
    
    @Override
    public void move() {
        System.out.println("슥슥~~");
    }
    
    @Override
    public void bark() {
        System.out.println("멍멍!");
    }
}
package Example;

public class Cat implements Animal{

    @Override
    public void move() {
        System.out.println("사뿐사뿐~~");
    }
    
    @Override
    public void bark() {
        System.out.println("야옹~~");
    }
}

개, 고양이 클래스 생성 후 Animal 인터페이스를 implements 키워드로 구현하고 인터페이스의 추상 메서드들을 오버라이드 해 재정의한다.

package Example;

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        
        dog.move();
        dog.bark();
        
        cat.move();
        cat.bark();
    }
}
슥슥~~
멍멍!
사뿐사뿐~~
야옹~~

출처 : https://www.youtube.com/watch?v=VE_CDb00bc0&list=PLi-xJrVzQaxU-xK2ao8utngQJqAX4DQty&index=6
https://coding-factory.tistory.com/866
https://coding-factory.tistory.com/867
https://castleone.tistory.com/11

0개의 댓글