인터페이스도 클래스처럼 static 메소드 정의할 수 있고, 호출 시에도 클래스와 호출 방법이 같다.
prn1 instanceof Printable
//prn1이 참조하는 인스턴스를 Printable 형 참조변수가 참조할 수 있느냐? 즉, prn1이 참조하는 인스턴스가 인터페이스Printable을 구현하고 있느냐?
마커 인터페이스는 클래스에 특정 표시를 해 두기 위한 목적으로 정의된 인터페이스이다. 마커 인터페이스는 구현해야 할 메소드가 없는 경우가 흔하다.
위의 예에서 만약 doc instanceof Upper가 true 라면, 그 의미는 인스턴스가 Upper의 구현체를 가지고 있다는 의미일 것이다. 하지만 Upper은 마커 인터페이스로서 추상 메소드 자체가 없다. 따라서 인스턴스는 Upper가 implements 되어 있으면 구현체가 없어도 성립한다. Upper가 implements됐다면 toUpperCase()를 호출하여 모든 문자를 대문자로 바꿀 것이다. 이 처럼 인터페이스를 가지고만(implements) 있으면 어떤 용도인지 확인하는 용도로 사용하는 인터페이스를 마커 인터페이스라고 한다.
추상 클래스
하나 이상의 추상 메소드를 가지고 있는 인터페이스가 아닌 클래스를 추상 클래스라고 하고, abstact 키워드로 추상 클래스임을 표시한다. 추상 클래스는 엄연히 클래스이므로 인터페이스와 다르게 인스턴스 변수/메소드를 가질 수 있다. 하지만 일반 클래스와 다르게 인스턴스 생성이 불가능하다.
추상 클래스는 인스턴스화 되는 것은 원치 않고, 상위 클래스 용도로 사용하기 위해 디자인 되었다. 추상 클래스를 상속하는 하위 클래스가 추상 메소드를 용도에 따라 정의해서 사용하기 위해 디자인 된 것이 추상 클래스이다.
추상클래스와 인터페이스의 공통점
- 추상 클래스와 인터페이스는 선언만 있고 구현 내용은 없다.
(자바 8부터 인터페이스에서 default method로 구현이 가능하지만 일반적으로 구현은 없다.)
- 인스턴스화(객체를 생성)를 할 수 없다.
추상 클래스를 extends로 상속 받은 자식들과 인터페이스를 implements하고 구현한 자식들만 객체를 생성할 수 있다. (결국 자식 클래스가 무언가 반드시 구현하도록 위임해야할 때 사용한다.)
추상클래스와 인터페이스의 차이점
- 추상 클래스(단일 상속)/ 인터페이스(다중 상속)
- 추상 클래스의 목적은 상속을 받아서 기능을 확장시키는 용도이다.(부모의 유전자를 물려 받는다.)
- 인터페이스의 목적은 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제하는 역할을 한다. (부모로부터 유전자를 물려받는 것이 아니라 사교적으로 필요에 따라 결합하는 관계). 즉, 구현 객체가 같은 동작을 한다는 것을 보장하기 위함이다.
'Programming > Java' 카테고리의 다른 글
JAVA 18(2) 예외 클래스 Throwable (0) | 2021.08.05 |
---|---|
JAVA 18(1) 예외처리의 기본 (0) | 2021.08.05 |
JAVA 17(2) 인터페이스의 기본 접근 지정자 (0) | 2021.08.04 |
JAVA 17(1) 인터페이스 (0) | 2021.08.04 |
JAVA 16 상속이 도움 되는 상황 (0) | 2021.08.04 |