자바 인터페이스는 핵심 개념 중 하나입니다. 자바 인터페이스는 자바 프로그래밍 언어의 핵심 부분이며 자바 디자인 패턴뿐만 아니라 JDK에도 많이 사용됩니다. 대부분의 프레임워크에서 자바 인터페이스를 많이 사용합니다.
자바에서의 인터페이스
자바에서의 인터페이스는 추상화를 달성하는 방법을 제공합니다. 또한 자바 인터페이스는 하위 클래스가 구현해야 할 계약을 정의하는 데에도 사용됩니다. 예를 들어, 여러 도형으로 이루어진 그림을 생성하고자 한다고 가정해봅시다. 여기서는
Shape
이라는 인터페이스를 생성하고, 다양한 유형의 도형 객체가 구현할 모든 메소드를 정의할 수 있습니다. 간단하게, 도형을 그리는 draw()
메소드와 도형의 면적을 반환하는 getArea()
메소드만을 포함합니다.
자바 인터페이스 예시
위의 요구사항에 기반하여, Shape 인터페이스는 다음과 같이 정의됩니다. Shape.java
package com.journaldev.design;
public interface Shape {
//암시적으로 public, static 및 final
public String LABLE="Shape";
//인터페이스 메서드는 암시적으로 추상 및 public
void draw();
double getArea();
}
Java에서 인터페이스에 대한 중요한 점
-
interface
는 자바에서 인터페이스를 생성하는 데 사용되는 코드입니다. -
우리는 자바에서 인터페이스를 인스턴스화할 수 없습니다.
-
인터페이스는 절대 추상화를 제공합니다. 지난 글에서는 자바의 추상 클래스를 통해 추상화를 제공했지만 추상 클래스에는 메서드 구현이 있을 수 있지만 인터페이스는 그렇지 않습니다.
-
인터페이스에는 생성자가 없으며 인스턴스화할 수 없으며 인터페이스에는 본문이 있는 메서드가 없습니다.
-
기본적으로 인터페이스의 어떤 속성도 공개, 정적이며 최종이므로 속성에 액세스 수정자를 제공할 필요가 없지만 제공해도 컴파일러가 이를 불평하지 않습니다.
-
기본적으로 인터페이스 메서드는 암시적으로 추상이고 공개입니다. 메서드에는 본문이 없으므로 하위 클래스가 메서드 구현을 제공할 수 있습니다.
-
인터페이스는 어떤 클래스도 확장할 수 없지만 다른 인터페이스를 확장할 수 있습니다.
public interface Shape extends Cloneable{}
는 다른 인터페이스를 확장하는 인터페이스의 예입니다. 실제로 자바는 인터페이스에서 다중 상속을 제공합니다. 즉, 인터페이스는 여러 인터페이스를 확장할 수 있습니다. -
implements
키워드는 클래스가 인터페이스를 구현하는 데 사용됩니다. -
인터페이스를 구현하는 클래스는 추상 클래스가 아닌 한 모든 메서드에 대한 구현을 제공해야 합니다. 예를 들어, 다음과 같이 추상 클래스에서 위의 인터페이스를 구현할 수 있습니다:
ShapeAbs.java
package com.journaldev.design; public abstract class ShapeAbs implements Shape { @Override public double getArea() { // TODO Auto-generated method stub return 0; } }
-
구현 클래스가 항상 구현을 제공할 것이라는 것을 미리 알기 위해 프로그램을 구현보다는 인터페이스의 관점에서 작성해야 합니다. 미래에 더 나은 구현이 도착하면 쉽게 전환할 수 있습니다.
자바 인터페이스 구현 예제
이제 자바에서 Shape 인터페이스를 구현한 몇 가지 예를 살펴보겠습니다. Circle.java
package com.journaldev.design;
public class Circle implements Shape {
private double radius;
public Circle(double r){
this.radius = r;
}
@Override
public void draw() {
System.out.println("Drawing Circle");
}
@Override
public double getArea(){
return Math.PI*this.radius*this.radius;
}
public double getRadius(){
return this.radius;
}
}
알림: Circle 클래스는 인터페이스에서 정의된 모든 메서드를 구현했으며 getRadius()
와 같은 몇 가지 자체 메서드도 있습니다. 인터페이스 구현은 여러 유형의 생성자를 가질 수 있습니다. Shape 인터페이스에 대한 또 다른 인터페이스 구현을 살펴보겠습니다. Rectangle.java
package com.journaldev.design;
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double w, double h){
this.width=w;
this.height=h;
}
@Override
public void draw() {
System.out.println("Drawing Rectangle");
}
@Override
public double getArea() {
return this.height*this.width;
}
}
@Override 주석의 사용에 주목하고 자바에서의 주석 및 자바에서 메서드를 오버라이드할 때 항상 @Override 주석을 사용해야하는 이유에 대해 알아보세요. 인터페이스 및 구현이 아닌 인터페이스를 사용하여 코드를 작성하는 방법을 보여주는 테스트 프로그램이 여기 있습니다. ShapeTest.java
package com.journaldev.design;
public class ShapeTest {
public static void main(String[] args) {
//인터페이스가 아닌 구현체에 대한 프로그래밍
Shape shape = new Circle(10);
shape.draw();
System.out.println("Area="+shape.getArea());
//다른 구현체로 쉽게 전환 가능
shape=new Rectangle(10,10);
shape.draw();
System.out.println("Area="+shape.getArea());
}
}
위의 자바 인터페이스 예제 프로그램의 출력은 다음과 같습니다:
Drawing Circle
Area=314.1592653589793
Drawing Rectangle
Area=100.0
자바 인터페이스 이점
- 인터페이스는 모든 구현 클래스에 대한 계약을 제공하므로 인터페이스를 사용하여 코드를 작성하는 것이 좋습니다. 구현 클래스에서는 사용 중인 메서드를 제거할 수 없습니다.
- 인터페이스는 유형을 정의하고 코드의 최상위 계층을 생성하는 시작점으로 좋습니다.
- 자바 클래스는 여러 인터페이스를 구현할 수 있으므로 대부분의 경우 인터페이스를 슈퍼 클래스로 사용하는 것이 좋습니다.
Java Interface 단점
인터페이스는 많은 이점을 제공하지만 몇 가지 단점도 있습니다.
-
프로젝트를 설계할 때 인터페이스 메서드를 신중하게 선택해야 합니다. 나중에 인터페이스에서 메서드를 추가하거나 제거할 수 없으므로 모든 구현 클래스에 컴파일 오류가 발생할 수 있습니다. 때로는 코드에서 기본 인터페이스를 확장하는 많은 인터페이스가 발생하여 유지 관리가 어려워집니다.
-
구현 클래스에 자체 메서드가 있는 경우 객체의 유형이 해당 메서드를 가지지 않는 인터페이스이기 때문에 코드에서 직접 사용할 수 없습니다. 예를 들어 위의 코드에서 코드
shape.getRadius()
는 컴파일 오류가 발생합니다. 이를 극복하기 위해 형 변환을 사용하고 다음과 같이 메서드를 사용할 수 있습니다:Circle c = (Circle) shape; c.getRadius();
그러나 클래스 형 변환에는 단점이 있습니다.
자바에서 인터페이스에 대해 제시한 내용입니다. 우리는 자바 인터페이스를 많이 사용하기 때문에 그 특징을 알아야 합니다. 시스템을 설계할 때 인터페이스를 사용하고, 클라이언트와 인터페이스를 구현하는 하위 클래스 간의 계약으로 사용하십시오. 업데이트: Java 8은 기본 메서드와 정적 메서드 구현을 소개하여 인터페이스의 정의를 변경했습니다. 자세한 내용은 Java 8 인터페이스를 읽어주세요.
Source:
https://www.digitalocean.com/community/tutorials/interface-in-java