Programming/Java

[JAVA STUDY] 8주차 : 인터페이스

Supreme_YS 2021. 11. 23. 11:35

목표

자바의 인터페이스 학습하기

학습할 것

인터페이스 정의하는 방법

인터페이스 구현하는 방법

인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

인터페이스 상속

인터페이스의 기본 메소드 (Default Method), 자바 8

인터페이스의 static 메소드, 자바 8

인터페이스의 private 메소드, 자바 9

  1. 인터페이스 정의하는 방법

인터페이스를 작성하는 것은 클래스를 작성하는 것과 같다. 키워드로 interface를 사용한다.

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

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

  • 모든 멤버 변수는 public static final 이어야 하며, 이를 생략할 수 있다.
  • 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
  • 인터페이스 vs 추상 클래스
  • 추상 클래스인터페이스
    일반 메소드 포함 가능 모든 메서드는 추상 메서드
    다중상속 불가능 다중상속 가능
    상수, 변수 필드 포함가능 상수필드만 포함가능
  1. 인터페이스 구현하는 방법

인터페이스 그 자체로는 인스턴스를 생성할 수 없으며, 추상 클래스가 상속을 통해 추상메서드를 완성하는 것처럼 인터페이스를 구현해주는 클래스를 생성하여 추상 메소드를 구현하여 사용할 수 있다.

public class Hyundai implements Car {
  @Override
  public void move(){
    // 구현코드
  }
  
  @Override
  public void stop(){
    // 구현코드
  }
}
  1. 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

인터페이스 타입의 참조 변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있으며, 인터페이스 타입으로의 형변환도 가능하다.

interface Car {
    // 소스코드
}
​
class Hyundai implements Car {
  // 구현코드
}
​
class Kia implements Car {
  // 구현코드
}
​
class Tesla implements Car {
  // 구현코드
}
​
public class Main {
  public static void main(String[] args) {
    Car Hyundai = new Hyundai(); // 인터페이스 타입
    Car Kia = new Kia();
    Car Tesla = new Tesla();
    
    Car[] cars = new Car[3];
    cars[0] = hyundai;
    cars[1] = kia;
    cars[2] = tesla;
  }
}

이를 이용하여 서버 쪽의 변경 가능성이 있는 코드가 있더라도 해당 코드를 인터페이스 타입으로 선언하면 클라이언트의 코드에는 영향을 주지 않고 서버 쪽에서 구현체만 바꿔주면 되기 때문에 효율적으로 프로그램을 작성할 수 있다.

  1. 인터페이스 상속 인터페이스 간의 상속 인터페이스끼리 상속을 받을 수 있다. 부모클래스와 자식클래스 간의 상속과 마찬가지로 extends키워드를 사용한다.
  2. 클래스 간의 상속 인터페이스를 상속한 클래스는 보통 "인터페이스를 구현한 클래스"라는 표현을 사용한다. implements키워드를 사용하며, 다중상속이 가능하다.
  3. 인터페이스의 기본 메소드, 자바8
    • interface에서도 메서드 구현이 가능하다.
    • 참조변수로 함수를 호출할 수 있다.
    • implements한 클래스에서 재정의가 가능하다
  4. 인터페이스 내의 메서드는 반환형과 메서드 이름만 선언하고 바디부분에 기재하는 로직은 생략한다. 인터페이스를 구현할 클래스(구현체)에서 로직을 구현하기 때문이다. 하지만 인터페이스에 추가적으로 구현해야 할 메서드가 생기면, 이 인터페이스에 의존하고 있는 모든 구현체들을 변경해야 하는 문제점이 발생하게 된다. 이 것이 하위호환성 문제인데 이 것을 보완하기 위해 인터페이스 내에서도 로직을 만드는 default method가 자바 8부터 지원된다. 인터페이스의 default method는 default 라는 키워드를 명시해야 한다.
  5. 인터페이스의 static 메서드, 자바 8
    • 자바 8 부터 인터페이스에 static메서드 추가가 가능하다.
    • 클래스에서와 동일한 방법으로 사용 가능하며, 기본적으로 public으로 간주한다.
    • Static 메서드 이므로 상속이 불가능하다.
  6. 인터페이스의 private 메서드, 자바 9
    • 자바 8에서 인터페이스에서 default 메서드 사용이 가능해졌기 때문에 자바 9에서 로직 분리를 위한 private 메서드를 사용할 수 있다.
    • Private 이기 때문에 인터페이스에서 구현이 되어 있어야하고 abstract 메서드 일 수 없다.
    • private 이기 때문에 구현체에서 구현할 수 없고 자식 인터페이스에서도 상속이 불가능하다.
    • Static 메서드도 private가 가능하다.