public
public abstract 메소드명(매개변수..)
public static abstract 메소드명(매개변수..)
public static final 타입 상수명
interface 인터페이스명 {
public static final 타입 상수명 = 값;
public abstract 메소드명(매개변수..);
}
Object
가 최고 조상 아님!implements
abstract
을 붙인다.
class 클래스명 implements 인터페이스명 {
//인터페이스에 정의된 모든 추상메소드를 구현해야 함!!
}
👀 인터페이스도 구현 클래스의 부모? : YES (엄밀히 말하면 아니랍니다)
✨✨✨ 인터페이스 타입 매개변수는 인터페이스 구현 클래스의 객체만 가능하다 ??
interface Fightable {
void move(int x, int y);
void attack(Fightable f); //******중요
}
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { }
public void attack(Fightable f) { }
}
...
Unit u = new Fighter(); //클래스 다형성
Fightable f = new Fighter(); //인터페이스 다형성
u.move(100, 200);
f.attack(new Fighter()); //******중요
Fighter
클래스는 Unit
클래스를 상속받고, Fightable
인터페이스를 구현한다.
Fightable f
매개변수 : ✨👀✨Fightable
인터페이스를 구현한 클래스의 인스턴스만 가능
Fightable method() {
//...
return new Fighter();
//정확히는 return (Fightable)new Fighter(); 형변환!!
}
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { }
public void attack(Fightable f) { }
}
...
Fightable f = method();
✨👀✨Fightable
인터페이스를 구현한 클래스의 인스턴스를 반환하는 method()
✨✨✨호출한 쪽, 즉 method();
을 받아 저장하는 변수도 Fightable
인터페이스 타입의 참조변수 f
!!
위 둘의 타입이 일치
abstract class Unit2{
int x, y;
abstract void move(int x, int y);
void stop() {
System.out.println("멈춥니다.");
};
}
interface Fightable{
void move(int x, int y); //public abstract 생략
void attack(Fightable f); //마찬가지
}
class Fighter extends Unit2 implements Fightable{
//오버라이딩 규칙 : 제어자가 조상(public)보다 범위가 좁으면 안된다!!
public void move(int x, int y) {
System.out.printf("[%d, %d]로 이동%n", x, y);
}
public void attack(Fightable f) {
System.out.println(f+"를 공격"); //toString()
}
//싸울 수 있는 상대를 불러온다.
Fightable getFightable() {
return (Fightable)new Fighter(); //Fighter를 생성해서 반환
//***메소드 반환타입Fightable과 일치!
//Fighter f = new Fighter(); return (Fightable)f;
//Fightable f = new Fighter(); return f; 둘다 가능!
}
}
public class FighterTest {
public static void main(String[] args) {
Fighter f = new Fighter();
f.move(100, 200);
f.attack(new Fighter());
f.stop();
Fightable ff = f.getFightable(); //***메소드 반환타입Fightable과 일치!!
System.out.println(ff+"와/과 싸웁니다.");
System.out.println();
Unit2 u = new Fighter();
u.move(100, 200);
// u.attack(new Fighter()); //Unit2에는 attack()이 없으므로 에러
u.stop();
// Fightable uu = u.getFightable(); //Unit2에는 getFightable()이 없으므로 에러
System.out.println();
Fightable f2 = new Fighter();
f2.move(100, 200);
f2.attack(f2);
// f2.stop(); //Fightable에는 stop()이 없으므로 에러
// Fightable ff2 = f2.getFightable(); //Fightable에는 getFightable()이 없으므로 에러
}
}
[100, 200]로 이동
Fighter@41629346를 공격
멈춥니다.
Fighter@404b9385와/과 싸웁니다.
[100, 200]로 이동
멈춥니다.
[100, 200]로 이동
Fighter@6d311334를 공격
두 대상(객체) 간의 연결, 대화, 소통을 돕는 중간역할을 한다.
자판기의 껍데기! 컴퓨터의 GUI!
선언(설계, 껍데기)과 구현(알맹이)을 분리
느슨한 결합 : 인터페이스 덕분에 B가 변경되어도 A는 바꾸지 않아도 된다.