[Java] 인터페이스(Interface)

원서연·2023년 10월 28일
0

인터페이스는 사용할 객체의 기능들을 선언해 놓은 것이다.

인터페이스는 규약이다.
ex) 자동차의 특정 부품에 대한 규약. 부품 업체는 이걸 참고하여 생산/제공

  • 객체 생성을 할 수 없다.
    • 참조 변수의 타입으로 인터페이스를 사용할 수는 있다.
    //TV는 인터페이스, LedTV는 TV를 구현한 클래스
    TV tv = new LedTV(); // "다형성"
    tv.turnOn();         // 이런 경우에는 인터페이스가 가지고 있는 메소드만 사용할 수 있다.
    tv = (LedTV)tv; // "클래스의 형변환"
    tv.turnOnFast();// 인터페이스를 구현해 기능이 확장된 클래스의 기능을 사용할 수 있다.
  • 함수를 정의할 수 없다. (선언만 할 수 있다.)
    • ~ Java 7
  • 일반적인 필드를 갖을 수 없다. (final 필드만 갖는다. 즉 상수 필드만 갖는다.)
  • 따라서 인터페이스는 클래스에서 구현(Implements)을 해야만 사용을 할 수 있다.
    • 참고) Java 8 부터 인터페이스에서 static 메소드를 정의할 수 있다.
      • 따라서 이제 static 메소드 사용을 목적으로 사용될 수도 있다.

인터페이스를 사용하는 중요한 이유

  • 인터페이스를 구현한 클래스로 코드를 작성해 놓고, 나중에 또 다른 클래스로 인터페이스를 구현하고 그 클래스를 기존 코드에 적용할 때, 객체 생성하는 부분만 수정하면 된다.
    • 즉 소스 수정할 부분이 줄어들게 되어 유지보수에 용이하다.
    Tv tv = new LedTV(); // SmartTV 클래스를 새로 만들어 적용할 때, 이 부분만 수정하면 된다.
    // Tv tv = new SmartTV();
    tv.turnOn();
    tv.changeChannel(8);
    tv.changeVolume(39);
    tv.turnOff();

abstract 메서드만 존재한다.

  • abstract 메서드가 하나라도 있으면 abstract 클래스였다.
  • 인터페이스는 추상 메서드만 존재한다.
    • 따라서 인터페이스를 implements 하는 클래스들은 이러한 추상 메서드를 모두 재정의해야 한다.(오버라이딩)
    • 단, 인터페이스에서 추상 메서드에 abstract 키워드는 붙이지 않아도 된다.
      • 어차피 추상 메서드만 존재하는 것이 인터페이스이기 때문에 키워드를 붙여줄 필요가 없다.
      • 붙여도 에러는 나지 않지만, IDE가 불필요하다는 것을 알려준다.
    • 참고) Java 8 부터는 인터페이스도 메소드를 정의할 수 있다. 단, default, static 메소드를 통해 가능하다.
interface TV {
    void turnOn();
    void turnOff();
    void changeVolume(int volume);
    void changeChannel(int channel);
}

default 메서드

  • Java 8부터 인터페이스에 default 메서드가 생겼다.
  • 인터페이스에서도 메서드를 정의할 수 있다.
    • 물론 defalut 메서드를 오버라이딩(재정의)할 수도 있다.
  • default 키워드를 사용한다.
public interface Calculator {
    public int plus(int i, int j);
    public int multiple(int i, int j);
    default int exec(int i, int j){    // default로 선언하여 메소드를 구현할 수 있습니다.
        return i + j;
    }
}

인터페이스는 여러 개를 구현할 수 있다.

  • implements 키워드로 여러 개의 인터페이스를 구현할 수 있다.
  • cf) 자바에서 클래스는 다중 상속을 할 수 없다.
class SmartPhone implements Phone, Camera, Computer {

}

인터페이스에서 정의한 변수

  • 모두 상수로 취급 (변경 불가)
    • final 키워드를 별도로 붙이지는 않음
      • 붙여도 에러는 나지 않는다. 다만 IDE가 불필요한 키워드라는 것을 표시한다.
public interface Meter{
    public int BASE_FARE = 3000; // 기본요금(인터페이스에 정의한 변수는 상수라서 변경할 수 없습니다.)
    public abstract void start();
    public abstract int stop(int distance);
}
profile
웹 백엔드 프로그래밍 Today I Learned

0개의 댓글