자바/자바 기초

인터페이스

qkwi 2021. 11. 10. 17:09
728x90

인터페이스

  • 인터페이스는 일종의 추상 클래스이다. 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다.

  • 다른 클래스를 작성하는데 도움 줄 목적으로 작성된다.

  • 작성

    interface 인터페이스이름{
      public static final 타입 상수이름 = 값;
      public abstract 메서드 이름(매개변수 목록);
    }
    // 모든 멤버 변수는 public static final이어야 하며, 이를 생략 할 수 있다.
    // 모든 메서드는 public abstract이어야 하며 이를 생략할 수 있다.
    // static메서드와 디폴트 메서드는 예외
  • 상속

    • 인터페이스는 인터페이스로부터만 상속받을 수 있으며 클래스와는 달리 다중상속, 즉 여러 개의 인터페이스로부터 상속을 받는 것이 가능하다.
    interface Movable{
      void move(int x,int y)
    }
    
    interface Attackable{
      void attack(Unit u);
    }
    
    interface Fightable extends Movable,Attackable{}
  • 구현

    • 인터페이스도 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없으며 추상클래스가 상속을 통해 추상 메서드를 완성하는 것처럼, 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야 한다.
    
    class 클래스이름 implements 인터페이스이름{
    
    }
    
    // 만일 구현하는 인터페이스의 메서드 중 일부만 구현한다면, abstract를 붙여서 추상클래스로 선언해야 한다.
    
    abstract class Fighter implements Fightable{
      public void move(int x, int y ){
        this.x +=x
        this.y += y
      }
    }
    
    

// 상속과 구현을 동시에 하는법
class A extend b implemnets b{
public void move(int x , int y ){
this.x +=x
this.y += y
}
}

  • 오버라이딩 할 때는 조상의 메서드보다 넓은 범위의 접근 제어자를 결정해야한다.
    • interface메소드는 public abstract이 기본적으로 지정되있으므로,
      구현할 때는 제어자를 public으로 반드시 해줘야 한다.
  • 인터페이스를 이용한 다형성

    • 다형성 : 자손클래스의 인스턴스를 조상타입의 참조변수로 참조하는것이 가능하다.

    • 인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것이다.

      Fightable method(){
        return new firter() 
      }
```java
 static void main(String argsp[]){
   b test = makeA.getAClass();  
  // 리턴타입이 인터페이스이므로 구현한 클래스의 인스턴스를 반환 한다.
   // b test = new A(); 다형성을 사용한것과 같다. 조상 타입의 참조변수로 사용할 수 있다. 

   test.testmethod();
 }

 class makeA {
   public static b getAClass{
     return new a();
   }
 }


 class a implements b{
  public void testmethod(){
    Syetem.out.println("b인터페이스 테스트");
  }
 }


 interface b{
   void testmethod(); // public abstract 생략가능
 }

```
  • 인터페이스 장점

    • 개발시간을 단축시킬 수 있다.
      • 인터페이스를 작성해놓으면 여러군데에서 인터페이스를 통해 개발을 할 때 동시에 개발을 할 수 있다.
  • 표준화

    • 프로젝트에 사용되는 기본 틀을 인터페이스로 작성한다음 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다.
  • 서로 관계 없는 클래스들에게 관계를 맺어 줄 수 있다.

    • 서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.
  • 인터페이스 사용예시

    • Barrack, factory,a,b.. > build에 속해 있는 자식 클래스들
    • Barrack,factory에만 따로 기능을 추가하고 싶을 때 인터페이스사용
      interface Liftable{
      void liftoff(); // 물건들어올리기
      }
      

    //Liftable의 메소드 기능 구현 클래스
    class LiftableImpl implements Liftable{
    public void liftoff(){

    // 함수기능구현

    }

    class Barrack extends Building implements Liftable{
    LiftableImpl l = new LiftableImpl();
    void liftOff() { I.liftOff();} // LiftableImpl 클래스를 이용하여 메소드 기능 구현
    }
    }

  • 인터페이스 이해

    • 클래스를 사용하는 쪽과 클래스를 제공하는 쪽이 있다.
    • 메서드를 사용하는 쪽에서는 사용하려는 메서드의 선언부분만 알면 된다.
      class InterfaceTest3{
      public static void main(String[] args){
        A a = new A();
        a.methodA();
      }
      }
      
      

class A{
void methodA(){
I i= InstanceManager.getInstance();
i.methodB();
System.out.println(i.toString()); // i로 Object클래스이 메서드 호출 가능
}
}

interface I {
public abstract void methodB();
}

class B implements I{
public void methodB(){
System.out.println("methodB in B class");

}
public String toString() {return "Class B"};

}

class InstanceManager{
public static I getInstance(){
return new B();
}
}

// 모든 객체는 Object클래스에 정의된 메서드를 가지고 있을 것이기 떄문에 ToString사용이 허용된다.

```


728x90