본문 바로가기
Language/Java

[Java]추상클래스와 인터페이스(차이,공통점)

by jaee_ 2021. 8. 21.

추상클래스란?

추상클래스(abstract class)란 클래스 내부에 추상적인 기능을 가질 수 있는 클래스를 말한다. 추상적으로 메소드를 선언하여 상속을 통해서 자식클래스에서 완성하도록 유도하는 클래스이다. 상속을 위한 클래스이기 때문에 객체를 따로 생성할 수 없다. 

추상클래스의 특징

  • 객체(인스턴스) 생성이 불가능하다.
  • class 앞에 "abstract" 예약어를 사용하여 추상클래스라는 것을 명시해야 한다.
  • 추상메소드를 가질 수 있다.
  • abstract으로 선언된 메소드가 하나라도 존재한다면, 그 클래스는 반드시 abstract으로 선언되어야 한다.
  • 추상클래스는 단일상속만 가능하며 일반 변수, 메소드를 가질 수 있다.

추상메소드의 특징

  • 추상클래스 내부에서만 구현할 수 있다.
  • 메소드에 "abstract" 키워드를 작성해야 한다.
  • 일반클래스가 추상클래스를 상속받으면 상속받은 추상클래스에 구현된 모든 추상메소드를 반드시 재정의 해야한다.(오버라이딩) 

추상클래스 예제

public abstract class Animal {  // 추상 클래스
    public abstract void sound(); // 추상 메소드

    public void eat() // 일반 메소드
    {
        System.out.println("추상메소드 안에 일반 메소드");
    }

}

추상클래스를 상속받는 클래스

public class Cat extends Animal{
    @Override
    public void sound() {
        System.out.println("고양이 야옹야옹");
    }
}
public class Dog extends Animal {

    @Override
    public void sound() {
        System.out.println("강아지 멍멍");
    }
}

위의 추상메소드를 상속받은 코드를 실행하는 클래스

public class Main {
    public static void main(String[] args) {

        Cat cat = new Cat();
        Dog dog = new Dog();

        cat.sound();
        cat.eat();

        dog.sound();
        dog.eat();
    }
}

결과

고양이 야옹야옹
추상메소드 안에 일반 메소드
강아지 멍멍
추상메소드 안에 일반 메소드

추상메소드는 자식클래스에서 반드시 재정의 해야한다. 

추상메소드가 아닌 일반메소드는 재정의 해주지 않아도 된다.


인터페이스란?

인터페이스는 일종의 추상클래스이지만, 모든 메소드가 추상 메소드인 경우를 말한다. 

인터페이스는 추상클래스보다 추상적인 개념이다.

 

인터페이스의 특징

  • 인터페이스는 모든 메소드가 추상메소드이기 때문에 abstract를 적지 않는다.
  • default 예약어를 통해 일반 메소드 구현이 가능하다. ( 기존에는 불가능했지만 JAVA8버전부터 가능해짐 )
  • 인터페이스는 static final 필드만 가질 수 있다. 필드를 선언할 때 public static final이 생략되어 있다고 생각하면 된다.
  • 객체를 생성할 수 없다. 
  • 인터페이스는 추상클래스와 다르게 다중상속이 가능하다.
참고

인터페이스는 모든 메소드가 abstract메소드이기 때문에 인터페이스를 상속받은 클래스에서는 인터페이스 내 모든 메소드를 오버라이딩 해야한다. 만약 A라는 인터페이스를 상속받은 클래스가 10개라고 했을 때 10개에 모두 B라는 기능을 넣고싶다. 이럴 경우 A인터페이스에 default 메소드를 사용하여 B라는 기능을 구현하면 10개의 상속받은 클래스에 오버라이딩을 하지 않아도 적용이 된다.  

위의 특징에서 세번째 특징은 아래의 사진을 통해서 이해하자

 

인터페이스에 필드,메소드를 선언하면 컴파일러가 자동으로 static final을 붙인다.

인터페이스 예제

public interface AnimalInterface {
    public void sound();
    public default void eat(){
        System.out.println("인터페이스 내 default 메소드");
    }
}

인터페이스를 상속받는 클래스

public class Rabbit implements AnimalInterface{
    @Override
    public void sound() {
        System.out.println("토끼의 울음소리");
    }

    @Override
    public void eat() {
        AnimalInterface.super.eat();
    }
}

실행 클래스

public class MainInterface {

    public static void main(String[] args) {
        Rabbit rabbit = new Rabbit();
        rabbit.sound();
        rabbit.eat();
    }

}

결과

토끼의 울음소리
인터페이스 내 default 메소드

추상클래스와 인터페이스 공통점

  • 추상클래스와 인터페이스 모두 선언부만 있고 구현은 없는 클래스이다.
  • 인스턴스화(객체 생성)를 할 수 없다.
  • 추상 클래스를 extends로 상속받은 자식클래스들과 인터페이스를 implements하고 구현한 자식클래스들만 객체 생성 가능
  • 자식 클래스가 무언가는 반드시 구현하도록 강제성을 부여할 때 사용한다.

추상클래스와 인터페이스 차이점

  • 추상클래스(단일 상속)/인터페이스(다중상속)
  • 추상클래스의 목적은 상속을 받아서 기능을 확장시키는 것 (is-a관계에서 주로 사용)
  • 인터페이스의 목적은 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제하는 역할로 부모로부터 유전자를 물려받는 것이 아니라 사교적으로 필요에 따라 결합하는 관계  (has-a 관계에서 주로 사용)

'Language > Java' 카테고리의 다른 글

[Java] String literal 과 new String() 의 차이  (0) 2021.08.22
[Java] final 을 알아보자  (0) 2021.08.22
[Java] JAVA 8 특징  (0) 2021.08.18
[Java] 다형성(polymorphism)이란?  (0) 2021.08.15
[Java] 상속(Inheritance)에 대해서  (0) 2021.08.14

댓글