2022.10.13
인터페이스
interface 인터페이스명 {
}
추상메소드와 상수 필드만 있는 추상 클래스와 완전 동일
추상메소드만 선언 가능 - public abstract
키워드가 생략되어도 추상 메소드
interface Move {
public abstract void move(int x, int y);
void move(int x, int y); //public abstract 생략해도 위와 같음
}
상수 필드만 선언 가능 - public static final
키워드가 생략되어도 상수
public interface Character {
public static final int DEFAULT_HEART = 5;
int DEFAULT_HEART = 5; //public static final 생략해도 위와 같음
}
인스턴스 생성 불가
클래스 선언 시에 클래스 이름 뒤에 implements 키워드로 구현하려는 인터페이스 명시
인터페이스 사이에는 다중 상속 가능
interface Skill extends Move, Attack {
}
//Skill, Move, Attack은 모두 인터페이스이다. 인터페이스 끼리는 다중 상속이 가능하다.
자바 8부터 default 메소드와 static 메소드로 구현부에 구현이 가능해짐
interface Help {
default void helpSkill() {
System.out.println("[도움말] 공격과 이동 중에 선택 가능!");
// default 메소드는 객체를 통해 호출 가능
static void helpItem() {
System.out.println("[도움말] 골드로 아이템 구매 가능!");
}
// static 메소드는 인터페이스이름을 통해 호출 가능
}
interface 키워드를 이용하여 인터페이스를 선언하며 주로 형용사를 사용
<aside> 💡 인터페이스와 추상 클래스의 차이
자바8 버전부터 인터페이스에 default 메소드와 static 메소드로 구현부에 구현이 가능해져 추상 클래스와의 차이점이 살짝 모호해졌다. 하지만 추상 클래스는 인터페이스와는 달리 일반 클래스처럼 객체변수, 생성자, private 메서드 등을 가질 수 있다는 차이점이 있다.
</aside>
다형성 (Polymorphism)
인스턴스의 취급이 변수의 형태에 따라 바뀜
parent = child // 자동 형 변환
child = (child) parent // 강제 형 변환도 가능은 함
부모클래스 타입으로 변환된 자식클래스는 getClass()
를 통해 자식클래스 타입으로 가져올 수 있다.