1. 인터페이스 소개
오늘은 지식의 날입니다. 또 다른 새롭고 흥미로운 주제는 인터페이스입니다.
인터페이스 의 개념은 추상화 및 다형성 원칙의 자식입니다. 인터페이스는 모든 메서드가 추상인 추상 클래스와 매우 유사합니다. 클래스와 같은 방식으로 선언되지만 키워드를 사용합니다 interface
.
interface Feline
{
void purr();
void meow();
void growl();
}
다음은 인터페이스에 대한 몇 가지 유용한 사실입니다.
1. 인터페이스 선언
interface Drawable
{
void draw();
}
interface HasValue
{
int getValue();
}
class
키워드 대신interface
.- 추상 메소드만 포함합니다(키워드를 작성하지 마십시오
abstract
). - 실제로 인터페이스에는 모든
public
메서드가 있습니다.
인터페이스는 인터페이스만 상속할 수 있습니다. 그러나 인터페이스는 많은 부모를 가질 수 있습니다. 이것을 말하는 또 다른 방법은 Java가 인터페이스의 다중 상속을 가지고 있다고 말하는 것입니다. 예:
interface Piece extends Drawable, HasValue
{
int getX();
int getY();
}
3. 인터페이스에서 클래스 상속
클래스는 여러 인터페이스를 상속할 수 있습니다(하나의 클래스에서만). 이것은 implements
키워드를 사용하여 수행됩니다. 예:
abstract class ChessItem implements Drawable, HasValue
{
private int x, y, value;
public int getValue()
{
return value;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
}
ChessItem 클래스는 추상으로 선언됩니다. 를 제외한 모든 상속된 메서드를 구현합니다 draw
. 즉, ChessItem
클래스에는 하나의 추상 메서드인 draw()
.
extends
및 키워드 의 기술적 의미는 implements
동일합니다. 둘 다 상속입니다. 코드의 가독성을 높이기 위해 구분했습니다. extends
우리는 또한 클래스가 상속되고( 통해 ) 인터페이스가 구현된다고 말합니다 ( 통해 implements
).
4. 변수
여기에 가장 중요한 것이 있습니다. 일반 변수는 인터페이스에서 선언할 수 없습니다 (정적 변수는 가능하지만).
하지만 인터페이스가 필요한 이유는 무엇입니까? 그들은 언제 사용됩니까? 인터페이스는 클래스에 비해 두 가지 강력한 이점이 있습니다.
2. 구현에서 "메서드 설명"을 분리합니다.
이전에 클래스의 메서드가 다른 클래스에서 호출되도록 허용하려면 메서드에 키워드를 표시해야 한다고public
말했습니다 . 이러한 메서드 중 일부를 클래스 내에서만 호출하려면 키워드로 표시해야 합니다 private
. 즉, 우리는 클래스의 메서드를 "누구나 사용할 수 있는"과 "우리 자신만 사용할 수 있는" 두 가지 범주로 나눕니다.
인터페이스는 이 구분을 더욱 강화하는 데 도움이 됩니다. 우리는 특별한 "모두가 사용할 수 있는 클래스"와 첫 번째 클래스를 상속할 "우리 자신만 사용할 수 있는" 두 번째 클래스를 만들 것입니다. 대략적인 모습은 다음과 같습니다.
전에 | 후에 |
---|---|
|
|
|
|
클래스를 인터페이스 와 인터페이스 를 상속하는 클래스 의 두 가지로 나눕니다 . 그리고 여기서 장점은 무엇입니까?
많은 다른 클래스가 동일한 인터페이스를 구현(상속)할 수 있습니다. 그리고 각각은 고유한 동작을 가질 수 있습니다. 예를 들어 인터페이스 ArrayList
LinkedList
의 두 가지 다른 구현이 있습니다 List
.
따라서 다양한 구현뿐만 아니라 구현 클래스 자체도 숨깁니다(코드에서 인터페이스만 필요하므로). 이를 통해 우리는 매우 유연해질 수 있습니다. 프로그램이 실행되는 즉시 한 개체를 다른 개체로 교체하여 개체를 사용하는 모든 클래스에 영향을 주지 않고 개체의 동작을 변경할 수 있습니다.
이것은 다형성과 결합될 때 매우 강력한 기술입니다. 지금은 왜 이렇게 해야 하는지 명확하지 않습니다. 인터페이스가 없는 것보다 삶을 훨씬 더 쉽게 만들 수 있다는 것을 이해하려면 먼저 수십 또는 수백 개의 클래스가 있는 프로그램을 접해야 합니다.
3. 다중 상속
Java에서 모든 클래스는 하나의 상위 클래스만 가질 수 있습니다. 다른 프로그래밍 언어에서 클래스는 종종 여러 부모 클래스를 가질 수 있습니다. 이것은 매우 편리하지만 많은 문제를 야기하기도 합니다.
Java 제작자는 타협에 도달했습니다. 클래스의 다중 상속은 금지했지만 인터페이스의 다중 상속은 허용했습니다. 인터페이스는 여러 상위 인터페이스를 가질 수 있습니다. 클래스는 여러 부모 인터페이스를 가질 수 있지만 부모 클래스는 하나만 가질 수 있습니다.
클래스의 다중 상속을 금지하고 인터페이스의 다중 상속을 허용한 이유는 무엇입니까? 소위 다이아몬드 상속 문제로 인해:
B 클래스가 A 클래스를 물려받을 때 C 클래스와 D 클래스에 대해 아무것도 모릅니다. 따라서 적합하다고 판단되는 A 클래스의 변수를 사용합니다. C 클래스도 마찬가지입니다. A 클래스의 변수를 사용하지만 방식이 다릅니다. 그리고 이 모든 것이 D계급에서 갈등을 낳는다.
다음의 간단한 예를 살펴보겠습니다. 3개의 클래스가 있다고 가정해 보겠습니다.
class Data
{
protected int value;
}
class XCoordinate extends Data
{
public void setX (int x) { value = x;}
public int getX () { return value;}
}
class YCoordinate extends Data
{
public void setY (int y) { value = y;}
public int getY () { return value; }
}
데이터 클래스는 value
변수를 저장합니다. XCoordinate 자손 클래스는 해당 변수를 사용하여 값을 저장 x
하고 YCoordinate
자손 클래스는 이를 사용하여 y
값을 저장합니다.
그리고 그것은 작동합니다. 갈라져. 그러나 XYCoordinates 클래스가 XCoordinate
및 YCoordinate
클래스를 모두 상속하게 하려면 코드가 손상됩니다. 이 클래스는 조상 클래스의 메서드를 가지지만 동일한 value variable
.
그러나 인터페이스는 변수를 가질 수 없기 때문에 이러한 종류의 충돌이 있을 수 없습니다. 따라서 인터페이스의 다중 상속이 허용됩니다.