본문 바로가기
Back-End/Java

[Back-End][Java] 32. 인터페이스 Interface

by nanee_ 2021. 9. 14.
728x90
반응형
SMALL

인터페이스 Interface

: 구현되어 있는 것이 아무 것도 없는 밑 그림만 있는 기본 설계도이다.

멤버변수, 일반메서드를 정의할 수 없고, 오직 추상메서드와 상수 만을 멤버로 가질 수 있다.

 

추상클래스를 고도화 시킨 문법이다.

다른 클래스에서 인터페이스를 지정할 때에는 implements 키워드를 사용한다.

지정된 인터페이스가 가지고 있는 추상메서드들을 하위클래스에서 반드시 재정의 해야한다.

 

객체 지향 패러다임의 핵심적인 개념으로,

객체와 객체 간의 상호협력해서 코드를 설계해 나간다.

즉, 객체와 객체 간의 관계를 정의해서 코드를 설계해 나간다.

(상속, 포함관계, 추상클래스, 인터페이스, 다형성 모두 관련있는 개념들이다.)

 

 

인터페이스를 쓰는 이유

인터페이스는 클래스나 프로그램이 제공하는 기능을 명시적으로 선언한다.

일종의 클라이언트와 코드와의 약속이며, 클래스나 프로그램이 제공하는 명세이다.

클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현할 수 있다.

 

어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미이다.

이는 다형성이 성립된다고도 이야기할 수 있다.

 

 

인터페이스의 장점

- 표준화가 가능하다.

- 서로 관계없는 클래스에게 관계를 맺어줄 수 있다.

- 클래스 간의 결합도를 낮춰서 유연한 코드를 설계할 수 있다.

  (결합도가 높으면 오류 발생할 가능성이 높고, 유지보수가 어렵다)

 

 

예제코드

가전제품이라는 클래스를 텔레비전, 냉장고 등과 같은 제품이 아닌 장난감 로봇이 상속받기에는 개념적인 문제가 생길 수 있다. 하지만 쓰는 기능은 같아서 같은 메소드를 구현하고 싶다고 하면, 원격제어와 같은 인터페이스를 생성해 추상메서드를 선언하고 텔레비전, 냉장고와 함께 장난감 로봇이 implements 하면 된다.

 

 

RemoteController.java

public interface RemoteController {

  // 상수
  public static final int SERIAL_NUMBER = 100;

  // 추상메서드 (public abstract는 생략가능 (java 8 이후버전 가능))
  public abstract void turnOn();
  void turnOff(); 

}

 

SoundEffect.java

public interface SoundEffect {
	
  // 추상메서드
  void notification();
}

 

HomeAppliances.java

public abstract class HomeAppliances {

  // 멤버변수
  int width;
  int height;
  String color;
}

 

Television.java

public class Television extends HomeAppliances implements RemoteController, SoundEffect {

  // 추상메서드 재정의
  @Override
  public void turnOn() {
  	System.out.println("TV를 켭니다.");
  }
  @Override
  public void turnOff() {
  	System.out.println("TV를 끕니다.");
  }
  @Override
  public void notification() {
  	System.out.println("삐리리 ~~");
  } 
}

 

Refrigerator.java

public class Refrigerator extends HomeAppliances implements RemoteController {

	// 추상메서드 재정의
	@Override
	public void turnOn() {
		System.out.println("냉장고를 켭니다.");
	}
	@Override
	public void turnOff() {
		System.out.println("냉장고를 끕니다.");
	}
}

 

ToyRobot.java

public class ToyRobot implements RemoteController, SoundEffect{
	
  String name; 

  // 추상메서드 재정의
  @Override
  public void turnOn() {
  	System.out.println("장난감 로봇을 켭니다.");
  }
  @Override
  public void turnOff() {
  	System.out.println("장난감 로봇을 끕니다..");
  }
  @Override
  public void notification() {
  	System.out.println("띠링띠링~~!");
  }

}

 

MainTest.java

public class MainTest {

  public static void main(String[] args) {

    Television television = new Television();
    Refrigerator refrigerator = new Refrigerator();
    ToyRobot toyRobot = new ToyRobot();

    television.turnOn();
    television.turnOff();
    System.out.println("-----------------");
    refrigerator.turnOn();
    refrigerator.turnOff();
    System.out.println("-----------------");
    toyRobot.turnOn();
    toyRobot.turnOff();
    System.out.println("-----------------");

    // 길이 3의 배열을 만들어 각 인덱스에 인스턴스변수 넣어주기
    RemoteController[] remote = new RemoteController[3];
    remote[0] = television;
    remote[1] = refrigerator;
    remote[2] = toyRobot;

    // 확장 for문을 이용한 turnOn() 메서드 호출
    for (RemoteController remoteController : remote) {
    	remoteController.turnOn();
    }

    System.out.println("-----------------------");

    // 확장 for문을 이용한 turnOff() 메서드 호출
    for (RemoteController remoteController : remote) {
    	remoteController.turnOff();
    }
  }
}

 

728x90
반응형
LIST