public class Vehicle {
private int curX, curY;
public void reportPosition() {
System.out.printf("현재 위치: (%d, %d)\n)", curX, curY);
}
public void addFuel() {
System.out.printf("모든 운송 수단은 연료가 필요");
}
}
public class ElectricCar extends Vehicle{
private int curX, curY;
@Override
public void reportPosition() {
System.out.printf("차종: %s: 현재 위치: (%d, %d)%n", this.getClass().getSimpleName(), curX, curY);
}
@Override
public void addFuel() {
System.out.printf("차종: %s: 연료 주입: %s%n", this.getClass().getSimpleName(), "충전");
}
}
public class DieselSUV extends Vehicle{
private int curX, curY;
@Override
public void reportPosition() {
System.out.printf("차종: %s: 현재 위치: (%d, %d)%n", this.getClass().getSimpleName(), curX, curY);
}
@Override
public void addFuel() {
System.out.printf("차종: %s: 연료 주입: %s%n", this.getClass().getSimpleName(), "경유");
}
}
;
으로 대체abstract class Vehicle {
private int curX, curY;
public void reportPosition() {
System.out.printf("현재 위치: (%d, %d)\n)", curX, curY);
}
public abstract void addFuel();
}
Vehicle.class를 위와 같이 수정한다.
// Vehicle v = new Vehicle(); <- 불가
Vehicle v = new DieselSUV(); <- 자식을 참조하는 것은 문제 없음
public class HorseCart extends Vehicle{
@Override
public void addFuel(){
System.out.println("건초를 줘야함");
}
}
클래스와 마찬가지로 인터페이스도 extends를 이용해 상속이 가능
클래스와 다른 점은 인터페이스는 다중 상속이 가능
interface Fightable{
int fire();
}
interface Transformable{
void changeShape(boolean isHeroMode);
}
public interface Heroable extends Fightable, Transformable{
void upgrade();
}
public class IronManTest {
public static void main(String[] args) {
IronMan iman = new IronMan();
Object obj = iman;
Fightable f = iman;
Transformable t = iman;
Heroable h = iman;
}
}
구현의 강제로 표준화 처리 -> 손쉬운 모듈 교체 지원
인터페이스를 통하 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원
서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
모듈 간 독립적 프로그래밍 가능 -> 개발 기간 단축
interface DefaultMethodInterface{
void abstractMethod();
default void defaultMethod(){
System.out.println("기본 메서드");
}
}
다양한 타입의 객체를 다루는 매서드, 컬렉션 클래스에서 컴파일 시에 타입 체크
클래스 또는 인터페이스선언 시 <>에 타입 파라미터 표시
public class Class_Name<T>{}
public interface Interface_Name<T>{}
타입