English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 Java 인터페이스를 배웁니다. 예제를 통해 인터페이스 구현 방법과 사용 시기를 배우겠습니다.
Java에서 인터페이스는 다른 클래스가 구현해야 할 규약을 정의합니다. 예를 들어,
interface Polygon { public void getArea(); }
여기서 Polygon은 인터페이스입니다. interface 키워드를 사용하여 인터페이스를 선언했습니다.
getArea() 메서드는 Polygon 인터페이스에서 정의된 규약입니다. 이 인터페이스를 사용하는 모든 클래스는 getArea() 메서드를 구현해야 합니다.
인터페이스는 추상 메서드와 상수를 포함할 수 있습니다. 예를 들어,
interface Polygon { public static final String color = "blue"; public void getArea(); }
위의 예제에서 Polygon 인터페이스를 생성했습니다. 이 인터페이스는 color이라는 상수 변수와 getArea()라는 추상 메서드를 포함하고 있습니다.
중요한 것은 인터페이스 내 모든 메서드가 은닉된 public이고 모든 필드가 은닉된 public static final이라는 점입니다. 따라서 인터페이스 내에서 접근자를 지정할 필요가 없습니다. 예를 들어, 위의 코드를 다음과 같이 작성할 수 있습니다.
interface Polygon { String color = "blue"; void getArea(); }
abstract class과 같이, 인터페이스의 객체를 생성할 수 없습니다. 그러나 다른 클래스에서 인터페이스를 구현할 수 있습니다. Java에서는 implements 키워드를 사용하여 인터페이스를 구현합니다. 예를 들어,
interface Polygon { void getArea(int length, int breadth); } class Rectangle implements Polygon { public void getArea(int length, int breadth) { System.out.println("직사각형의 면적은 " + (length * breadth)); } } class Main { public static void main(String[] args) { Rectangle r1 = new Rectangle(); r1.getArea(5, 6); } }
출력 결과
직사각형의 면적은 30
위의 프로그램에서는 인터페이스 Polygon을 생성했습니다. Polygon 인터페이스는 abstract 메서드 getArea()를 가집니다.
이는 Polygon을 구현하는 모든 클래스가 getArea() 메서드를 구현해야 한다는 것을 의미합니다.
Rectangle 클래스( Polygon 인터페이스를 구현하는)는 구현된 메서드 getArea()를 가지고 있습니다.
인터페이스가 무엇인지 알게 되었으므로, Java에서 인터페이스를 사용하는 이유를 이해해보겠습니다.
인터페이스는 클래스(그를 구현하는)가 따라야 할 규범을 제공합니다.
위의 예제에서는 getArea()를 인터페이스 Polygon의 규범으로 사용했습니다. 이는 각 다각형의 면적을 가져올 수 있는 규칙을 설정하는 것과 같습니다. 따라서 Polygon 인터페이스를 구현하는 모든 클래스는 getArea() 메서드의 구현을 제공해야 합니다.
abstract class과 유사하게, 인터페이스는 Java의 abstract를 구현하는 데 도움을 줍니다. 여기서는 getArea()가 다각형의 면적을 계산한다는 것을 알고 있지만, 다른 다각형에서 면적을 계산하는 방법은 다릅니다. 따라서 getArea()의 구현은 상호 독립적입니다.
Java에서는 클래스를 통해 다중 상속을 구현할 수 없습니다. 그러나 하나의 클래스는 여러 인터페이스를 구현할 수 있습니다. 이는 Java에서 다중 상속 기능을 얻을 수 있게 합니다. 예를 들어,
interface Line { ... } interface Polygon { ... } class Rectangle implements Line, Polygon{ ... }
여기서는 Rectangle는 Line과 Polygon의 모든 메서드 구현을 제공해야 합니다.
Java 8
클래스와 유사하게, 우리는 그 참조를 사용하여 인터페이스의 static method에 접근할 수 있습니다. 예를 들어,
Polygon.staticMethod();
또한, Java에서 인터페이스는 9private method를 지원하는 배포판에서 사용할 수 있습니다. 지금부터는 인터페이스에서 사용할 수 있습니다.private method와private static method。
인터페이스를 인스턴스화할 수 없기 때문에, 기본 메서드를 보조 메서드로 사용하여 인터페이스 내의 다른 메서드에 지원을 제공합니다.
Java 8에서, 인터페이스 내부에 구현된 메서드(기본 메서드)를 도입했습니다. 이전에는 모든 메서드가 Java의 추상 메서드였습니다.
인터페이스 내부에서 기본 메서드를 선언하려면 default 키워드를 사용합니다. 예를 들어,
public default void getSides() { //getSides()의 본문 }
Java에서 기본 메서드를 도입한 이유를 이해하기 위해 상황을 하나 들어보겠습니다.
인터페이스에 새 메서드를 추가해야 할 때를 생각해보겠습니다.
이 메서드를 쉽게 인터페이스에 추가할 수 있지만, 이것이 전부는 아닙니다. 이 인터페이스를 구현한 모든 클래스는 이 메서드의 구현을 제공해야 합니다.
이 인터페이스를 구현하는 많은 클래스가 있다면, 모든 이를 추적하고 변경해야 합니다. 이는 번거롭고 오류가 쉽게 발생할 수 있습니다.
이 문제를 해결하기 위해 Java는 기본 메서드를 도입했습니다. 기본 메서드는 일반 메서드와 같이 상속됩니다.
기본 메서드를 더 잘 이해하기 위해 예제를 하나 들어보겠습니다.
interface Polygon { void getArea(); default void getSides() { System.out.println("다각형의 각을 얻을 수 있습니다."); } } class Rectangle implements Polygon { public void getArea() { int length = 6; int breadth = 5; int area = length * breadth; System.out.println("직사각형의 면적은 "+area); } public void getSides() { System.out.println("저는 네 가지 점이 있습니다."); } } class Square implements Polygon { public void getArea() { int length = 5; int area = length * length; System.out.println("사각형의 면적은 "+area); } } class Main { public static void main(String[] args) { Rectangle r1 = new Rectangle(); r1.getArea(); r1.getSides(); Square s1 = new Square(); s1.getArea(); } }
출력 결과
직사각형의 면적은 30 저는 네 가지 점이 있습니다. 사각형의 면적은 25
위의 예제에서, 우리는 Polygon 인터페이스를 생성했습니다. Polygon에는 기본 메서드 getSides()와 추상 메서드 getArea()가 있습니다.
그런 다음, Rectangle 클래스는 Polygon을 구현하고, Rectangle는 getArea() 추상 메서드의 구현을 제공하고 기본 메서드 getSides()를 오버라이드합니다.
다른 Square 클래스를 생성하여 Polygon을 구현했습니다. 여기서 Square는 추상 메서드 getArea()의 구현만 제공합니다.
실용적인 Java 인터페이스 예제를 보겠습니다.
//sqrt 함수 사용 import java.lang.Math; interface Polygon { void getArea(); //다각형의 둘레 계산 default void getPerimeter(int... sides) { int perimeter = 0; for (int side : sides) { perimeter += side; } System.out.println("둘레: " + perimeter); } } class Triangle implements Polygon { private int a, b, c; private double s, area; //삼각형의 변을 초기화 Triangle(int a, int b, int c) { this.a = a; this.b = b; this.c = c; s = 0; } //삼각형의 면적 계산 public void getArea() { s = (double) (a + b + c)/2; area = Math.sqrt(s*(s-a)*(s-b)*(s-c)); System.out.println("면적: " + area); } } class Main { public static void main(String[] args) { Triangle t1 = new Triangle(2, 3, 4); //Triangle 클래스의 메서드 호출 t1.getArea(); //Polygon 클래스의 메서드 호출 t1.getPerimeter(2, 3, 4); } }
출력 결과
면적: 2.9047375096555625 둘레: 9
위 프로그램에서는 Polygon 인터페이스를 생성했습니다. 이 인터페이스는 기본 메서드 getParameter()와 추상 메서드 getArea()를 포함하고 있습니다.
모든 다각형의 둘레를 동일한 방식으로 계산할 수 있으므로, Polygon에서 getPerimeter() 메서드의 본체를 구현했습니다. 따라서 Polygon을 구현한 모든 다각형은 getPerimeter()를 사용하여 둘레를 계산할 수 있습니다.
하지만, 면적 계산 방식은 다른 다각형에 따라 다릅니다. 이는 다른 다각형의 면적 계산 규칙이 다릅니다.
따라서, Polygon에서 구현되지 않았지만 getArea()를 포함하고 있습니다. Polygon 인터페이스를 구현하는 모든 클래스는 getArea() 구현을 제공해야 합니다.
클래스와 유사하게, 인터페이스는 다른 인터페이스를 상속할 수 있으며, extends 키워드가 상속에 사용됩니다. 예를 들어,
interface Line { //Line 인터페이스의 멤버 } interface Polygon extends Line { //Polygon 인터페이스와 Line 인터페이스의 멤버 }
위의 예제에서 인터페이스 Polygon은 Line 인터페이스를 확장했습니다. 지금, Polygon을 구현하는 클래스가 있다면, Line과 Polygon의 모든 추상 클래스를 구현해야 합니다.
주의하십시오, 하나의 인터페이스는 여러 인터페이스를 상속할 수 있으며, 여러 인터페이스를 구현하는 클래스와 유사합니다. 예를 들어,
interface A { ... } interface B { ... } Interface C extends A, B { ... }