추상 클래스와 인터페이스는 모두 객체 지향 프로그래밍에서 계약을 정의하는 데 사용되지만 둘 사이에는 몇 가지 주요 차이점이 있습니다.
추상 클래스와 인터페이스의 차이점:-
정의: 추상 클래스는 인스턴스화할 수 없고 추상 메소드와 비추상 메소드를 모두 포함할 수 있는 클래스입니다. 반면에 인터페이스는 클래스가 구현해야 하는 메서드 집합을 지정하는 계약입니다.
메서드 구현: 추상 클래스에서 일부 메서드는 구현될 수 있지만 다른 메서드는 추상 상태로 유지됩니다. 즉, 구현이 없으며 구체적인 하위 클래스로 재정의되어야 합니다. 반면, 인터페이스의 모든 메서드는 기본적으로 추상 메서드이며 인터페이스를 구현하는 모든 클래스에서 구현되어야 합니다.
상속: 클래스는 하나의 추상 클래스에서만 상속할 수 있지만 여러 인터페이스를 구현할 수 있습니다. 이는 추상 클래스가 객체 유형을 나타내는 반면 인터페이스는 일련의 동작을 나타내기 때문입니다.
액세스 한정자: 추상 클래스는 메서드 및 속성에 대해 public, protected, private과 같은 액세스 한정자를 가질 수 있지만 인터페이스는 공용 액세스만 가질 수 있습니다.
변수: 추상 클래스는 멤버 변수를 가질 수 있지만 인터페이스는 그렇지 않습니다.
요약하면, 추상 클래스는 상속할 구체적인 하위 클래스에 대한 기본 클래스를 제공하는 데 사용되는 반면, 인터페이스는 클래스가 구현해야 하는 메서드 집합을 정의하는 데 사용됩니다. 추상 클래스에는 구현된 메서드와 추상 메서드가 있을 수 있지만 인터페이스에는 추상 메서드만 있을 수 있습니다. 클래스는 하나의 추상 클래스에서만 상속할 수 있지만 여러 인터페이스를 구현할 수 있습니다.
우리가 알고 있듯이 추상화는 기능의 내부 구현을 숨기고 사용자에게만 기능을 표시하는 것을 의미합니다. 즉, 필요한 기능만 표시하고 해당 기능이 이면에서 구현되는 방식을 숨깁니다. 반면 인터페이스는 Java에서 추상화를 달성하는 또 다른 방법입니다. 둘 다 추상 수업 그리고 상호 작용 추상화를 위해 사용되므로 인터페이스와 추상 클래스가 필수 전제 조건입니다.

추상 클래스와 인터페이스
- 방법 유형: 인터페이스에는 추상 메서드만 있을 수 있습니다. 반면 추상 클래스에는 추상 메서드와 구체적인 메서드가 있을 수 있습니다. Java 8부터는 기본 및 정적 메소드도 가질 수 있습니다. Java 9부터는 전용 구체적인 메소드도 가질 수 있습니다.
- 참고: 구체적인 메소드는 완전한 정의를 갖고 있지만 상속된 클래스에서 재정의될 수도 있는 메소드입니다. 그러나 구체적인 방법을 다음과 같이 만들면 결정적인 메소드를 최종 수단으로 선언하는 것은 상속된 클래스에서 재정의될 수 없습니다. 구현이 완료되었습니다 .
- 최종 변수: Java 인터페이스에 선언된 변수는 기본적으로 최종 변수입니다. 추상 클래스에는 최종이 아닌 변수가 포함될 수 있습니다.
- 변수 유형: 추상 클래스에는 최종, 비최종, 정적 및 비정적 변수가 있을 수 있습니다. 인터페이스에는 정적 변수와 최종 변수만 있습니다.
- 구현: 추상 클래스는 인터페이스 구현을 제공할 수 있습니다. 인터페이스는 추상 클래스의 구현을 제공할 수 없습니다.
- 상속과 추상화: Java 인터페이스는 키워드를 사용하여 구현할 수 있습니다. 구현하다 추상 클래스는 키워드를 사용하여 확장될 수 있습니다. 연장하다 .
- 다중 구현: 인터페이스는 하나 이상의 Java 인터페이스를 확장할 수 있습니다. 추상 클래스는 다른 Java 클래스를 확장하고 여러 Java 인터페이스를 구현할 수 있습니다.
- 다중 상속: 다중 상속은 인터페이스를 사용하여 부분적으로 달성할 수 있지만 추상 클래스를 사용하면 동일하게 수행할 수 없습니다. Java에서는 하나의 클래스가 여러 인터페이스를 구현할 수 있지만 하나의 클래스는 다른 여러 클래스에서 확장할 수 없습니다. 왜냐하면 다이아몬드 문제로 이어질 수 있는 Java에서는 불가능하기 때문입니다.
- 데이터 구성원의 접근성: Java 인터페이스의 멤버(변수)는 기본적으로 final입니다. Java 추상 클래스에는 개인, 보호 등과 같은 클래스 멤버가 있을 수 있습니다.
추상 클래스의 특징:-
추상 클래스는 직접 인스턴스화할 수 없는 객체 지향 프로그래밍의 특수한 유형의 클래스입니다. 대신 다른 클래스가 파생될 수 있는 청사진이나 템플릿 역할을 합니다. 추상 클래스:
- 인스턴스화할 수 없습니다. : 추상 클래스는 직접 인스턴스화할 수 없습니다. 즉, 추상 클래스의 개체를 만들 수 없습니다.
- 하나 이상의 순수 가상 함수를 포함합니다. : 추상 클래스에는 하나 이상의 순수 가상 함수가 포함되어야 합니다. 이는 함수에 구현이 없으며 파생 클래스에 의해 구현되어야 함을 의미합니다.
- 추상 메소드와 비추상 메소드를 모두 포함할 수 있습니다. : 추상 클래스는 추상 메소드와 비추상 메소드를 모두 가질 수 있습니다. 비추상 메서드는 완벽하게 구현되어 있으며 직접 호출할 수 있습니다.
- 생성자와 소멸자를 가질 수 있음 : 추상 클래스는 다른 클래스와 마찬가지로 생성자와 소멸자를 가질 수 있습니다.
- 멤버 변수를 가질 수 있음 : 추상 클래스는 클래스의 객체에 속하는 변수인 멤버 변수를 가질 수 있습니다.
- 기본 클래스로 사용 가능 : 추상 클래스는 다른 클래스의 기본 클래스로 사용될 수 있습니다. 즉, 다른 클래스에서 상속될 수 있습니다.
전반적으로 추상 클래스는 여러 관련 클래스에서 공유할 수 있지만 각 파생 클래스의 특정 구현을 사용하여 공유할 수 있는 공통 인터페이스 또는 동작을 정의하는 데 사용됩니다.
예제 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: 인터페이스의 경우
자바 // 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)가 필요할 것으로 예상할 수 있습니다.
다음 설명 중 하나라도 해당 상황에 적용되는 경우 인터페이스 사용을 고려하세요.
- 이는 완전한 추상화입니다. 인터페이스 내에 선언된 모든 메서드는 이 인터페이스를 구현하는 클래스에 의해 구현되어야 합니다.
- 클래스는 둘 이상의 인터페이스를 구현할 수 있습니다. 이를 다중 상속이라고 합니다.
- 특정 데이터 유형의 동작을 지정하고 싶지만 누가 그 동작을 구현하는지에 대해서는 관심이 없습니다.