백앤드/JAVA

[JAVA] 추상 클래스와 인터페이스의 차이

영최 2024. 10. 18. 14:31
728x90

1. [추상 클래스]

  • 개념: abstract 키워드로 선언된 클래스
    1. *추상 메서드를 최소 한 개 이상 가지고 abstract로 선언된 클래스
      • 최소 한 개의 추상 메서드를 포함하는 경우 반드시 추상 클래스로 선언하여야 한다.
    2. *추상 메서드가 없어도 abstract로 선언한 클래스
      • 그러나 추상 메서드가 하나도 없는 경우라도 추상 클래스로 선언할 수 있다.
  • *추상 클래스의 구현
    • 서브 클래스에서 슈퍼 클래스의 모든 추상 메서드를 오버라이딩하여 실행가능한 코드로 구현한다.
  • 추상 클래스의 목적
    • 객체(인스턴스)를 생성하기 위함이 아니며, 상속을 위한 부모 클래스로 활용하기 위한 것이다.
    • 여러 클래스들의 공통된 부분을 추상화(추상 메서드) 하여 상속받는 클래스에게 구현을 강제화하기 위한 것이다. (메서드의 동작을 구현하는 자식 클래스로 책임을 위임)
    • 즉, 추상 클래스의 추상 메서드를 자식 클래스가 구체화하여 그 기능을 확장하는 데 목적이 있다.
*추상 메서드를 최소 한 개 이상 가지고 abstract로 선언된 클래스
abstract class Shape { // 추상 클래스
  Shape() {...}
  void edit() {...}
  abstract public void draw(); // 추상 메서드
}​


*추상 메서드가 없어도 abstract로 선언한 클래스

abstract class Shape { // 추상 클래스
  Shape() {...}
  void edit() {...}
}​


*추상 클래스의 구현

class Circle extends Shape {
  public void draw() { System.out.println("Circle"); } // 추상 메서드 (오버라이딩)
  void show() { System.out.println("동그라미 모양"); }
}

2. [인터페이스]

  • 개념: 추상 메서드와 상수만을 포함하며, interface 키워드를 사용하여 선언한다.
  • 인터페이스의 구현
    • 인터페이스를 상속받고, 추상 메서드를 모두 구현한 클래스를 작성한다.
    • implements 키워드를 사용하여 구현한다.
  • 인터페이스의 목적
    • 상속받을 서브 클래스에게 구현할 메서드들의 원형을 모두 알려주어, 클래스가 자신의 목적에 맞게 메서드를 구현하도록 하는 것이다.
    • 구현 객체의 같은 동작을 보장하기 위한 목적이 있다.
    • 즉, 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 필요가 있는 경우에 사용한다.
  • 인터페이스의 특징
    1. 인터페이스는 상수 필드와 추상 메서드만으로 구성된다.
    2. 모든 메서드는 추상 메서드로서, abstract public 속성이며 생략 가능하다.
    3. 상수는 public static final 속성이며, 생략하여 선언할 수 있다.
    4. 인터페이스를 상속받아 새로운 인터페이스를 만들 수 있다.
      • interface MobilePhone extends Phone { }
*인터페이스 
interface Phone { // 인터페이스
  int BUTTONS = 20; // 상수 필드 (public static final int BUTTONS = 20;과 동일)
  void sendCall(); // 추상 메서드 (abstract public void sendCall();과 동일)
  abstract public void receiveCall(); // 추상 메서드
}​

*인터페이스의 구현
class FeaturePhone implements Phone {
  // Phone의 모든 추상 메서드를 구현한다.
  public void sendCall() {...}
  public void receiveCall() {...}

  // 추가적으로 다른 메서드를 작성할 수 있다.
  public int getButtons() {...}
}​

3. [추상 클래스와 인터페이스의 차이]

  • 추상 클래스와 인터페이스의 공통점
    • 인스턴스(객체)는 생성할 수 없다.
    • 선언만 있고 구현 내용이 없다.
    • 자식 클래스가 메서드의 구체적인 동작을 구현하도록 책임을 위임한다.
  • 추상 클래스와 인터페이스의 차이점
    • 서로 다른 목적을 가지고 있다.
      • 추상 클래스는 추상 메서드를 자식 클래스가 구체화하여 그 기능을 확장하는 데 목적이 있다. (상속을 위한 부모 클래스)
      • 인터페이스는 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 필요가 있는 경우에 사용한다. (구현 객체의 같은 동작을 보장)
    • 추상 클래스는 클래스이지만 인터페이스는 클래스가 아니다.
    • 추상 클래스는 단일 상속이지만 인터페이스는 다중 상속이 가능하다.
    • 추상 클래스는 “is a kind of” 인터페이스는 “can do this”
      • Ex) 추상 클래스: Appliances(Abstract Class) - TV, Refrigerator
      • Ex) 인터페이스: Flyable(Interface) - Plane, Bird
728x90