[day12] java-basic : 인터페이스
Interface
-
인터페이스는 하나의 클래스에 어떤 기능을 붙였다 떼었다 할 수 있도록 만드는 것이다.
-
인터페이스는 기능에 대한 확장성을 만들어주는 것이다.
-
즉, 인터페이스는 기능을 옵션처럼 사용할 수 있게 하기 위해 만들어졌다.
-
하나의 추상 메소드를 가지고 있는 인터페이스를 만들 수도 있다.
-
자바에서는 클래스와 클래스는 상속관계를 가질 때 단일 상속만을 지원한다.
-
내가 이미 어떤 것을 상속 받았다면 다른 것을 또 추가로 상속받을 수 없기 때문에, 이러한 경우에 기능 확장을 위해 인터페이스를 사용하게 된다.
-
인터페이스는 다중상속을 지원하기 때문에 여러 기능을 하나의 클래스에 추가할 수 있게 된다.
-
확장성을 위해서 기능에 대한 표준은 다 인터페이스로 구현해야 한다. (추상클래스는 단일상속만 가능하기 때문에 복잡해짐)
-
그래서 인터페이스는 추상클래스보다 추상화 정도가 높다고 볼 수 있다.
Interface의 작성
// 인터페이스
interface 인터페이스명 {
// 멤버변수
public static final 타입 상수이름 = 값;
// i
public abstract 반환타입 메서드이름(매개변수목록);
}
Interface의 특징
-
인터페이스에서 선언되는 변수는 모두 상수로 적용되기 때문에 자동으로
public static final
이 변수 앞에 붙게 된다. -
public static final
는 인터페이스로 인식되면 JVM이 자동으로 붙이기 때문에 생략 가능하다. -
인터페이스를 통해 객체를 만들 수 없지만, 변수를 사용해야 하기 때문에
상수변수
가 될 수 밖에 없게 되는 것이다. -
인터페이스 안에 선언되는 메소드는 모두
추상 메소드
로 적용된다. -
인터페이스는 추상메소드만 가질 수 있기 때문에 JVM이 자동으로 붙여주는
public abstract
키워드를 생략할 수 있다. -
인터페이스는 모든 클래스에 달라붙어야 하고, 다양한 패키지에서 접근할 수 있어야 하기 때문에 접근제한자가
public
이다 -
인터페이스도 public, 인터페이스 내의 추상메소드도 public, 인터페이스 내의 상수 변수도 접근제한자는 public 이다.
interface의 상속
-
interface는 다중 상속이 가능하다.
-
인터페이스는 추상메소드와 상수만 가지고 있어야 하기 때문에 클래스를 상속받을 수 없다.
-
interface를 interface가 상속 받으면
extends
키워드를 사용한다. -
interface를 class 가 상속 받으면
implements
키워드를 사용한다. -
인터페이스를 상속받은 하위클래스는 인터페이스의 추상메소드를 반드시
override
(재정의) 해야 한다. -
하위 클래스에서 추상메소드를 오버라이딩할 때는
public
이라는 접근제한자를 꼭 붙여줘야 한다. -
오버라이딩의 조건 중 상위클래스(인터페이스의 메소드)보다 좁은 범위로 접근제한자를 변경할 수 없는 규칙이 있기 때문이다.
-
따라서 인터페이스의 메소드의 접근제한자는 무조건
public
이므로 인터페이스를 상속받아 오버라이딩할때도 반드시 접근제한자를public
으로 설정해야 한다. -
인터페이스는 무조건 인터페이스를 상속받아 구현한 클래스가 있어야 인스턴스 객체를 만들 수 있다.
-
인터페이스 객체변수는 하위클래스를 이용한다.
interface Printer{ }
class LGPrinter implements Printer{ }
=====================================================
class Main {
public static void main(String[] args) {
// 인터페이스 Printer의 객체변수는 LGPrinter를 이용한다.
Printer p = new LGPrinter();
}
}
interface의 예외사항 : 디폴트 메소드
-
원래 인터페이스는 추상메소드만 만들어야 하는데, 만약 추가하고 싶은 메소드가 생긴다면?
-
인터페이스에 기능 추상 메소드가 추가되면 상속받은 클래스들도 다 추가된 추상메소드를 추가해야 하는 비효율이 발생한다.
-
그래서 JDK1.8 부터 인터페이스에 디폴트 메소드를 추가시킬 수 있도록 문법이 추가되었다.
-
하지만 인터페이스는 원칙적으로 추상메소드만 만들어야 하므로, 디폴트메소드는 매우 예외적인 사항에만 사용된다.