인터페이스

msung99·2022년 2월 14일
0


인터페이스란?

클래스와 달리 객체를 생성할 수 없으며, 클래스에서 구현해야 하는
상세 작업 명세서이다.

  • 클래스를 구체적으로 구현하기 전에, 클래스에 포함되어야 하는 기능들에 대한 양식을 미리 간단하게 정리해 놓은 초안(명세서?) 와 같다.

클래스는 new 키워드를 이용해 객체를 메모리에 생성해서 레퍼런스를 이용해 접근하는 방식이었다.

인터페이스가 가지고 있는 기능들은 상세한 내용이 없고 선언만 되어 있다.

이 내용을 클래스에서 더 명확하게 하고, 정의 부분을 만들어 준다.

즉, 클래스는 인터페이스를 구현하고, 그리고나서 이 클래스로부터 객체를 구현하는 형태이다.


인터페이스 사용법

  • class 대신 interface 키워드를 사용하며, extend 대신 implements 라는 키워드를 이용한다.
  • 어떤 메소드에 대해 선언만 하지, 정의를 하지는 않는다.

인터페이스는 아래와 같이 구현한다.

// 인터페이스 

/*
이 인터페이스를 구현해내는 클래스는 funA 메소드를 
만들어야하고, 클래스에서 구체적으로 구현할 때 funA 는 
public 이고, 반환형은 void 이며, 파라미터는 없는 등의 초안을 지켜야 한다. */

public interface InterfaceA {
  public void funA(); // 매소드 funA 를 선언
}

인터페이스 InterfaceA 를 구체적으로 구현해내는 클래스를 정의해보자.

// 인터페이스인 InterfaceA 를 상세하게 구현해낸 클래스 ImplementClass

public class ImplementClass implements InterfaceA{
  public void funA() {
    System.out.println("funA START");
  }
}

예제

인터페이스 InterfaceA 정의

public interface InterfaceA{
  public void funA();
}

인터페이스 InterfaceB 정의

public interface InterfaceB{
  public void funB();
}

클래스 정의

  • implements 구문에 InterfaceA, InterfaceB 2개를 포함시켰다. 따라서 클래스 정의시 두 인터페이스에 선언된 메소드들이 모두 포함되게 해야한다.
// Interface 클래스 

public class Interfaceclass implements InterfaceA, InterfaceB{
  
  public Interfaceclass(){
    System.out.printlb("클래스 생성자");
  }
  
  @Override
  public void funA(){
    System.out.printlb("==funA()==");
  }
  
  @Override
  public void funB(){
    System.out.printlb("==funB()==");
  }
}

main 함수

  • 클래스에는 funA() 와 funB() 를 모두 포함하여 올바르게 정의되었다.
    그런데 객체 ia 의 데이터 타입은 InterfaceA 이므로 funA() 만 사용 가능하다.

마찬가지로 객체 ib 의 데이터 타입이 InterfaceB 이므로 funB() 만 사용 가능하다.

// main 함수

public static void main(String[] args){
  InterfaceA ia = new Interfaceclass();
  InterfaceB ib = new Interfaceclass();
  
  ia.funA();
  ib.funB();
}

인터페이스의 다양한 기능

다양한 클래스가 동일한 인터페이스 데이터 타입을 가질 수 있다.


// ToyRobot 클래스와 TopAirplane 클래스가 동일한 인터페이스 Toy 를 가지는 경우 

Toy robot = new ToyRobot();
Toy airplane = new ToyAirplane();

Toy toys[] = {robot, airplane}; // 서로 다른 클래스이지만, 
// 데이터 타입이 인터페이스 Toy 로 동일하므로 배열에 두 객체를 할당할 수 있다.


// 데이터 타입은 인터페이스 Toy 타입으로 동일해도, 두 객체는 각자
// 다른 클래스에서 메소드가 구현되었으로 반복문 실행시 서로 
// 각자의 클래스에서 정의된 다른 내용을 수행한다.
for (int i =0, i <toys.length; i++){
  toys[i].walk();
  toys[i].run();
  toys[i].alarm();
  toys[i].light();
  
  System.out.println();
}
profile
블로그 이전했습니다 🙂 : https://haon.blog

0개의 댓글