Java의 인터페이스
소프트웨어 엔지니어링에서는 서로 다른 프로그래머 그룹이 소프트웨어 상호 작용 방식을 명시하는 ‘계약’에 동의하는 것이 중요한 여러 가지 상황이 있습니다. 각 그룹은 다른 그룹의 코드가 어떻게 작성되었는지에 대한 지식 없이도 코드를 작성할 수 있어야 합니다. 일반적으로 인터페이스 는 이러한 계약입니다.
예를 들어, 컴퓨터로 제어되는 로봇 자동차가 인간 운전자 없이 도시 거리를 누비는 미래 사회를 상상해 보세요. 자동차 제조업체는 정지, 출발, 가속, 좌회전 등 자동차를 작동하는 소프트웨어(물론 Java)를 작성합니다. 또 다른 산업군인 전자지도 기기 제조업체는 GPS(위성 위치 확인 시스템) 위치 데이터와 교통 상황 무선 전송을 수신하고 그 정보를 사용하여 자동차를 운전하는 컴퓨터 시스템을 만듭니다.
자동차 제조업체는 자동차를 움직이기 위해 호출할 수 있는 메소드를 자세히 설명하는 업계 표준 인터페이스를 게시해야 합니다(모든 자동차, 모든 제조업체의 자동차). 그러면 가이드 제조업체는 인터페이스에 설명된 방법을 호출하여 자동차에 명령을 내리는 소프트웨어를 작성할 수 있습니다. 두 산업 그룹 모두 다른 그룹의 소프트웨어가 어떻게 구현되는지 알 필요는 없습니다. 실제로 각 그룹은 자사의 소프트웨어를 고도로 독점적인 것으로 간주하며, 공개된 인터페이스를 계속 준수하는 한 언제든지 소프트웨어를 수정할 수 있는 권리를 보유합니다.
Java 프로그래밍 언어에서 인터페이스 는 클래스와 유사한 참조 타입으로, 상수, 메서드 서식, default 메서드, static 메서드 및 중첩된 타입을 만 포함할 수 있습니다. 메서드 본문은 default 메서드와 static 메서드에만 존재합니다. 인터페이스는 인스턴스화할 수 없으며 클래스에 의해서만 구현되거나 다른 인터페이스로 확장될 수 있습니다. 확장은 이 섹션의 뒷부분에서 설명합니다.
인터페이스를 정의하는 것은 새 클래스를 만드는 것과 비슷합니다:
public interface OperateCar {
// constant declarations, if any
// method signatures
// An enum with values RIGHT, LEFT
int turn(Direction direction,
double radius,
double startSpeed,
double endSpeed);
int changeLanes(Direction direction,
double startSpeed,
double endSpeed);
int signalTurn(Direction direction,
boolean signalOn);
int getRadarFront(double distanceToCar,
double speedOfCar);
int getRadarRear(double distanceToCar,
double speedOfCar);
......
// more method signatures
}메서드 서식에는 중괄호가 없고 세미콜론으로 끝나는 점에 유의하세요.
인터페이스를 사용하려면 인터페이스를 구현하는 클래스를 작성합니다. 인스턴스화 가능한 클래스가 인터페이스를 구현하면 인터페이스에 선언된 각 메서드에 대한 메서드 바디를 제공합니다. 예를 들어
public class OperateBMW760i implements OperateCar {
// the OperateCar method signatures, with implementation --
// for example:
public int signalTurn(Direction direction, boolean signalOn) {
// code to turn BMW's LEFT turn indicator lights on
// code to turn BMW's LEFT turn indicator lights off
// code to turn BMW's RIGHT turn indicator lights on
// code to turn BMW's RIGHT turn indicator lights off
}
// other members, as needed -- for example, helper classes not
// visible to clients of the interface
}위의 로봇 자동차 예시에서 인터페이스를 구현하는 것은 자동차 제조업체입니다. 물론 쉐보레의 구현 방식은 도요타의 구현 방식과 크게 다르겠지만, 두 제조업체 모두 동일한 인터페이스를 고수할 것입니다. 인터페이스의 클라이언트인 안내 제조업체는 자동차의 위치에 대한 GPS 데이터, 디지털 거리 지도, 교통 데이터를 사용하여 자동차를 운전하는 시스템을 구축할 것입니다. 이 과정에서 안내 시스템은 회전, 차선 변경, 브레이크, 가속 등의 인터페이스 메소드를 호출합니다.
API로서의 인터페이스
로봇 자동차의 예는 업계 표준 애플리케이션 프로그래밍 인터페이스(API)로 사용되는 인터페이스를 보여줍니다. API는 상용 소프트웨어 제품에서도 흔히 볼 수 있습니다. 일반적으로 한 회사는 다른 회사가 자사 소프트웨어 제품에서 사용하고자 하는 복잡한 메서드가 포함된 소프트웨어 패키지를 판매합니다. 예를 들어 최종 사용자 그래픽 프로그램을 만드는 회사에 판매되는 디지털 이미지 처리 방법 패키지를 들 수 있습니다:
- 이미지 처리 회사는 인터페이스를 구현하기 위해 클래스를 작성하고 이를 고객에게 공개합니다.
- 그런 다음 그래픽 회사는 인터페이스에 정의된 서식과 반환 타입을 사용하여 이미지 처리 메서드를 호출합니다.
이미지 처리 회사의 API는 (고객에게) 공개되지만, API 구현은 철저히 비밀로 유지되며, 고객이 의존해 온 원래 인터페이스를 계속 구현하는 한 나중에 구현을 수정할 수 있습니다. 인터페이스는 다용도 참조 타입으로, 구현 클래스를 손상시키지 않고도 default 메서드를 정의하고 주어진 타입에 기능을 추가할 수 있습니다. 또한, 때로는 private 메서드에서 공통된 코드 부분을 제거하여 default 메서드에서 코드 중복을 줄일 수 있습니다. 인터페이스 내부의 메서드 정의에 대해 자세히 알아보려면 이 시리즈의 다음 튜토리얼을 확인하세요.
인터페이스 정의하기
인터페이스 선언은 수정자, 키워드 interface, 인터페이스 이름, 쉼표로 구분된 상위 인터페이스 목록(있는 경우), 인터페이스 본문으로 구성됩니다. 예를 들어
public interface GroupedInterface extends Interface1, Interface2, Interface3 {
// constant declarations
// base of natural logarithms
double E = 2.718282;
// method signatures
void doSomething (int i, double x);
int doSomethingElse(String s);
}public 액세스 지정자는 모든 패키지의 모든 클래스에서 인터페이스를 사용할 수 있음을 나타냅니다. 인터페이스가 공용이라고 지정하지 않으면 인터페이스와 동일한 패키지에 정의된 클래스만 인터페이스에 액세스할 수 있습니다.
인터페이스는 클래스의 서브클래스처럼 다른 인터페이스를 확장하거나 다른 클래스를 확장할 수 있습니다. 그러나 클래스는 다른 클래스를 하나만 확장할 수 있는 반면, 인터페이스는 인터페이스를 얼마든지 확장할 수 있습니다. 인터페이스 선언에는 확장하는 모든 인터페이스의 쉼표로 구분된 목록이 포함됩니다.
인터페이스 본문에는 추상 메서드, default 메서드 및 static 메서드가 포함될 수 있습니다.
인터페이스 내의 추상 메서드 뒤에는 세미콜론이 오지만 중괄호는 없습니다(추상 메서드에는 구현이 포함되지 않음).
default 메서드는 default 수정자를 사용하여 정의하고 static 메서드는 static 키워드를 사용하여 정의합니다. 인터페이스의 모든 추상, default 및 static 메서드는 암시적으로 공용이므로 public 수정자를 생략할 수 있습니다.
또한 인터페이스에는 상수 선언이 포함될 수 있습니다. 인터페이스에 정의된 모든 상수 값은 암시적으로 public, static, final입니다. 다시 한 번, 이러한 수정자는 생략할 수 있습니다.