Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Java에서 추상 클래스를 사용할 때와 인터페이스를 사용할 때?

<시간/>

인터페이스는 계약 동작을 정의하는 데 사용할 수 있으며 상호 작용하는 두 시스템 간의 계약 역할도 할 수 있지만 추상 클래스는 주로 하위 클래스의 기본 동작을 정의하는 데 사용됩니다. 즉, 모든 자식 클래스가 동일한 기능을 수행해야 합니다.

추상 클래스를 사용하는 경우

  • 추상 클래스는 파생 클래스에 공통 기본 클래스 구현을 제공하므로 상속 개념을 사용하는 경우 좋은 선택입니다.
  • 비공개 멤버를 선언하려는 경우 추상 클래스도 좋습니다. 인터페이스에서 모든 메소드는 공개되어야 합니다.
  • 미래에 새로운 메서드를 추가하려면 추상 클래스가 더 나은 선택입니다. 인터페이스에 새 메서드를 추가하면 이미 해당 인터페이스를 구현한 모든 클래스가 새 메서드를 구현하도록 변경되어야 하기 때문입니다.
  • 컴포넌트의 여러 버전을 생성하려면 추상 클래스를 생성합니다. 추상 클래스는 구성 요소를 버전화하는 간단하고 쉬운 방법을 제공합니다. 기본 클래스를 업데이트하면 모든 상속 클래스가 변경 사항에 따라 자동으로 업데이트됩니다. 반면 인터페이스는 한 번 생성되면 변경할 수 없습니다. 새 버전의 인터페이스가 필요한 경우 완전히 새 인터페이스를 만들어야 합니다.
  • 추상 클래스는 더 나은 순방향 호환성을 허용하는 이점이 있습니다. 클라이언트가 인터페이스를 사용하면 변경할 수 없습니다. 추상 클래스를 사용하는 경우 기존 코드를 손상시키지 않고 동작을 추가할 수 있습니다.
  • 구성 요소의 모든 구현 간에 공통적으로 구현된 기능을 제공하려면 추상 클래스를 사용하세요. 추상 클래스를 사용하면 클래스를 부분적으로 구현할 수 있지만 인터페이스에는 멤버에 대한 구현이 포함되지 않습니다.

예시

abstract class Car {
   public void accelerate() {
      System.out.println("Do something to accelerate");
   }
   public void applyBrakes() {
      System.out.println("Do something to apply brakes");
   }
   public abstract void changeGears();
}

이제 인스턴스화하려는 모든 Car는 changeGears() 메서드를 구현해야 합니다.

class Alto extends Car {
   public void changeGears() {
      System.out.println("Implement changeGears() method for Alto Car");
   }
}
class Santro extends Car {
   public void changeGears() {
      System.out.println("Implement changeGears() method for Santro Car");
   }
}

인터페이스를 사용하는 경우

  • 만드는 기능이 다양한 개체에서 유용할 경우 인터페이스를 사용하세요. 추상 클래스는 밀접하게 관련된 객체에 주로 사용해야 하는 반면, 인터페이스는 관련 없는 클래스에 공통 기능을 제공하는 데 가장 적합합니다.
  • 인터페이스는 당분간 API가 변경되지 않을 것이라고 생각할 때 좋은 선택입니다.
  • 인터페이스는 여러 인터페이스를 구현할 수 있으므로 다중 상속과 유사한 것을 원할 때도 좋습니다.
  • 작고 간결한 기능을 디자인하는 경우 인터페이스를 사용하세요. 큰 기능 단위를 디자인하는 경우 추상 클래스를 사용하세요.

예시

public interface Actor {
   void perform();
}
public interface Producer {
   void invest();
}

오늘날 대부분의 배우들은 자신의 영화를 제작할 만큼 부유합니다. 추상 클래스가 아닌 인터페이스를 사용하는 경우 Actor와 Producer를 모두 구현할 수 있습니다. 또한 두 가지를 모두 확장하는 새로운 ActorProducer 인터페이스를 정의할 수 있습니다.

public interface ActorProducer extends Actor, Producer{
   // some statements
}