모든 멤버가 추상메소드인 타입, new 할 수 없음
추상클래스의 일종으로 추상클래스보다 인터페이스가 추상화 정도가 높다.
class 대신 interface를 사용한다는 것만 다르고 클래스 작성방법과 동일하다
interface 인터페이스명 {
public static final 타입 상수명 = 값;
public abstract 메소드명(매개변수목록);
}
interface Shape2 { // 인터페이스 : 모든 멤버가 추상메소드인 타입, new 할 수 없음
String VERSION = "1.0"; // --> public static final String VERSION="1.0"
void draw(); // --> abstract public void draw();
}
인터페이스도 클래스처럼 상속이 가능하다.
-> 클래스와 달리 다중 상속 허용
인터페이스는 Object클래스와 같은 최고 조상이 없다.
interface Moveable {
void move(int x, int y);
}
interface Attackable {
void attack(Unit u);
}
interface Fightable extends Moveable, Attackable { }
인터페이스를 구현하는 건 클래스를 상속받는 것과 같다
대신 extends 대신 implements를 사용한다
interface Shape2 { // 인터페이스
String VERSION = "1.0"; // --> public static final String VERSION="1.0"
void draw(); // --> abstract public void draw();
}
class Rect2 implements Shape2 {
public void draw() {
System.out.println("Draw Rect");
}
}
class Oval2 implements Shape2 {
public void draw() {
System.out.println("Draw Oval");
}
}
class Line2 implements Shape2 {
public void draw() {
System.out.println("Draw Line");
}
}
public class Ex04Interface {
public static void main(String[] args) {
//1. 인터페이스는 인스턴스 생성 X
//Shape2 shape2 = new Shape2();
//2. 인터페이스 타입의 참조변수는 만들 수 있습니다.
Shape2 shape = null;
//4. 인터페이스 사용 -> 다형성 적용
ArrayList<Shape2> shapes = new ArrayList<>();
for (int i = 0; i < 10; i++) {
if (i % 3 == 0) {
shapes.add(new Rect2());
} else if (i % 3 == 1) {
shapes.add(new Oval2());
} else {
shapes.add(new Line2());
}
}
for(Shape2 s : shapes) {
s.draw(); //다형성 : 같은 메소드 호출 코드가 인스턴스에 따라 다른 동작 수행
}
}
}
1) 인터페이스 타입 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.
2) 인터페이스를 메소드의 매개변수 타입으로 지정할 수 있다.
void attack(Fightable f) { //Fightable인터페이스 구현한 클래스의 인스턴스를 매개변수로 받는 메소드
}
3) 인터페이스를 메소드 리턴타입으로 지정할 수 있다.
Fightable method() { //Fightable인터페이스 구현한 클래스의 인스턴스를 반환
return new Fighter();
}