자르비 왕국
[Java] 인터페이스, 추상클래스 본문
인터페이스 (Interface)
구성
- interface 선언
- 추상 메소드 : 몸체 없는 메소드
interface Printable {
public void print(String dox); // 추상 메소드
}
- 상속 키워드 : implements (구현)
특징
- 구현할 인터페이스를 명시할 때 키워드 implements를 사용
- 한 클래스는 둘 이상의 인터페이스 구현 가능 (다중 상속)
- 상속과 구현 동시 가능
본질적 의미
인터페이스를 상속한 클래스들이 내부적으로 어떻게 이루어지는지 알 필요가 없다. 사용자는 인터페이스의 메소드만 호출하면 된다.
인터페이스 문법
메소드
인터페이스의 모든 메소드는 public이 선언된 것으로 간주 (public 생략)
변수
- 반드시 선언과 동시에 초기화 필요
- 모든 변수는 public, static, final이 선언된 것으로 간주 (상수 -> 변수 이름은 대문자로)
상속
인터페이스끼리 상속이 가능하다. 이때 extends를 사용한다.
- 클래스 - 클래스 : extends
- 인터페이스 - 인터페이스 : extends
- 클래스 - 인터페이스 : implements
디폴트 메소드 (default method)
- 자체로 완전한 메소드 (비록 인터페이스 내에 정의되어 있지만)
- 따라서 이를 구현하는 클래스가 오버라이딩 하지 않아도 된다.
interface Printable {
void print(String doc);
default void printCMYK(String doc) {
System.out.println("디폴트 메소드");
}
}
디폴트 메소드는 이미 구현된 인터페이스가 향후 업데이트 되었을 때, 이를 구현한 다른 class들이 모두 수정해야하는 것을 방지하기 위해 만들어진 문법이다. 따라서 디폴트 메소드는 인터페이스를 처음 생성할 때 사용하는 것이 아니라, 기존의 인터페이스가 수정되었을 때 추가되는 메소드여야 한다.
마커 인터페이스 (Marker Interface)
인터페이스는 클래스에 특별한 표식을 다는 용도로도 사용이 된다. 마커 인터페이스는 아무런 메소드도 존재하지 않는 경우가 많다.
interface Upper { }
interface Lower { }
interface Printable {
String getContents();
}
class Report implements Printable, Upper {
String cons;
Report(String cons) {
this.cons = cons;
}
public String getContents() {
return cons;
}
}
추상 클래스 (Abstract Class)
하나 이상의 추상 메소드를 갖는 클래스를 가리켜 '추상 클래스'라 한다.
즉, 여느 클래스들과 마찬가지로 인스턴스 변수와 인스턴스 메소드를 갖지만, 이를 상속하는 하위 클래스에 의해서 구현되어야 할 메소드가 하나 이상 있는 경우를 추상 클래스라고 한다.
public abstract class House {
public void methodOne() {
System.out.println("methodOne");
}
@Override
public abstract void methodTwo(); // 추상 메소드
}
- 인스턴스 생성 불가능
- 다른 클래스에 의해서 추상 메소드가 구현이 되어야 한다.
- 클래스이기 때문에 상속할 때는 extends를 사용
인터페이스 vs 추상클래스
- 인터페이스 (다중상속) / 추상클래스 (단일상속)
- 추상 클래스의 목적 : 상속을 받아서 기능을 확장시키는 것
- 인터페이스의 목적 : 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제성을 부여 (구현 객체가 같은 동작을 한다는 것을 보장하기 위함)
'Development > Java' 카테고리의 다른 글
[Java] Map<K, V> 컬렉션 클래스 (0) | 2022.04.18 |
---|---|
[Java] List<E> 컬렉션 클래스 (0) | 2022.04.18 |
[Java] Generics 제네릭 (0) | 2022.04.17 |
[Java] 메모리 모델 (0) | 2022.04.16 |
[Java] 상속, 오버라이딩 (0) | 2022.04.10 |