인터페이스

리무 rimu ·2023년 12월 6일

인터페이스

추상 클래스와의 차이

🔴  : 추상 클래스 / 🔷  : 인터페이스

  • 🔴 포유류
    • 북극곰 - 🔷  사냥, 🔷  수영
    • 날다람쥐 - 🔷  비행
  • 🔴 파충류
    • 거북 - 🔷  수영
    • 날도마뱀 - 🔷  사냥, 🔷  수영, 🔷  비행
  • 🔴 조류
    • 독수리 - 🔷  사냥, 🔷  비행
    • 펭귄 - 🔷  사냥, 🔷  수영

추상 클래스는 계열에 관한 것 (상위개념에서 하위개념으로 종속, 족보같은 개념이라 생각하면 됨)

인터페이스는 자격증 같은거라 생각

반드시 ~ 을 구현해야 한다!
예를 들면, 바리스타 자격증을 가지고 있으면 당연히 커피를 만들 수 있어야 함!

자바에서 인터페이스는 여러가지 역할로 사용

개발자 사이의 코드 규약을 정한다.
여러 구현체에서 공통적인 부분을 추상화한다.(다형성)

먼저 자바에서 인터페이스의 기본 개념을 알아보자.
자바 인터페이스는 기본적으로 추상메서드의 모음이다. 추상메서드는 아래와 같이 구현부가 없는 메서드를 말한다.

public interface Walkable {
  void walk();
}

구현부가 없으므로 인터페이스를 만든다면 반드시 구현하는 클래스를 만들어야 하며, 인터페이스를 구현하기로 한 클래스는 반드시 인터페이스에 명시되어 있는 추상메서드들을 모두 구현해야 한다. 만약 이를 구현하지 않으면 컴파일 에러가 발생한다.

public class Dog implements Walkable {
  // ...
  @Override
  public void walk() {
    // ...
  }
}

인터페이스는 구현과 상속을 모두 할 수 있다.

인터페이스를 사용하는 구체 클래스는 해당 인터페이스를 구현해야한다.
인터페이스 사이에는 상속을 할 수 있다.
인터페이스를 사용하면 다중 상속이 가능하다. 인터페이스 사이에서도, 구체 클래스에서도 여러 인터페이스를 구현 및 상속할 수 있다.

public interface Walkable {
  void walk();
}
public interface Flyable {
  void fly();
}
public interface Moveable extends Walkable, Flyable {
}

이를 구현한다면 다음과 같이 할 수 있다.

public class Bat implements Moveable {
  @Override
  public void walk() {
    // ...
  }
  @Override
  public void fly() {
    // ...
  }
}

인터페이스를 만들면서 접근제어자를 생략했는데 인터페이스는 클래스와 달리 기본 접근제어자는 public

인터페이스에 필드 변수를 선언하면 public static final 로 선언해야 하며 이 역시 생략하면 기본으로 설정되어 있다.

메서드를 private 로 설정하면 실제 구현체를 인터페이스 내에 구현해야 한다.(물론 이를 밖에서 사용할 수 없으므로 직접적으로 사용하는 곳은 적을 것으로 생각된다.)

💡 default 로 구상 메소드를 넣을 수 있도록 한 이유

  • 사용되던 인터페이스에 새로운 기능을 추가해야 한다면?
    • 새로운 자바 버전의 라이브러리 인터페이스에 새 기능이 추가되어야 한다면?
    • 이를 적용하여 사용하던 클래스가 매우 많을 경우…
  • 해당 인터페이스의 하위 클래스들을 일일이 수정하지 않아도 되도록
    • 하위호환성

즉, extends는 클래스를 확장하는 거고 implements는 인터페이스를 구현하는 것이다.
인터페이스와 보통 클래스의 차이는 인터페이스는 정의한 메소드를 구현하지 않아도 된다.
인터페이스를 상속받는 클래스에서 인터페이스에 정의된 메소드를 구현하면 된다.

profile
JAVA / SQL / Spring 을 공부하고 있습니다 🐥

0개의 댓글