Minwoo Dev.

[Java] 인터페이스(Interface)와 추상 클래스(abstract class) 의 차이 본문

Java

[Java] 인터페이스(Interface)와 추상 클래스(abstract class) 의 차이

itisminu 2024. 5. 26. 10:42
728x90
반응형
SMALL

추상 클래스(abstract class)

추상 메서드(abstract method)가 포함된 클래스

추상 메서드가 하나라도 포함되면, 그 클래스는 추상 클래스로 선언해야한다.

 

  • 다중 상속이 불가능하다
  • 추상 메소드 외에 일반 메소드, 생성자, 필드를 가질 수 있다.
  • "상속 관계"에 초점이 맞춰져있다.
  • 객체를 생성할 수 없다.
  • 추상 클래스를 추상 클래스에 상속할수도 있다.
import java.util.Stack;

abstract class Animal{ // 추상 클래스 Animal
    public Animal(){}
    public void eat(){
        System.out.println("I am eating now");
    }
    abstract public void cry();
}

class Cat extends Animal{
    public void cry(){
        System.out.println("meow");
    }
}

public class test {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.eat();
        cat.cry();
    }
}

 

실행 결과

 

위 예시 코드를 보면, 추상 클래스인 Animal은 abstract public void cry()라는 추상 메서드를 가지고 있다.

그 외에도 생성자 Animal()을 포함하며, 일반 메서드인 public void eat()도 있다.

참고로, 추상 메서드는 함수의 몸체를 구현하지 않는다.

 

이러한 Animal 를 상속받은 클래스는 Animal이 가지고 있던 추상 메서드를 무조건 재정의해야한다.

Cat 클래스에서 cry() 를 구현한 것을 확인할 수 있다.

 


 

 

인터페이스(Interface)

클래스가 구현해야 할 부분을 선언해두는 형태이다.

상수, 추상 메서드, default 메서드, private 메서드, static 메서드가 포함될 수 있다.

  • 모든 변수는 public static final로 선언해야한다.
  • 다중 구현(impliments)을 할 수 있다.
  • 인터페이스끼리는 다중 상속(extends)을 지원한다.
  • 상속 관계에 얽매이지 않고 특정 기능을 추가할 때 사용
interface PhoneInterface{
    public static final int TIMEOUT = 10000;
    public abstract void sendCall();
    public abstract void recieveCall();
    public default void printLogo(){
        System.out.println("**Phone**");
    };
}

 

인터페이스는 위처럼 사용한다.

 

 


 

 

개인적으로, 위의 설명들을 모두 보고도 인터페이스와 추상 클래스의 개념이 너무 헷갈렸다.

 

개념이 헷갈린다기 보단, 위 두 개념을 도대체 어떤 때에 사용하길래 이렇게 두 가지 개념으로 나누어져 있는건지 궁금해졌다.

 

그렇게 인터넷 자료들을 엄청나게 뒤져보다가, 한 게시물을 보고 단번에 이해가 되는 경험을 하였다.

 

그러니 부디 인터페이스와 추상 클래스의 차이에 대해 궁금증을 품고 있다면 이 글을 참고하길 바란다.

 

☕ 인터페이스 vs 추상클래스 용도 차이점 - 완벽 이해

인터페이스 vs 추상클래스 비교 이 글을 찾아보는 독자분들은 아마도 이미 인터페이스와 추상클래스 개념을 학습한 뒤에 이 둘에 대하여 차이의 모호함 때문에 방문 했겠지만, 그래도 다시한번

inpa.tistory.com

 

 

 

위 게시물에서, 굉장히 이해하기 좋은 자료를 참조하겠다.

인터페이스 : 상속 관계에 상관없이 특정 기능을 추가할 수 있다.

추상 클래스 : 상속 관계 중심이기 때문에 추상클래스에 추가한 내용을 자식 클래스가 모두 구현해야한다.

 

위 내용을 기억하자.

만약, 위와 같은 그림에서 swim이라는 기능을 추가하려고 한다면, 어떤 곳에 추가하겠는가 ?

아마 People과 whale에 swim()을 추가하고 싶을 것이다.

 

만약 추상 클래스를 사용한다면, Creature에 swim() 추상 메서드를 넣게 되면 모든 자식 클래스들이 swim()을 구현해야 한다,

 

혹은 Animal 클래스에만 swim()을 구현하면, Parrot, Tiger까지 수영을 할 수 있게된다.

혹은 Fish 클래스에 swim() 추상 메서드를 넣으면, 자식 클래스인 Whale만 swim() 을 구현하게 된다.

 

이러한 상황에서 추상 클래스를 사용하면 안되는 이유는 , 추상 클래스가 상속 중심으로 움직이기 때문이다.

우리가 현재 swim()을 추가해주고 싶은 People과 Whale은 굳이 따지자면 형제 관계이기 때문에 추상 클래스로는 줄 수 없는 것이다.

 

이럴 때, 인터페이스를 사용한다.

 

인터페이스는 상속에 아무런 영향을 받지 않는다.

따라서 위 상속구조에서 People과 Whale만 swim() 기능을 추가할 수 있게되는 것이다.

 

 

이러한 차이점을 이해했다면, 추상 클래스와 인터페이스의 차이점을 잘 이해한 것이라고 생각한다.

 

728x90
반응형
LIST