JAVA_39_인터페이스

20154 단어 JavaJava

인터페이스 (interface)

정의

  • ✨✨✨추상메소드의 집합
  • 구현된 것이 전혀 없는 설계도
  • iv도 뭐도 없다!
  • 껍데기

요소

  • 모든 멤버가 ✨public
  • 요소 : static메소드, 디폴트메소드, 상수
  • public abstract 메소드명(매개변수..)
  • public static abstract 메소드명(매개변수..)
  • public static final 타입 상수명
  • 제어자들은 일부 또는 전부 생략 가능
interface 인터페이스명 {
	public static final 타입 상수명 =;
    	public abstract 메소드명(매개변수..);
}

인터페이스의 상속

  • 인터페이스의 조상은 인터페이스만 가능
  • Object가 최고 조상 아님!
  • 다중 상속 가능 - 추상메소드는 충돌해도 문제 없음

인터페이스의 구현

  • 인터페이스에 정의된 추상메소드를 클래스가 완성하는 것
  • 미완성 설계도 완성
  • implements
  • 일부만 구현할 경우 : 클래스 앞에 abstract을 붙인다.

class 클래스명 implements 인터페이스명 {
	//인터페이스에 정의된 모든 추상메소드를 구현해야 함!!
}

추상클래스와 인터페이스 비교

공통점

  • 추상메소드를 가지고 있다.

차이점

  • 인터페이스 : ✨iv를 가질 수 없다. (생성자, 인스턴스메소드도 마찬가지)


인터페이스를 이용한 다형성

  • 👀 인터페이스도 구현 클래스의 부모? : 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는 바꾸지 않아도 된다.




Ref

좋은 웹페이지 즐겨찾기