JAVA

인터페이스

HipPopoTamUs 2022. 10. 3. 07:05

인터페이스

인터페이스는 추상클래스보다 더 추상화된, 일종의 추상클래스이다.

추상클래스는 추상메소드를 포함하지만, 일반 메소드나 멤버변수도 가질 수 있다.

하지만 인터페이스는 추상메소드와 상수만을 멤버로 가질 수 있다.

그렇기 때문에 추상메소드는 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(); //인터페이스를 구현한 클래스의 인스턴스 반환
}