22. 인터페이스

Lee kyu min·2024년 2월 1일

Java study

목록 보기
20/41

인터페이스

  • 서로 다른 두 객체를 연결하는 역할을 한다.
  • 변수를 포함할 수 있으나 선언하지 않는 것이 좋다.
  • 인터페이스도 참조 타입에 속하므로 변수의 타입으로 사용할 수 있다.

(상수명은 대문자로 작성, 서로 다른단어로 구성되어있는경우 _로 연결한다. ex-> GREEN_APPLE)

1. 선언

  • interface 키워드를 사용하여 선언
  • 인터페이스 내부 모든 메서드는 추상 메서드이다.
접근제한자[public, default] interface 인터페이스명 {
	//접근제한자 상수 필드
    //접근제한자 추상 메서드
    //접근제한자 디폴트 메서드
    //접근제한자 정적 메서드
    //접근제한자 메서드
    //접근제한자 정적 메서드
}
  • 인터페이스에 선언된 상수 필드는 모두 public static final 특성을 가져 이를 생략하더라도 컴파일 과정에서 자동적으로 붙게 된다.
타입 상수명 = 값;
  • 인터페이스에 선언된 추상메서드는 public abstract를 생력하더라도 컴파일 과정에서 자동으로 붙게 된다
리턴타입 메서드명(매개변수, ...);

2. 구현(implement)

  • 인터페이스를 구현한 객체는 다음과 같이 인터페이스를 구현하고 있음을 선언부에 명시해야 한다.
  • 구현 객체는 여러 인터페이스를 구현할 수 있다.
접근제한자 class 구현클래스명 implements 인터페이스A, 인터페이스B, ... {
	//모든 추상 메서드 재정의
}
  • implements 키워드 - 해당 클래스가 인터페이스를 통해 사용할 수 있다는 표시
    (인터페이스의 추상 메서드를 재정의한 메서드가 있다는 뜻)
  • 인터페이스의 추상메서드는 기본적으로 public 접근 권한을 갖기에 구현 클래스에서 public보다 더 낮은 접근 제한으로 재정의 할 수 없다.

1). 구현 객체 사용

  • 인터페이스 변수는 참조 타입이기 때문에 구현 객체 사용 시 인터페이스 변수를 사용하고 구현 객체를 대입해야 한다.
인터페이스명 변수명 = new 구현클래스명();

3. 디폴트 메서드

  • 추상메서드는 실행부 {}가 없지만 디폴트 메서드는 실행부가 있다. 인터페이스는 이 디폴트 메서드 선언이 가능하다.

1). 선언 방법

default 리턴타입 메서드명(매개변수, ...) {...}
  • 클래스 메서드와 동일하나 default 키워드가 리턴 타입 앞에 붙는다
  • 디폴트 메서드의 실행부엔 상수 필드를 읽거나 추상 메서드를 호출하는 코드를 작성할 수 있다.
  • 디폴트 메서드는 구현 객체가 필요한 메서드다.
    (호출 시 구현 객체를 인터페이스 변수에 대입하고서 디폴트 메서드를 호출해야 한다.)
  • 구현 클래스는 디폴트 메서드를 재정의해서 사용할 수 있다.(재정의 시 반드시 public을 붙여야 한다.)

4. 정적 메서드

  • 추상 메서드, 디폴트 메서드는 구현 객체가 필요하지만 정적 메서드는 필요없다.
    (인터페이스는 정적 메서드도 선언이 가능하다.)

1). 선언 방법

  • 클래스 정적 메서드와 동일하다.
[public, private] static 리턴타입 메서드명(매개변수, ...) {...}
  • 정적메서드는 구현 객체가 필요한 인스턴스 메서드이기에 실행부 {} 내에는 상수 필드를 제외한 추상 메서드, 디폴트 메서드, private 메서드 등을 호출할 수 없다.

5. 상속

  • 인터페이스도 다른 인터페이스를 상속할 수 있다.
    (인터페이스간 상속에는 extends를 사용한다.)
  • 클래스와 달리 다중 상속이 가능하다
public interface 자식인터페이스 extends 부모인터페이스1, 부모인터페이스2 {...}
  • 자식 인터페이스의 구현 클래스는 자식 인터페이스 + 부모 인터페이스의 모든 추상메서드를 재정의 해야 한다.
  • 구현 객체는 자식, 및 부모 인터페이스 변수에 대입 가능하다.
    (자식 인터페이스 변수에 ㅍ대입되면 자식 및 부모 인터페이스의 추상 메서드 모두 호출 가능하지만, 부모 인터페이스 변수에 대입되면 부모 인터페이스에 선언도니 추상 메서드만 호출 가능)

5. 타입변환

  • 인터페이스 타입 변환은 인터페이스와 구현 클래스간에 발생한다.

1). 자동 타입 변환

  • 인터페이스 변수에 구현 객체 대입시 구현 객체는 인터페이스 타입으로 자동 변환된다.
인터페이스 변수 = 구현객체;

2). 강제 타입 변환

  • 인터페이스 타입을 구현 클래스 타입으로 변환시 사용
구현클래스 변수 = (구현클래스) 인터페이스변수;

6. 다형성

  • 인터페이스 또한 상속과 마찬가지로 다형성을 구현한다.
  • 인터페이스의 추상 메서드는 구현 클래스에서 재정의 해야하며 재정의 내용은 구현 클래스마다 다르다.
  • 상속에서 매개변수 타입을 부모 타입으로 선언하고 호출 시 자식 객체를 대입 한 것 처럼
    매개변수 타입을 인터페이스로 선언하면 메서드 호출 시 다양한 구현 객체를 대입할 수 있다.

7. 객체 타입 확인

  • 상속과 마찬가지로 인터페이스도 instanceof 연산자로 객체 타입 확인이 가능하다.
if ( A instanceof B) {
	인터페이스 변수A에 대입된 객체가 B일 경우 실행하는 코드
}

0개의 댓글