[ 자바 ] 인터페이스(Interface) vs 추상클래스(abstract class) 비교 정리!

Table of Contents

[ 자바 ] 인터페이스(Interface) vs 추상클래스(abstract class) 비교 정리!

🌱 자바 공부를 시작한지도 일주일이 지났다!

인터페이스와 추상 클래스를 배웠는데 지나고 나니 둘이 비슷하게 느껴져서 각자 사용하는 목적과 차이를 제대로 짚고 넘어가고자 한다.

인터페이스 vs 추상클래스 한눈에 비교

추상 클래스 (abstract class) 인터페이스 (interface)
사용 가능한 변수 제한 없음 static final
접근 제한자 제한 없음 public
메소드 제한 없음 abstract, default, static, private
상속 키워드 extends implements
다중 상속 가능 X O
공통점 1. 추상 메서드 (클래스에 구현부가 없는 메서드가 있음)
2. 객체를 생성할 수 없다 (인스턴스화 x)
3. 구현/상속 받은 클래스는 반드시 추상 메서드를 구현해야 한다.



인터페이스 interface

  • 모든 멤버변수는 public static final이며 생략 가능하다.
  • 모든 메서드는 public abstract이며 생략 가능하다.
  • 상속에 얽매이지 않고 공통 기능이 필요할 때마다 추상 메서드 정의 - 구현
    • 추상 클래스보다 더 자유롭게 붙였다 뗐다 할 수 있다
  • has a 관계일 때 (포함)
  • 클래스와 별도로, 객체가 같은 동작을 한다는 것을 보장하기 위해 사용!
// 다중 구현 지원
public class Customer implements Buy, Sell



추상 클래스 abstract class

  • 하위 클래스의 공통점을 모아 추상화한 클래스
  • 추상 메서드를 통해 중복되는 클래스 멤버들을 통합 및 확장 가능
  • is a 관계일 때 (상속)
  • 인터페이스와 달리, 추상 클래스는 클래스 간 연관관계를 구축하기 위해 사용!
// 단일 상속만 허용
public class Customer extends Person



📌 정리 & 활용 ---------

인터페이스와 추상 클래스 (abstract) 모두 추상 메서드를 통해 구현/상속을 통한 메서드 강제 구현 규칙을 가지는 추상화 클래스이다.

  • 인터페이스 : implements
    • 인터페이스에 정의된 메서드를 각 클래스 목적에 맞게 기능 구현
    • 추상클래스에서는 못하는 다중 구현을 통한 추상화 설계를 해야할 때 쓰임
    • 구현 객체가 같은 동작을 한다는 것을 보장!
  • 추상클래스 : extends
    • 자신의 기능을 하위 클래스로 확장시키자
    • 상수만 정의할 수 있는 인터페이스와 달리 추상 클래스 중복 멤버 통합이 가능하다
    • 클래스 간 연관관계를 구축


💻 코드로 이해하기

abstract class Creature {}

abstract class Animal extends Creature {}
abstract class Fish extends Creature {}

interface Swim {
    void Swimming();
}
interface Walk {
    void Walk();
}

// 마커 인터페이스 : 단순 타입 체크용 (Serializable, Cloneable, ...)
interface Breedable {}

class Cat extends Animal implements Breedable{
    @Override
    public void Walk(){...}

    public static void child(Cat a){
        if (a instanceof Cat) {
            System.out.println("새끼");
        } else {
            System.out.println("알");
        }
    }
}
class Person extends Animal implements Swim {
    @Override
    public void Swimming(){...}

    @Override
    public void Walk(){...}
}

class Whale extends Fish implements Swim {
    @Override
    public void Swimming(){...}
}



참고




 


💙 You need to log in to GitHub to write comments. 💙
If you can't see comments, please refresh page(F5).