프로그래밍/JAVA

[Java] 인터페이스

daykim 2023. 9. 13. 09:04
이것이 자바다(개정판) 기반 정리

 

목차

  • 인터페이스 역할
  • 인터페이스와 구현 클래스 선언
  • 상수 필드
  • 추상 메소드
  • 디폴트 메소드
  • 정적 메소드
  • private 메소드
  • 다중 인터페이스 구현
  • 인터페이스 상속
  • 타입 변환
  • 다형성
  • 객체 타입 확인
  • 봉인된 인터페이스

 

인터페이스 역할


인터페이스

  • 사전적인 의미로 두 장치를 연결하는 접속기를 말한다.
  • 자바에선, 서로 다른 두 객체를 연결하는 역할을 한다.
  인터페이스 구현 객체
객체 A - 메소드 호출 ->
<- 리턴값 -
객체 B

 

인터페이스 사용 이유

  • 만약 객체B가 객체 C로 변경된다면, 인터페이스가 없이 객체끼리 직접 사용하는 경우 객체를 변경하는 작업이 추가로 필요하다.
  • 인터페이스를 사용하면, 인터페이스 뒤편에 어떤 객체인지 신경쓸 필요가 없다.
  • 그래서 다형성 구현에 주된 기술로 이용된다.

 

 

인터페이스와 구현 클래스 선언


인터페이스 선언

interface 인터페이스명 { ... } // default 접근 제한자
public interface 인터페이스명 { ... }
  • class대신 interface 키워드를 사용한다.
  • 접근제한자로 접근 제한할 수 있다.

 

구현 클래스 선언

  • 인터페이스에 작성된 추상 메소드에 대한 실행 내용이 구현되어 있어야 한다.
  • 다음과 같이 인터페이스를 구현하고 있음을 선언부에 명시해야 한다.
  • implements : 해당 클래스가 인터페이스를 토앻 상용할 수 있다는 표시고, 인터페이스의 추상메소드를 재정의한 메소드가 있다는 뜻이다.
public class 클래스명 implements 인터페이스명 { ... }

 

변수 선언과 구현 객체 대입

  • 인터페이스도 하나의 타입이므로, 변수 타입으로 사용할 수 있다.
  • 참조 타입에 속하므로, 객체를 참조하고 있지 않다는 의미의 null을 넣을 수 있다.
interfaceName varName = new ClassName();

varName.methodName();
  • className이 inmplements interfaceName으로 선언되지 않았다면, 변수에 대입할 수 없다.
  • 인터페이스 변수에 구현 객체가 대입이 되었다면, 변수를 통해 인터페이스의 추상 메소드를 호출할 수 있게 된다.
  • 인터페이스를 구현한 객체면, 교체해서 대입할 수 있다.

 

 

상수 필드


  • 인터페이스에 선언된 필드는 모두 public static final 특성을 갖는다.
  • 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
  • 상수명은 대문자로 작성하되, 서로 다른 단어로 구성된 경우 언더바로 연결하는 것이 관례다.
  • 상수는 구현 객체와 관련 없는 인터페이스 소속이므로, 인터페이스로 바로 접근할 수 있다.
interfaceName.constName;

 

 

추상 메소드


  • 인터페이스는 public 추상 메소드를 멤버로 가질 수 있다.
  • public absctract를 생략해도, 컴파일 과정에서 자동으로 붙는다.
  • 구현 객체는 추상 메소드의 실행부를 갖는 재정의된 메소드가 있어야 한다.
  • 인터페이스의 추상 메소드는 기본적으로 public을 갖기 때문에, public보다 낮은 접근 제한으로 재정의할 수 없다.
[ public abstract ] returntype methodName(parameter, ...);

 

 

디폴트 메소드


[public] default returntype methodName(parameter, ..) {

}
  • 인터페이스엔 완전한 실행코드를 가진 디폴트 메소드를 선언할 수 있다.
  • 디폴트 메소드의 실행부엔 상수 필드를 읽거나 추상 메소드를 호출하는 코드를 작성할 수 있다.
  • 디폴트 메소드는 구현 객체를 대입하고 나서 호출할 수 있다.
  • 구현 클래스는 디폴트 메소드를 재정의할 수 있다. 이 경우 public을 반드시 붙여야 하고, default 키워드를 생략한다.

 

 

정적 메소드


[public | private] static returntype methodName(parameter, ...) {

}
  • 정적메소드는 구현 객체가 없어도 인터페이스만으로 호출할 수 있다.
  • public은 생략해도 컴파일 과정에서 자동으로 붙는다.
  • 정적 메소드의 실행부에서 추상 메소드, 디폴트 메소드, private 메소드와 같이 구현 객체가 필요한 메소드는 호출할 수 없다.

 

 

private 메소드


  • 인터페이스는 외부에서 접근 불가능한 private 메소드를 선언할 수 있다.
  • private 메소드
    • 구현 객체가 필요한 메소드
    • 디폴트 메소드 안에서만 호출이 가능하다.
  • private 정적 메소드
    • 구현 객체가 필요 없는 메소드
    • 디폴드 뿐 아니라 정적 메소드 안에서도 호출이 가능하다.
  • 디폴트와 정적 메소드들의 중복 코드를 줄이기 위해 사용한다.

 

 

다중 인터페이스 구현


  • 구현 객체는 여러 개의 인터페이스를 implements 할 수 있다.
public class className implements interface1, interface2 {

}

inferface1 varName1 = new className();
interface2 varName2 = new className();

 

 

인터페이스 상속


  • 인터페이스도 다른 인터페이스를 상속할 수 있고, 클래스와 달리 다중 상속을 허용한다.
public interface childInterface extends parentInteface1, parentInterface2 {

}
  • 자식 인터페이스의 구현 클래스는 자식 뿐 아니라 부모 인터페이스의 모든 추상 메서드를 재정의해야 한다.
  • 구현 객체가 자식 인터페이스에 대입되면, 자식과 부모의 추상 메서드를 모두 호출할 수 있다.
  • 구현 객체가 부모 인터페이스에 대입되면, 부모의 추상 메서드만 호출할 수 있다.

 

 

타입 변환


자동 타입 변환

  • 구현 객체는 인터페이스 타입으로 자동 타입 변환된다.
  • 부모 클래스가 인터페이스를 구현하고 있다면, 자식 클래스도 인터페이스 타입으로 자동 타입 변환될 수 있다.

 

강제 타입 변환

  • 반대로 인터페이스 타입을 구현 클래스로 타입 변환하기 위해선 강제 타입 변환이 필요하다.
  • 구현객체가 인터페이스 타입으로 자동 변환되면, 인터페이스에 선언된 메소드만 사용 가능하다.
  •  구현 객체에만 있는 메소드를 사용하고 싶다면, 캐스팅 기호를 사용해 구현 객체 타입으로 강제 타입 변환해야 한다.
interfaceName varName = new className();

className cVarName = (className) varName;

 

 

다형성


매개변수의 다형성

  • 매개변수 타입을 인터페이스로 선언하면, 메소드 호출 시 다양한 구현 객체를 대입할 수 있다. -> 자동 타입 변환
  • 어떤 객체를 대입하느냐에 따라 메소드 실행 결과가 다르게 나오는 것이다.

ex)

public interface Vehicle {
    void run();
}

public class Driver {
    void drive(Vehicle vehicle) {
        vehicle.run();
    }
}

Driver driver = new Driver();

Bus bus = new Bus();
Taxi taxi = new Taxi();

driver.drive(bus);
driver.drive(taxi);

 

 

객체 타입 확인


if (인스턴스이름 instanceof 구현객체이름) {

}
  • instanceof 키워드를 사용할 경우, 객체 타입을 확인할 수 있다.

 

 

봉인된 인터페이스


  • Java 15부터 무분별한 자식 인터페이스 생성을 방지하기 ㅇ위해 봉인도딘 인터페이스를 사용할 수 있다.
public sealed interface InterfaceA permits InterfaceB { ... }

'프로그래밍 > JAVA' 카테고리의 다른 글

[Java] 중첩 선언과 익명 객체  (1) 2023.10.04
[Java] 상속  (0) 2023.09.12
[Java] Static  (0) 2023.06.30
[JAVA] 클래스  (0) 2023.01.14
[JAVA] 참조 타입  (2) 2022.11.08