logo

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

추상 클래스와 인터페이스는 모두 객체 지향 프로그래밍에서 계약을 정의하는 데 사용되지만 둘 사이에는 몇 가지 주요 차이점이 있습니다.

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

정의: 추상 클래스는 인스턴스화할 수 없고 추상 메소드와 비추상 메소드를 모두 포함할 수 있는 클래스입니다. 반면에 인터페이스는 클래스가 구현해야 하는 메서드 집합을 지정하는 계약입니다.



메서드 구현: 추상 클래스에서 일부 메서드는 구현될 수 있지만 다른 메서드는 추상 상태로 유지됩니다. 즉, 구현이 없으며 구체적인 하위 클래스로 재정의되어야 합니다. 반면, 인터페이스의 모든 메서드는 기본적으로 추상 메서드이며 인터페이스를 구현하는 모든 클래스에서 구현되어야 합니다.

상속: 클래스는 하나의 추상 클래스에서만 상속할 수 있지만 여러 인터페이스를 구현할 수 있습니다. 이는 추상 클래스가 객체 유형을 나타내는 반면 인터페이스는 일련의 동작을 나타내기 때문입니다.

액세스 한정자: 추상 클래스는 메서드 및 속성에 대해 public, protected, private과 같은 액세스 한정자를 가질 수 있지만 인터페이스는 공용 액세스만 가질 수 있습니다.

변수: 추상 클래스는 멤버 변수를 가질 수 있지만 인터페이스는 그렇지 않습니다.

요약하면, 추상 클래스는 상속할 구체적인 하위 클래스에 대한 기본 클래스를 제공하는 데 사용되는 반면, 인터페이스는 클래스가 구현해야 하는 메서드 집합을 정의하는 데 사용됩니다. 추상 클래스에는 구현된 메서드와 추상 메서드가 있을 수 있지만 인터페이스에는 추상 메서드만 있을 수 있습니다. 클래스는 하나의 추상 클래스에서만 상속할 수 있지만 여러 인터페이스를 구현할 수 있습니다.

우리가 알고 있듯이 추상화는 기능의 내부 구현을 숨기고 사용자에게만 기능을 표시하는 것을 의미합니다. 즉, 필요한 기능만 표시하고 해당 기능이 이면에서 구현되는 방식을 숨깁니다. 반면 인터페이스는 Java에서 추상화를 달성하는 또 다른 방법입니다. 둘 다 추상 수업 그리고 상호 작용 추상화를 위해 사용되므로 인터페이스와 추상 클래스가 필수 전제 조건입니다.

추상 클래스와 인터페이스

추상 클래스와 인터페이스

  • 방법 유형: 인터페이스에는 추상 메서드만 있을 수 있습니다. 반면 추상 클래스에는 추상 메서드와 구체적인 메서드가 있을 수 있습니다. Java 8부터는 기본 및 정적 메소드도 가질 수 있습니다. Java 9부터는 전용 구체적인 메소드도 가질 수 있습니다.
  • 참고: 구체적인 메소드는 완전한 정의를 갖고 있지만 상속된 클래스에서 재정의될 수도 있는 메소드입니다. 그러나 구체적인 방법을 다음과 같이 만들면 결정적인 메소드를 최종 수단으로 선언하는 것은 상속된 클래스에서 재정의될 수 없습니다. 구현이 완료되었습니다 .
  • 최종 변수: Java 인터페이스에 선언된 변수는 기본적으로 최종 변수입니다. 추상 클래스에는 최종이 아닌 변수가 포함될 수 있습니다.
  • 변수 유형: 추상 클래스에는 최종, 비최종, 정적 및 비정적 변수가 있을 수 있습니다. 인터페이스에는 정적 변수와 최종 변수만 있습니다.
  • 구현: 추상 클래스는 인터페이스 구현을 제공할 수 있습니다. 인터페이스는 추상 클래스의 구현을 제공할 수 없습니다.
  • 상속과 추상화: Java 인터페이스는 키워드를 사용하여 구현할 수 있습니다. 구현하다 추상 클래스는 키워드를 사용하여 확장될 수 있습니다. 연장하다 .
  • 다중 구현: 인터페이스는 하나 이상의 Java 인터페이스를 확장할 수 있습니다. 추상 클래스는 다른 Java 클래스를 확장하고 여러 Java 인터페이스를 구현할 수 있습니다.
  • 다중 상속: 다중 상속은 인터페이스를 사용하여 부분적으로 달성할 수 있지만 추상 클래스를 사용하면 동일하게 수행할 수 없습니다. Java에서는 하나의 클래스가 여러 인터페이스를 구현할 수 있지만 하나의 클래스는 다른 여러 클래스에서 확장할 수 없습니다. 왜냐하면 다이아몬드 문제로 이어질 수 있는 Java에서는 불가능하기 때문입니다.
  • 데이터 구성원의 접근성: Java 인터페이스의 멤버(변수)는 기본적으로 final입니다. Java 추상 클래스에는 개인, 보호 등과 같은 클래스 멤버가 있을 수 있습니다.

추상 클래스의 특징:-

추상 클래스는 직접 인스턴스화할 수 없는 객체 지향 프로그래밍의 특수한 유형의 클래스입니다. 대신 다른 클래스가 파생될 수 있는 청사진이나 템플릿 역할을 합니다. 추상 클래스:

  1. 인스턴스화할 수 없습니다. : 추상 클래스는 직접 인스턴스화할 수 없습니다. 즉, 추상 클래스의 개체를 만들 수 없습니다.
  2. 하나 이상의 순수 가상 함수를 포함합니다. : 추상 클래스에는 하나 이상의 순수 가상 함수가 포함되어야 합니다. 이는 함수에 구현이 없으며 파생 클래스에 의해 구현되어야 함을 의미합니다.
  3. 추상 메소드와 비추상 메소드를 모두 포함할 수 있습니다. : 추상 클래스는 추상 메소드와 비추상 메소드를 모두 가질 수 있습니다. 비추상 메서드는 완벽하게 구현되어 있으며 직접 호출할 수 있습니다.
  4. 생성자와 소멸자를 가질 수 있음 : 추상 클래스는 다른 클래스와 마찬가지로 생성자와 소멸자를 가질 수 있습니다.
  5. 멤버 변수를 가질 수 있음 : 추상 클래스는 클래스의 객체에 속하는 변수인 멤버 변수를 가질 수 있습니다.
  6. 기본 클래스로 사용 가능 : 추상 클래스는 다른 클래스의 기본 클래스로 사용될 수 있습니다. 즉, 다른 클래스에서 상속될 수 있습니다.

전반적으로 추상 클래스는 여러 관련 클래스에서 공유할 수 있지만 각 파생 클래스의 특정 구현을 사용하여 공유할 수 있는 공통 인터페이스 또는 동작을 정의하는 데 사용됩니다.

예제 1: (추상 클래스의 경우)

자바
abstract class sunstar {    abstract void printInfo(); } class employee extends sunstar {  void printInfo()  {  String name = 'avinash';  int age = 21;  float salary = 222.2F;  System.out.println(name);  System.out.println(age);  System.out.println(salary);  } } class base {  public static void main(String args[])  {  sunstar s = new employee();  s.printInfo();  } }>

산출
avinash 21 222.2>

예제 2: (추상 클래스의 경우)

자바
// Java Program to Illustrate Concept of // Abstract Class // Importing required classes import java.io.*; // Class 1 // Helper abstract class abstract class Shape {  // Declare fields  String objectName = ' ';  // Constructor of this class  Shape(String name) { this.objectName = name; }  // Method  // Non-abstract methods  // Having as default implementation  public void moveTo(int x, int y)  {  System.out.println(this.objectName + ' '  + 'has been moved to'  + ' x = ' + x + ' and y = ' + y);  }  // Method 2  // Abstract methods which will be  // implemented by its subclass(es)  abstract public double area();  abstract public void draw(); } // Class 2 // Helper class extending Class 1 class Rectangle extends Shape {  // Attributes of rectangle  int length, width;  // Constructor  Rectangle(int length, int width, String name)  {  // Super keyword refers to current instance itself  super(name);  // this keyword refers to current instance itself  this.length = length;  this.width = width;  }  // Method 1  // To draw rectangle  @Override public void draw()  {  System.out.println('Rectangle has been drawn ');  }  // Method 2  // To compute rectangle area  @Override public double area()  {  // Length * Breadth  return (double)(length * width);  } } // Class 3 // Helper class extending Class 1 class Circle extends Shape {  // Attributes of a Circle  double pi = 3.14;  int radius;  // Constructor  Circle(int radius, String name)  {  // Super keyword refers to parent class  super(name);  // This keyword refers to current instance itself  this.radius = radius;  }  // Method 1  // To draw circle  @Override public void draw()  {  // Print statement  System.out.println('Circle has been drawn ');  }  // Method 2  // To compute circle area  @Override public double area()  {  return (double)((pi * radius * radius));  } } // Class 4 // Main class class GFG {  // Main driver method  public static void main(String[] args)  {  // Creating the Object of Rectangle class  // and using shape class reference.  Shape rect = new Rectangle(2, 3, 'Rectangle');  System.out.println('Area of rectangle: '  + rect.area());  rect.moveTo(1, 2);  System.out.println(' ');  // Creating the Objects of circle class  Shape circle = new Circle(2, 'Circle');  System.out.println('Area of circle: '  + circle.area());  circle.moveTo(2, 4);  } }>

산출
Area of rectangle: 6.0 Rectangle has been moved to x = 1 and y = 2 Area of circle: 12.56 Circle has been moved to x = 2 and y = 4>

직사각형과 원 사이에 공통 코드가 없다면 인터페이스를 사용하면 됩니다.

상호 작용:

인터페이스의 특징:

인터페이스:

  1. 메서드 및 속성 집합을 정의합니다. 인터페이스는 인터페이스를 구현하는 클래스나 구조에서 구현해야 하는 메서드 및 속성 집합을 정의합니다.
  2. 공통 프로토콜을 제공합니다: 인터페이스는 서로 다른 소프트웨어 구성 요소가 서로 통신할 수 있도록 하는 공통 프로토콜을 제공합니다.
  3. 다형성을 지원합니다: 인터페이스는 다형성을 달성하는 데 사용될 수 있습니다. 즉, 서로 다른 클래스의 객체가 동일한 인터페이스를 구현하는 한 동일한 유형에 속하는 것처럼 처리될 수 있습니다.
  4. 우려 사항을 분리할 수 있습니다. 인터페이스를 사용하면 관심사를 분리할 수 있습니다. 즉, 인터페이스 사양을 준수하는 한 소프트웨어 시스템의 여러 부분을 서로 독립적으로 개발할 수 있습니다.
  5. 코드 재사용성 향상: 인터페이스는 동일한 인터페이스를 구현하는 한 다양한 소프트웨어 구성 요소가 동일한 코드 기반을 재사용할 수 있도록 하여 코드 재사용성을 향상시킵니다.
  6. 디자인 패턴을 적용합니다. 인터페이스를 사용하면 구현 클래스에서 특정 메서드나 속성을 구현하도록 요구하여 어댑터 패턴과 같은 디자인 패턴을 적용할 수 있습니다.
  7. 테스트를 용이하게 합니다. 인터페이스는 인터페이스를 구현하는 모의 개체를 사용하여 소프트웨어 구성 요소를 서로 독립적으로 테스트할 수 있도록 하여 테스트를 용이하게 합니다.

예 1: 인터페이스의 경우

자바
// Java Program to Illustrate Concept of Interface // Importing I/O classes import java.io.*; // Interface interface Shape {  // Abstract method  void draw();  double area(); } // Class 1 // Helper class class Rectangle implements Shape {  int length, width;  // constructor  Rectangle(int length, int width)  {  this.length = length;  this.width = width;  }  @Override public void draw()  {  System.out.println('Rectangle has been drawn ');  }  @Override public double area()  {  return (double)(length * width);  } } // Class 2 // Helper class class Circle implements Shape {  double pi = 3.14;  int radius;  // constructor  Circle(int radius) { this.radius = radius; }  @Override public void draw()  {  System.out.println('Circle has been drawn ');  }  @Override public double area()  {  return (double)((pi * radius * radius));  } } // Class 3 // Main class class GFG {  // Main driver method  public static void main(String[] args)  {  // Creating the Object of Rectangle class  // and using shape interface reference.  Shape rect = new Rectangle(2, 3);  System.out.println('Area of rectangle: '  + rect.area());  // Creating the Objects of circle class  Shape circle = new Circle(2);  System.out.println('Area of circle: '  + circle.area());  } }>

산출
Area of rectangle: 6.0 Area of circle: 12.56>

예 2: 인터페이스의 경우

자바
// Java Program to Illustrate Concept of Interface // Importing I/O classes import java.io.*; // Interface interface Shape {  // Abstract method  void draw();  double area(); } // Class 1 // Helper class class Rectangle implements Shape {  int length, width;  // constructor  Rectangle(int length, int width)  {  this.length = length;  this.width = width;  }  @Override public void draw()  {  System.out.println('Rectangle has been drawn ');  }  @Override public double area()  {  return (double)(length * width);  } } // Class 2 // Helper class class Circle implements Shape {  double pi = 3.14;  int radius;  // constructor  Circle(int radius) { this.radius = radius; }  @Override public void draw()  {  System.out.println('Circle has been drawn ');  }  @Override public double area()  {  return (double)((pi * radius * radius));  } } // Class 3 // Main class class GFG {  // Main driver method  public static void main(String[] args)  {  // Creating the Object of Rectangle class  // and using shape interface reference.  Shape rect = new Rectangle(2, 3);  System.out.println('Area of rectangle: '  + rect.area());  // Creating the Objects of circle class  Shape circle = new Circle(2);  System.out.println('Area of circle: '  + circle.area());  } }>

산출
Area of rectangle: 6.0 Area of circle: 12.56>

언제 무엇을 사용하나요?

다음 설명 중 하나라도 해당 상황에 적용되는 경우 추상 클래스 사용을 고려하세요.

  • Java 애플리케이션에는 일부 코드 줄을 공유해야 하는 관련 클래스가 있습니다. 그런 다음 이러한 코드 줄을 추상 클래스 내에 넣을 수 있으며 이 추상 클래스는 모든 관련 클래스에 의해 확장되어야 합니다.
  • 메소드를 통해 해당 필드가 속한 객체의 상태에 액세스하고 수정할 수 있도록 추상 클래스에서 비정적 또는 비최종 필드를 정의할 수 있습니다.
  • 추상 클래스를 확장하는 클래스에는 많은 공통 메서드나 필드가 있거나 public 이외의 액세스 한정자(예: protected 및 private)가 필요할 것으로 예상할 수 있습니다.

다음 설명 중 하나라도 해당 상황에 적용되는 경우 인터페이스 사용을 고려하세요.

  • 이는 완전한 추상화입니다. 인터페이스 내에 선언된 모든 메서드는 이 인터페이스를 구현하는 클래스에 의해 구현되어야 합니다.
  • 클래스는 둘 이상의 인터페이스를 구현할 수 있습니다. 이를 다중 상속이라고 합니다.
  • 특정 데이터 유형의 동작을 지정하고 싶지만 누가 그 동작을 구현하는지에 대해서는 관심이 없습니다.