[Java 자바] 8. 인터페이스 ① 선언과 구현
8-1. 인터페이스의 역할
인터페이스: 객체의 사용 방법을 정의한 타입
- 클래스는 다중 상속이 불가능하지만, 인터페이스는 다중 상속이 가능함
- 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스
- 오로지 추상메소드와 상수만 포함 가능
8-2. 인터페이스 선언
8-2-1. 인터페이스 선언
[접근제한자] interface 인터페이스명 {
// 상수, 선언되는 변수는 모두 상수로 적용되기 때문에 public static final과 같게 취급
데이터타입 상수명 = 값;
(public static final)데이터타입 상수명 = 값;
// 메소드, 선언되는 메소드는 모두 추상 메소드로 적용되기 때문에 public abstract와 같게 취급
반환값 메소드명() {...}
public abstract 반환값 메소드명() {...}
// 디폴트 메소드
default 데이터타입 메소드명() {...}
// 정적 메소드
static 데이터타입 메소드명() {...}
8-2-2. 상수 필드 (Constant Field)
- 인터페이스에 고정된 값으로 런타임 시 데이터를 바꿀 수 없으며, 선언 시 반드시 초기값을 대입해야 함
(인터페이스는 객체 사용 설명서이므로 런타임 시 데이터를 저장할 수 있는 일반 필드는 선언이 불가)
- 인터페이스에 선언된 필드는 모두 public static final의 특성을 가지며, 생략하더라도 컴파일 과정에서 자동으로 붙음
- 상수명은 대문자로 작성하되, 단어 구분은 언더바(_)로 연결
public interface Test {
public int MAX_VALUE = 10;
}
8-2-3. 추상 메소드 (Abstract Method)
- 객체가 가지고 있는 메소드를 설명한 것으로 호출할 때 어떤 매개값이 필요하고 리턴 타입이 무엇인지만 알려줌
- 실제 실행부는 구현 객체에서 작성 필요
- 인터페이스에 선언된 추상 메소드는 모두 public abstract의 특성을 갖기 때문에 생략하더라도 컴파일 과정에서 자동으로 붙음
8-2-4. 디폴트 메소드 (Default Method)
- 인터페이스에 default 키워드로 메소드를 선언하면 메소드를 구현할 수 있음(선언부부터 구현부까지)
- public 특성을 갖기 때문에 생략하더라도 컴파일 과정에서 자동으로 붙음
- 해당 내용은 상속 받은 객체에서 따로 오버라이딩하지 않아도 사용이 가능하며, 오버라이딩해서 사용할 수도 있음
8-2-5. 정적 메소드 (Static Method)
- 객체를 생성하지 않아도 인터페이스명.메소드명 으로 접근 가능
- public 특성을 갖기 때문에 이를 생략하더라도 컴파일 과정에서 자동으로 붙음
//Calculator.java
public interface Calculator {
static int add(int x, int y) {
return x + y;
}
}
//CalcTest.java
public class CalcTest {
public static main(String[] args) {
System.out.println(Calculator.add(20,30));
}
}
8-3. 인터페이스 구현
8-3-1. 구현 클래스
- implements 키워드 사용
- 구현클래스는 인터페이스가 가지고 있는 추상 메소드에 대한 실체 메소드를 가지고 있어야 함
- 인터페이스의 모든 메소드는 기본적으로 public 접근 제한을 갖기 때문에 public보다 낮은 접근 제한으로 구현 작성 불가
- 인터페이스에 선언된 추상 메소드에 대응하는 실체 메소드를 구현하지 않으면 구현클래스는 자동적으로 추상클래스가 됨
[접근제한자] class 구현클래스명 implements 인터페이스명 {
@Override
// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}
- 인터페이스로 구현 객체를 사용하려면 인터페이스 변수를 선언하고 구현 객체를 대입해야 함
- 인터페이스 변수는 참조 타입이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지를 저장
//RemoteControl.java
public interface RemoteControl {
public int MAX_VOLUME = 10;
public void trunOn();
}
//Television.java
public class Television implements RemoteControl {
@Override
public void turnOn() {
System.out.println("TV를 켭니다.");
}
}
//RemoteControlTest.java
public class RemoteControlTest {
public static void main(String[] args) {
Remotecontrol rc;
rc = new Television();
}
}
8-3-2. 익명 구현 객체
- 일회성으로만 사용할 구현 객체를 만들 수 있는 방법
- 컴파일하면 클래스명$1.class 형태로 클래스 파일이 만들어짐(생성 번호는 1부터 시작)
public class RemoteControlTest {
public static void main(String[] args) {
RemoteControl rc = new RemoteControl() {
public void turnOn() { */실행문/* }
};
}
}
8-3-3. 다중 인터페이스 구현 클래스
- 다중 인터페이스를 구현할 경우, 구현 클래스는 모든 인터페이스의 추상 메소드에 대해 실체 메소드를 작성해야 함
public class 구현클래스명 implements interfaceA, interfaceB {
//interfaceA에 선언된 추상 메소드의 실체 메소드 선언
//interfaceB에 선언된 추상 메소드의 실체 메소드 선언
}