인터페이스
참고 사이트
배운 점
인터페이스 (interface)
interface 인터페이스 명 { ... }
- 추상 메서드의 집합 따라서 구현부{ }가 없어야 한다.
- 인터페이스는 인터페이스만 조상으로 가질 수 있다.
(추상화 클래스는 추상화 클래스, 인터페이스를 조상으로 가질 수 있음)
이 특성은 자바의 다중상속을 가능하게 한다.
여러 인터페이스를 implements 키워드를 통해 상속받을 경우 메서드의 이름이 겹쳐도
선언부만 있기때문에 충돌ㄴㄴ
자바에서 단일상속(extends)을 하는 이유가 여러 클래스에서 상속 받을 시
메서드의 선언부는 같은데 구현부가 다르면 충돌이 나는 것을 방지하기 위해서 (== 어느 메서드를 선택해?)
- 추상화 클래스와 마찬가지로 미완성의 성질을 띔. 따라서 상속을 통해 클래스에서 구현해야한다.
class 클래스명 implements 인터페이스명 { ... }
- 모든 멤버의 접근제한자는 public
- 인터페이스 타입의 참조변수는 그 인터페이스를 구현한 인스턴스만 가리킬 수 있다.
- 메서드의 리턴 타입으로 인터페이스 사용 가능 > 그 인스턴스를 구현한 클래스의 인스턴스를 반환함.
인터페이스 재료
생략 가능
1. 추상메서드
public abstract 반환형 메서드명();
2. 상수
public static final 자료형 상수명;
3. static 메서드, defualt메서드
인터페이스에 새로운 메서드를 추가하기 어려움 (그 인터페이스를 상속하는 모든클래스에서 다 추가된 메서드를 구현해야 하는 어려움존재) 따라서 디폴트 메서드 추가 default, static키워드 생략 불가능!!
private메서드도 디폴트 메서드에서 호출하는 식으로 사용가능하다고 함. (시도 안해봄)
* 3-1 여러 인터페이스에서 디폴트 메서드 이름 충돌 시 > 인터페이스를 구현한 클래스에서 오버라이딩
3-2 디폴트 메서드와 조상클래스의 메서드간 충돌 시 > 조상 클래스의 메서드가 상속되고 디폴트 메서드는 무시됨.
장점
1. 두 대상(객체)간 중간 역할을 담당하는 껍데기이다.
선언부(껍데기)와 구현부(알맹이)를 분리시켜 객체 수정을 용이하게 도와줌 코드의 유연성 up
class A{
public void method(I b) { //인터페이스 I를 구현한 클래스만 들어가라! 매개변수 (B b), (C b)
b.method();
}
}
interface I{
public abstract void method();
}
//인터페이스로 클래스를 감싼다
class B implements I{
public void method() {
System.out.println("B클래스의 메서드");
}
}
class C implements I{
public void method() {
System.out.println("c클래스의 메서드");
}
}
public class InterfaceTest {
public static void main(String[] args) {
A a=new A();
a.method(new B()); //a가 b에 의존(사용)하고 있다.
a.method(new C());
}
}
2. 서로 관계없는 클래스들을 관계 맺어줄수 있음.
상속 계층도에서 공통점이 없는 일부 클래스에 기능(세부적인 기능은 각 클래스마다 다름)을 부여
해야 할 때 굳이 오버로딩하지 않고 인터페이스의 상속을 통해 관계를 맺어줄 수 있음)
* 중첩 인터페이스
인터페이스가 클래스의 멤버로 정의 > 특정 클래스에서 사용하는 인터페이스를 만들고 싶을 때 사용
인스턴스 멤버, static 멤버 둘다 가능