인터페이스
인터페이스는 추상클래스보다 더 추상화된, 일종의 추상클래스이다.
추상클래스는 추상메소드를 포함하지만, 일반 메소드나 멤버변수도 가질 수 있다.
하지만 인터페이스는 추상메소드와 상수만을 멤버로 가질 수 있다.
그렇기 때문에 추상메소드는 public abstract, 멤버 변수는 public static final 이어야한다.
하지만 이는 모든 인터페이스의 모든 멤버에 적용되는 것이므로, 생략해도 무방하다.
*그런데 JDK1.8부터 인터페이스에 static 메소드와 default 메소드의 추가를 허용하도록 변경되었다.
interface 인터페이스명 {
타입 상수명 = 값; // public static final 타입 상수명 = 값;
반환타입 메소드명(); // public abstract 반환타입 메소드명();
}
한 인터페이스는 인터페이스로부터만 상속받을 수 있다. 즉 클래스를 상속받을 수 없다는 뜻이다.
클래스와 같이 조상 인터페이스, 자손 인터페이스라 부르며 자손 인터페이스는 조상 인터페이스에
정의된 멤버를 모두 상속받는다. 또한 여러 개의 인터페이스로 부터 상속받는 다중상속이 가능하다.
인터페이스도 추상클래스처럼 자체 인스턴스를 생성할 수 없다. 따라서 인터페이스를 클래스에
상속해줌으로써 사용한다. 이때 extends가 아닌 implements를 쓴다.
class 클래스명 implements 인터페이스명 {
// 인터페이스에 있는 추상 메소드 구현
}
추상 메소드는 클래스에서 오버라이딩으로 구현되기 때문에, 접근 제어자는 조상의 메소드보다
좁은 범위로 변경할 수 없다는 규칙을 지켜야한다. 인터페이스의 메소드는 모두 public abstract이므로,
오버라이딩한 메소드의 접근 제어자는 반드시 public 이어야 한다.
(public -> protected -> default -> private)
또한 클래스는 인터페이스를 구현함과 동시에 클래스를 상속받을 수 있다.
class 클래스명 extends 조상클래스명 implements 인터페이스명{
//...//
}
인터페이스도 마찬가지로 인터페이스 타입 참조변수를 선언할 수 있다. 또한 인터페이스 타입의 참조변수로
자신을 구현한 클래스의 인스턴스를 참조할 수 있다. (다형성)
// Writable 이 인터페이스고 Writer가 이를 구현한 클래스라고 가정
Writable w = new Writer();
메소드의 매개변수에도 인터페이스 타입의 참조변수가 올 수 있는데,
이는 해당 인터페이스를 구현한 클래스의 인스턴스를 인수로 전달해야한다는 뜻이다.
void draw(Writable w){
...
}
/* 이와 같은 매개변수가 인터페이스 타입인 메소드가 있다고하면
이를 호출할 때는 Writable을 구현한 클래스의 인스턴스를 전달해야함*/
class Poet implements Writable{
...
}
draw(new Poet());
메소드의 리턴타입에도 인터페이스 타입을 지정할 수 있다.
이는 해당 인터페이스를 구현한 클래스의 인스턴스를 반환해야한다는 것을 뜻한다.
Writable method(){ // 반환타입이 인터페이스(Writable)
...
return new Poet(); //인터페이스를 구현한 클래스의 인스턴스 반환
}
'JAVA' 카테고리의 다른 글
자바의 컴파일: 바이트코드와 JVM (0) | 2024.07.18 |
---|---|
컬렉션 프레임워크 (0) | 2024.06.21 |
추상메소드와 추상클래스 (0) | 2022.10.03 |
애너테이션(2) - 메타 애너테이션 (0) | 2022.10.03 |
지네릭스(1) (2) | 2022.09.02 |
다형성 - 참조변수 형변환 (0) | 2022.08.15 |