인터페이스란?
· 구현된 것은 아무 것도 없는 밑그림만 있는 기본 설계도.
· 일반 메서드 또는 멤버 변수를 가질 수 없고, 오직 추상 메서드와 상수만을 멤버로 가질 수 있다. → 추상 클래스보다 추상화가 더 높다.
· 인터페이스는 표준, 약속, 규칙 이다.
인터페이스 작성 방법
· class 대신 interface라는 키워드를 사용한다.
· class와 같이 접근 제어자로 public이나 default를 사용할 수 있다.
interface 인터페이스 이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
인터페이스 제약사항
· 모든 멤버 변수는 public static final 이어야 하며, 이를 생략 가능.
· 모든 메서드는 public abstract 이어야 하며, 이를 생략 가능.
인터페이스의 상속
· 인터페이스는 인터페이스로부터만 상속 받을 수 있다. (Object와 같은 최고 조상이 없다)
· 여러개의 인터페이스로부터 상속 가능. (다중 상속 가능)
interface Movable{
void move(int x, int y);
}
interface Attackable {
void attack(Unit u)l
}
interface Fightable extends Movable, Attackable {
}
인터페이스의 구현
· 그 자체로는 인스턴스를 생성할 수 없다.
· 구현한다는 의미의 implements를 사용해서 구현한다. (클래스는 확장한다는 의미에 extends를 사용)
· 만약 인터페이스의 메서드 중 일부만 구현한다면, 추상 클래스로 선언되어야 한다.
· 상속과 구현을 동시에 할 수 있다.
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상 메서드를 구현
}
abstract class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상 메서드의 일부만 구현
}
class 클래스이름 extends 조상클래스이름 implements 인터페이스이름 {
}
인터페이스의 장점
· 개발 시간을 단축시킬 수 있음.
· 표준화가 가능.
· 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다. → 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.
· 독립적인 프로그래밍이 가능. → 클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않도록 독립적인 프로그래밍이 가능.
▶ 직접적인 관계의 두 클래스 (A-B)
class A {
public void methodA(B b) {
b.methodB();
}
}
class B {
public void methodB() {
System.out,println("methodB()");
}
}
class InterfaceTest {
public static void main(String[] args) {
A a = new A();
a.methodA(new B());
}
}
▶ 간접적인 관계의 두 클래스 (A-I-B)
class A {
public void methodA(I i) {
i.methodB();
}
}
Interface I {
void methodB();
}
class B implements I {
public void methodB() {
System.out.println("methodB()");
}
}
class C implements I {
public void methodB() {
System.out.println("methodB() in C");
}
}
· 공통점
- 스스로 객체를 생성할 수 없다.
- 상속 관계에서만 존재한다. (구현을 목적으로 한다)
· 차이점
- 다중 상속을 지원한다. (인터페이스)
- 모든 자원이 미완성이다. (인터페이스)