인터페이스 (자바)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
인터페이스는 자바에서 클래스가 구현할 수 있는 추상적인 형태를 정의하는 데 사용된다. 인터페이스는 상수, 추상 메서드, 정적 메서드 선언을 포함하며, 모든 메서드는 암시적으로 public이다. 클래스는 `implements` 키워드를 사용하여 하나 이상의 인터페이스를 구현할 수 있으며, 인터페이스를 구현하는 클래스는 인터페이스에 정의된 모든 메서드를 구현해야 한다. 인터페이스는 다른 인터페이스를 확장할 수 있으며, 다중 상속을 허용한다. 인터페이스는 다형성 구현, 코드 재사용성 향상, 콜백 구현 등 다양한 목적으로 활용되며, `Comparable`, `Serializable`과 같은 표준 인터페이스가 제공된다.
더 읽어볼만한 페이지
- 인터페이스 - 동일성
동일성은 철학에서 자기 자신과 일치하고 자기 동일적으로 존재하며 다른 것에 의존하지 않는 개념으로, 고대부터 현대까지 다양한 철학자와 여러 분야에서 논의되고 활용되어 왔다. - 인터페이스 - Qi
Qi는 무선 전력 컨소시엄에서 개발한 무선 전력 전송 표준으로, 자기 유도 방식을 사용하여 스마트폰, 태블릿 등의 기기를 무선 충전하며, 최근에는 정렬 기능이 강화된 Qi2 표준이 발표되어 다양한 기기와 공공장소에서 활용이 증가하고 있다. - 자바 (프로그래밍 언어) - 자바 애플릿
자바 애플릿은 웹 페이지에서 실행되는 자바 기반 프로그램으로, 웹 상호작용성을 높였으나 기술적 문제와 웹 표준 기술 발전에 따라 쇠퇴하여 사용이 중단되었다. - 자바 (프로그래밍 언어) - 자바FX
JavaFX는 자바 기반의 UI 구축 플랫폼으로, 다양한 플랫폼을 지원하며 풍부한 UI 기능들을 제공하고, Java 8부터 JDK에 포함되었다가 JDK 11부터 분리되어 관리된다.
인터페이스 (자바) |
---|
2. 인터페이스 정의
인터페이스는 추상 메서드, 상수, 정적 메서드 등을 포함할 수 있으며, 자바에서는 `interface` 키워드를 사용하여 정의한다.
인터페이스는 다양한 유형의 클래스가 공유하지만 반드시 클래스 관계를 구성하지 않는 유사성을 나타내는 데 사용된다. 예를 들어, 사람과 앵무새는 모두 휘파람을 불 수 있지만, `Human`과 `Parrot`을 `Whistler` 클래스의 하위 클래스로 나타내는 것은 적절하지 않다. 대신 이들은 `Animal` 클래스(또는 중간 클래스)의 하위 클래스이면서 동시에 `Whistler` 인터페이스를 구현할 수 있다.
또한, 인터페이스를 사용하면 클래스 유형을 알지 못해도 특정 인터페이스를 구현한다는 사실만으로 객체를 사용할 수 있다. 예를 들어, 휘파람 소리에 짜증이 났을 때, 누가 휘파람을 부는지 (사람인지 앵무새인지)는 중요하지 않다. 중요한 것은 `Whistler` 인터페이스를 구현한 객체의 `whistle` 메서드를 호출하여 휘파람 소리를 낼 수 있다는 점이다. 더 실용적인 예로, 정렬 알고리즘은 특정 유형을 알지 못해도 객체를 정렬할 수 있도록 유형의 객체를 예상할 수 있다.
인터페이스는 다음과 같은 특징을 가진다.
- 메서드 헤더와 public 상수만 선언한다.
- 인스턴스화할 수 없다.
- 클래스에서 구현할 수 있다.
- 클래스를 확장할 수 없다.
- 여러 다른 인터페이스를 확장할 수 있다.
2. 1. 인터페이스 선언 문법
인터페이스는 다음과 같은 형식으로 선언된다.[2]```
[''visibility''] interface '''''InterfaceName''''' [extends ''other interfaces''] {
''constant declarations''
''abstract method declarations''
'' static method declarations''
}
```
- `visibility`: 접근 제한자를 나타낸다. (public, protected, private)
- `InterfaceName`: 인터페이스의 이름을 나타낸다.
- `extends`: 다른 인터페이스를 상속할 때 사용한다.
예시: `public interface Interface1 extends Interface2;`
인터페이스의 본문에는 추상 메서드가 포함되어 있지만, 인터페이스의 모든 메서드는 정의상 추상적이므로 `abstract` 키워드는 필요하지 않다.[2] 인터페이스는 노출되는 동작 집합을 지정하므로 모든 메서드는 암시적으로 `public`이다.[2]
따라서 간단한 인터페이스는 다음과 같다.[2]
```java
public interface Predator {
boolean chasePrey(Prey p);
void eatPrey(Prey p);
}
```
인터페이스의 멤버 유형 선언은 암시적으로 static, final 및 public이지만, 그렇지 않은 경우 모든 유형의 클래스 또는 인터페이스가 될 수 있다.[2]
2. 2. 인터페이스 예시
간단한 인터페이스 예시는 다음과 같다.```java
public interface Predator {
boolean chasePrey(Prey p);
void eatPrey(Prey p);
}
```
위 인터페이스는 `Predator`라는 이름으로, `chasePrey`와 `eatPrey`라는 두 개의 추상 메서드를 포함한다.[2]
3. 인터페이스 구현
클래스는 `implements` 키워드를 사용하여 인터페이스를 구현한다. 인터페이스에 정의된 모든 추상 메서드는 구현 클래스에서 반드시 구현되어야 한다.
클래스가 인터페이스를 구현하지만 모든 메서드를 구현하지 않는 경우, `abstract`로 표시해야 한다. 클래스가 추상 클래스인 경우, 해당 서브클래스 중 하나가 구현되지 않은 메서드를 구현해야 한다. 그러나 추상 클래스의 서브클래스 중 일부가 모든 인터페이스 메서드를 구현하지 않는 경우, 서브클래스 자체를 다시 `abstract`로 표시해야 한다.
인터페이스는 공통 클래스 메서드를 공유할 수 있다.
```Java
class Animal implements LikesFood, LikesWater {
boolean likes() { return true; }
}
```
그러나 주어진 클래스는 동일하거나 유사한 인터페이스를 여러 번 구현할 수 없다.
```Java
class Animal implements Shares
// 오류: 인터페이스 중복
```
자바는 클래스의 다중 상속을 허용하지 않으며, 메서드(프로시저)를 인수로 전달하는 것도 허용하지 않는다. 따라서 메서드를 대상 메서드의 매개변수로 전달하기 위해, 현재 관행은 각 호출 클래스를 수용하기 위해 대상 메서드의 여러 변형을 정의하는 대신, 매개변수 메서드의 시그니처와 주소를 제공하는 수단으로 인터페이스에 대한 참조를 정의하고 전달하는 것이다.[3]
3. 1. 인터페이스 구현 방법
클래스에서 인터페이스를 구현하는 방법은 다음과 같다.
```java
... implements ''인터페이스이름''[, ''다른 인터페이스'', ''또 다른'', ...] ...
```
클래스는 인터페이스를 구현할 수 있다. 예를 들면 다음과 같다.
```java
public class Lion implements Predator {
@Override
public boolean chasePrey(Prey p) {
// 먹이 p를 쫓는 프로그래밍 (특히 사자를 위해)
}
@Override
public void eatPrey(Prey p) {
// 먹이 p를 먹는 프로그래밍 (특히 사자를 위해)
}
}
```
클래스가 인터페이스를 구현하면서 메소드를 모두 구현하지 않는다면, `abstract`로 표시되어야 한다. 클래스가 추상적이라면 서브클래스들 중 하나가 미구현 메소드를 구현할 것이라 예측한다. 추상 클래스의 서브클래스들 중 어느 것도 인터페이스 메소드를 모두 구현하지 않더라도 서브클래스 자체는 `abstract`로 다시 표시되어야 한다.
클래스들은 여러 인터페이스들을 구현할 수 있다.
```java
public class Frog implements Predator, Prey { ... }
```
인터페이스들은 일반적으로 콜백을 목적으로 자바 언어에서 사용된다.[5]
3. 2. 구현 예시
java
public class Lion implements Predator {
@Override
public boolean chasePrey(Prey p) {
// 먹이 p를 쫓는 프로그래밍 (특히 사자를 위해)
}
@Override
public void eatPrey(Prey p) {
// 먹이 p를 먹는 프로그래밍 (특히 사자를 위해)
}
}
```
`Lion` 클래스는 `Predator` 인터페이스를 구현한다.[5] `Lion` 클래스는 `Predator` 인터페이스에 정의된 `chasePrey`와 `eatPrey` 메서드를 구현해야 한다. 위 코드는 `Lion` 클래스가 `Predator` 인터페이스의 메서드들을 어떻게 구현하는지 보여주는 예시다.
3. 3. 다중 인터페이스 구현
클래스는 여러 개의 인터페이스를 동시에 구현할 수 있다.[5]
예시:
```java
public class Frog implements Predator, Prey { ... }
```
인터페이스는 자바 언어에서 콜백을 목적으로 주로 사용된다.[3]
4. 서브인터페이스
인터페이스는 다른 인터페이스를 상속(`extends`)하여 확장할 수 있다. 이를 통해 인터페이스 간의 계층 구조를 형성할 수 있으며, 클래스와 달리 다중 상속을 허용한다.
4. 1. 서브인터페이스 정의
인터페이스는 여러 다른 인터페이스를 확장할 수 있다. 다음은 그 예시이다.```java
public interface VenomousPredator extends Predator, Venomous {
// Interface body
}
```
위 코드는 유효하며, `VenomousPredator`라는 하위 인터페이스를 정의한다. 이는 클래스와 달리 다중 상속을 허용한다. `Predator`와 `Venomous` 인터페이스가 동일한 시그니처(예: `kill(Prey p)`)를 가진 메서드를 정의하거나 상속하더라도, `VenomousPredator`를 구현하는 클래스는 두 메서드를 모두 구현해야 한다.
5. 인터페이스 활용
인터페이스는 클래스들이 공통적으로 가지는 특성을 정의하지만, 클래스 간의 상속 관계를 반드시 의미하지는 않는다. 예를 들어, 사람과 앵무새는 모두 휘파람을 불 수 있다. 하지만, `Human`과 `Parrot` 클래스를 `Whistler`라는 클래스의 하위 클래스로 만드는 것은 적절하지 않다. 대신 이들은 `Animal` 클래스의 하위 클래스로 구성하고, 동시에 `Whistler` 인터페이스를 구현하도록 할 수 있다.
인터페이스를 활용하면, 특정 클래스의 유형을 알지 못하더라도, 해당 객체가 특정 인터페이스를 구현한다는 사실만으로 객체를 사용할 수 있다. 예를 들어, `whistler.whistle()`를 호출하면, `Whistler` 인터페이스를 구현하는 객체의 `whistle` 메서드가 실행된다. 정렬 알고리즘에서 특정 유형을 알지 못해도 해당 유형의 객체를 정렬할 수 있는 것도 이와 유사한 예시이다.
(하위 섹션에서 콜백 구현과 표준 인터페이스 예시에 대한 내용을 자세히 다루고 있으므로, 이 섹션에서는 간략하게 언급만 하고 넘어간다.)
5. 1. 콜백 (Callback) 구현
인터페이스는 메서드를 매개변수로 전달하는 것이 제한적인 자바 환경에서 콜백을 구현하는 데 사용된다.[5] 자바는 메서드(프로시저)를 인수로 전달하는 것을 허용하지 않기 때문에,[5] 인터페이스를 활용하여 콜백을 구현한다.예를 들어, 사람과 앵무새는 모두 휘파람을 불 수 있지만, `Human`과 `Parrot`을 `Whistler` 클래스의 하위 클래스로 나타내는 것은 적절하지 않다. 대신, 이들은 `Animal` 클래스의 하위 클래스이면서 동시에 `Whistler` 인터페이스를 구현하는 방식으로 표현할 수 있다.
인터페이스를 사용하면 클래스 유형을 알지 못해도 특정 인터페이스를 구현한다는 사실만으로 객체를 사용할 수 있다. 예를 들어, `whistler.whistle()`를 호출하면 `Whistler` 인터페이스를 구현하는 객체의 `whistle` 메서드가 호출된다. 정렬 알고리즘에서 유형의 객체를 사용하는 것도 비슷한 예시인데, 이 경우 특정 유형을 알지 못하더라도 해당 유형의 객체를 정렬할 수 있다.
5. 2. 표준 인터페이스 예시
참조
[1]
웹사이트
Default Methods
https://web.archive.[...]
2014-06-30
[2]
웹사이트
The Java Language Specification
http://java.sun.com/[...]
[3]
웹사이트
Java Tip 10: Implement callback routines in Java
https://www.infoworl[...]
1996-06-01
[4]
웹인용
Default Methods
https://web.archive.[...]
2017-04-27
[5]
웹인용
Java World
https://web.archive.[...]
2017-03-28
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com