Web/Java
인터페이스 (Interface)
돌건
2021. 3. 30. 15:56
인터페이스
- 객체의 사용 방법을 정의한 타입이다.
인터페이스 선언
[ public ] interface 인터페이스명 { ... }
- 상수와 메소드만을 필드 값으로 가질 수 있다.
- 객체로 생성할 수 없으므로 생성자를 가질 수 없다.
- 자바 8부터는 default 메소드와 static 메소드 선언이 가능하다.
- 각각의 특성들은 생략하더라도 컴파일 과정에서 자동으로 붙게 된다.
inteface Sample {
// 상수
// 추상 메소드
// default 메소드
// static 메소드
}
상수 필드 (Constant Field)
- 인터페이스는 런타임 시 데이터를 저장할 수 있는 필드를 선언할 수 없다.
- 상수를 선언할 때에는 반드시 초기값을 정의해줘야 한다.
- public static final 타입으로 선언한다.
- 인터페이스에 선언된 필드는 모두 public static final의 특성을 갖는다.
추상 메소드 (Abstract Method)
- 메소드의 매개값과 리턴 타입에 대한 정보만을 제공하는 메소드이다.
- 구현 객체를 통해 실제 실행부가 정해진다.
- 인터페이스에서 선언된 추상 메소드는 public abstract의 특성을 갖는다.
디폴트 메소드 (Default Method)
- 인터페이스에 선언되지만, 구현 객체가 가지고 있는 인스턴스 메소드라고 봐야 한다.
- 인스턴스 메소드이므로 사용하기 위해서는 구현 객체가 있어야 한다.
- 추상 메소드와는 다르게 실행 내용까지 정의한다.
- 모든 구현 객체가 지니는 기본 메소드이지만, 필요에 따라 Override가 가능하다.
- public 특성을 지닌다.
정적 메소드 (Static Method)
- 구현 객체가 없더라도 인터페이스만을 가지고 호출 가능한 메소드이다.
- 클래스의 정적 메소드와 형태가 동일하다.
- public 특성을 지닌다.
인터페이스 구현
public class 구현클래스명 implements 인터페이스명 {
// 인터페이스에 선언된 추상 메소드 구현
}
- 인터페이스의 모든 메소드는 public 접근 제한자를 지니기 때문에 추상 메소드에 대한 실체 메소드를 정의할 때 public 보다 낮은 접근 제한으로 작성할 수 없다. (상속의 특징)
- 인터페이스에 선언된 추상 메소드에 대응하는 실체 메소드를 구현하지 않으면 해당 클래스는 자동으로 추상 클래스가 된다. 이 경우, 클래스 선언부에서 abstract 키워드를 추가해야 한다.
인터페이스 사용
- 인터페이스 변수는 참조 타입이므로 구현 객체가 대입될 경우 구현 객체의 주소 값을 저장한다.
- 클래스의 필드, 생성자, 메소드의 매개 변수, 로컬 변수로 선언 가능하다.
인터페이스 타입 변환과 다형성
- 다형성은 하나의 타입에 대입되는 객체에 따라서 실행 결과가 다양한 형태로 나오는 성질을 말한다.
- 인터페이스는 사용 방법이 동일한 클래스를 만드는 기술이다.
- 인터페이스를 사용해 메소드를 호출하는 경우, 구현 객체를 교체하는 것이 쉽다.
- 구현 객체가 인터페이스 타입으로 자동 변환하면 인터페이스에 선언된 메소드만 사용할 수 있다. 따라서, 구현 객체에 선언된 필드값이나 메소드를 사용하기 위해서는 구현 클래스 타입으로 강제 형 변환을 해주어야 한다.
- 강제 형변환은 구현 객체가 인터페이스 타입으로 변환되어 있는 상태에서 가능하다. 그러나 어떤 구현 객체가 변환되어 있는지 알 수 없는 상태에서 무작정 형변환을 하게 되면 ClassCastException이 발생할 수 있다. 이를 방지하고자 instanceof 연산자를 사용해 변환할 수 있는지에 대한 여부를 확인하도록 한다.
if( animal intanceof Dog ) {
Dog dog = (Dog) animal;
}
인터페이스 상속
- 인터페이스는 클래스와 다르게 다중 상속을 허용한다.
public interface 하위 인터페이스 extends 상위 인터페이스1, 상위 인터페이스2 { ... }
- 하위 인터페이스를 구현하는 클래스는 하위 인터페이스의 메소드뿐 아니라 상위 인터페이스들의 모든 추상 메소드를 구현해야 한다.
- 하위 인터페이스로 형 변환이 되면 상,하위 인터페이스에 선언된 모든 메소드를 사용할 수 있다.
- 상위 인터페이스로 형 변환이 되면, 상위 인터페이스에 선언된 메소드만 사용 가능하다.
디폴트 메소드와 인터페이스 확장
- 디폴트 메소드를 추가할 수 있게 된 덕분에, 이전에 개발한 구현 클래스를 그대로 사용할 수 있으면서 새롭게 개발하는 클래스는 디폴트 메소드를 활용할 수 있게 되었다.
- 인터페이스에 추상 메소드를 추가했지만 구현 객체를 수정할 수 없는 경우. 즉, 구현 객체에서 인터페이스의 추상 메소드에 대한 실체 메소드를 구현할 수 없는 경우에는 인터페이스의 디폴트 메소드를 활용하면 문제가 발생하지 않는다. 디폴트 메소드는 구현 객체에서 실행 내용을 작성할 필요가 없기 때문이다.
- 디폴트 메소드를 활용하는 방법은 3가지가 있다.
1. 디폴트 메소드를 상속만 받는다.
2. 디폴트 메소드를 Override한다.
3. 디폴트 메소드를 Abstract Method로 재선언한다.
3번 ex)
public interface Child extends Parent {
@Override
public void method(); // Parent 인터페이스에 선언된 추상 메소드
}
참고 서적 : 이것이 자바다 신용권의 Java 프로그래밍 정복 (한빛미디어)