인터페이스(interface)
- 추상메서드의 집합, 구현부가 없는 설계도, 모든 멤버는 public 이여야 함
* 추상클래스 VS 인터페이스
추상클래스 : 일반클래스(iv, 생성자 가능)에 추상메서드 존재 (미완성설계도)
ex) 의자 만들 때 의자 설계도, 의자 재료, 의자 색상은 정했으나 다리나, 등받이 등 각 객체의 자세한 디자인을 하지 않음
인터페이스 : 추상메서드만 있으며 구현된 것이 없음(iv,생성자 없음)(기본설계도)
ex) 의자 만들 때 의자 설계도만 있음
- 선언방법
interface 인터페이스 이름 {
public static final 타입 상수이름 = 값; <- 상수 / 변수 xxx
public abstract 메서드이름(매개변수목록); } <- 추상메서드
* 모든 인터페이스의 멤버의 메소드는 public 이고, abstract 라 생략가능 * 모든 인터페이스 멤버 public, 메서드는 {}없는 추상메서드
* 모든 인터페이스이 멤버인 상수는 public static final 이기 때문에 생략가능 (일부생략도가능)
- 인터페이스의 상속
① 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상아님)
② 다중상속가능(조상이 여러개) : 인터페이스는 추성메서드의 집합으로 구현부가 없기 때문에 충돌해도 에러 없다.
- 인터페이스 구현
인터페이스에 정의된 추성 메서드 완성하기(이러한 완성작업 하는 일을 '구현'이라고 함) (추상메서드 {} 만듦)
class 클래스 이름 implements 인터페이스이름 { } |
- 인터페이스를 이용한 다형성
① 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능
class interfaceChild implement interfaceparent {
public void go() {
System.out.println("간다~");
}
public void stop(interfaceparent p) {
System.out.println("멈춘다~");
}
}
interface interfaceparent {
void go();
void stop(interfaceparent p);
// void stop(interfaceparent p)의 매개변수로 인터페이스가 있다. 이는 인터페이스를 구현한 클래스의 객체만 가능하다는 것이다.
② 인터페이스를 메서드의 리턴타입으로 지정 가능
interpaceparent method() {.
interfaceChild c = new interfaceChild();
return c; // ====> = return new interfaceChild();
}
class interfaceChild implement interfaceparent {
public void go() {
System.out.println("간다~");
}
public void stop(interfaceparent p) {
System.out.println("멈춘다~");
}
}
-> 메서드를 호출할 때는 인터페이스 타입의 구현객체로 호출해야함 ex) interfaceparent c = method(); -> 메서드의 반환타입이 인터페이스다. 그럼 반환은 인터페이스를 구현한 객체로 반환해야함
- 인터페이스 장점
선언, 구현 분리시킬 수 있다.
① 코드변경에 유리
② 개발시간 단축
③ 표준화 가능
④ 관계없는 클래스 관계맺기 가능
class A {
public void methodA() {
I i = InstanceManager.getInstance();
i.methodB();
System.out.println(i.toString());
}
}
interface I {
public abstract void methodB();
}
class B implements I {
public void methodB() {
System.out.println("methodB in B class"); }
public String toString() {
return "B class"; }
}
class InstanceManager {
public static I getInstance() {
return new B();
}
}
public class interfaceTest{
public static void main(String[] args){
A a = new A();
a.methodA(); // "methodB in B class" %n "B class
}
}
-> interface I를 통해 methodB()를 분리시켰고, 인터페이스 메소드를 통해 해당 틀에서 만들고 싶은 객체를 만들수 있다.
위의 코드에선 B 클래스가 인터페이스를 구현하고 있다.
원하는 객체 C, D가 있다면 추상메서드를 변경하여 만들면 된다. 이때 인터페이스 I는 B,C,D 클래스의 표준화를 만든다.
참고 : 자바의 정석(남궁성)
댓글