Backend/Java

[Java] 인터페이스

서교동김계란 2024. 5. 10. 22:25
728x90

🎯 인터페이스

1.1 인터페이스(interface)란?

  • 일종의 추상클래스. 추상클래스(미완성 설계도) 보다 추상화 정도가 높다.
  • 실제 구현된 것이 전혀 없는 기본 설계도
  • 추상메서드와 상수만을 멤버로 가질 수 있다.
  • 인스턴스를 생성할 수 없고 클래스 작성에 도움을 줄 목적으로 사용된다.
  • 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.

 

1.2 인터페이스의 작성

class를 작성하는 것과 비슷한데, 키워드로 class대신 interface를 사용한다는 것만 다르다.

interface 인터페이스이름 {
	public static final 타입 상수이름 = 값;
    public abstract 메서드이름(매개변수목록);
    }

 

인터페이스의 멤버들은 제약사항이 있다.

  • 모든 멤버변수는 public static final 이어야 한다.
  • 모든 메서드는 public abstract 이어야 한다. (JDK1.8부터 static메서드와 디폴트 메서드는 예외)

 

1.3 인터페이스의 상속

인터페이스는 인터페이스로부터만 상속받는 게 가능하며, 클래스와 달리 다중상속이 가능하다.

interface Moveable {
    void move();
}

interface Attackable {
    void attack();
}

interface Fightable extends Move, Attack{ }
  • 클래스 상속과 마찬가지로 인터페이스도 조상 인터페이스에 정의된 멤버를 모두 상속받는다.

 

1.4 인터페이스 구현

  • 인터페이스를 구현하는 것은 클래스 상속과 같은데 extends대신 implements를 쓰면 된다.
  • 인터페이스는 정의된 추상메서드를 완성해야 한다.
  • 인터페이스는 상속과 구현이 동시에 가능하다.
import java.time.Month;

public class Test {
    public static void main(String[] args) {
    Fighter f = new Fighter();

        if (f instanceof Unit)
            System.out.println("f는 Unit클래스의 자손입니다.");

        if (f instanceof Fightable)
            System.out.println("f는 Fightable인터페이스를 구현했습니다.");

        if (f instanceof Moveable)
            System.out.println("f는 Movablee인터페이스를 구현했습니다.");

        if (f instanceof Attackable)
            System.out.println("f는 Attackable인터페이스를 구현했습니다.");

        if (f instanceof Object)
            System.out.println("f는 Object클래스의 자손입니다.");
    }
}

class Fighter extends Unit implements Fightable {
    public void Move(int x, int y) { /* 내용 생략 */ }
    public void Attack(Unit u) { /* 내용 생략 */ }
}
class Unit {
    int HP; // 유닛 체력
    int x;  // 유닛 위치(x 좌표)
    int y;  // 유닛 위치(y 좌표)
}

interface Fightable extends Movable, Attackable { }
interface Movable {    void Move(int x, int y);     }
interface Attackable {    void Attack(Unit u);     }

실행결과
f는 Unit클래스의 자손입니다.
f는 Fightable인터페이스를 구현했습니다.
f는 Movable인터페이스를 구현했습니다.
f는 Attackable인터페이스를 구현했습니다.
f는 Object클래스의 자손입니다.

Fighter클래스는 Unit클래스를 상속받고 Fightable 인터페이스만 구현했지만, Unit클래스는 Object클래스의 자손이고,

Fightable인터페이스는 Attackable과 Movable인터페이스의 자손이므로 Fighter클래스는 이 모든 클래스와 

인터페이스의 자손이 되는 셈이다.

 

1.5 인터페이스의 장점

  • 개발시간을 단축시킬 수 있다.
    일단 인터페이스가 작성되면, 이를 사용해서 프로그램을 작성하는 것이 가능하다. 
    메서드를 호출하는 쪽에서는 선언부만 알면 되기 때문이다.
    동시에 다른 한쪽에서는 인터페이스를 구현하는 클래스를 작성하도록 하여,
    인터페이스를 구현하는 클래스가 작성될 때까지 기다리지 않고 양쪽에서 동시에 개발을 진행할 수 있다.
  • 표준화가 가능하다.
    프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 
    프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다.
  • 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
    서로 상속관계에 있지도 않고, 같은 조상클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스들에게 
    하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.
  • 독립적인 프로그래밍이 가능하다
     인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제구현에 독립적인 프로그램을 작성하는 것이  가능하다.