Java - 인터페이스#1

이새봄·2022년 9월 3일

Java

목록 보기
5/11

이 글은 이것이 자바다를 참고하여 작성되었습니다.

인터페이스(Interface)

: 객체의 사용 방법을 정의한 타입.

  • 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 한다.

인터페이스 선언

[public] interface 인터페이스명 {
    // 상수
    타입 상수명 = 값;
    // 추상 메소드
    타입 메소드명(매개변수,...);
    //디폴트 메소드
    default 타입 메소드명(매개변수,...){...}
    //정적 메소드
    static 타입 메소드명(매개변수,...){...}
}
  • 상수와 메소드만을 구성 멤버로 가진다.
  • 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.

상수 필드 선언

상수 : public static final이 자동으로 붙는다.
[public static final] 타입 상수명 = 값;

  • static {} 블록으로 초기화할 수 없기 때문에 반드시 선언과 동시에 초기값을 지정해야 한다.

추상 메소드 선언

인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행되기 때문에 인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언한다.

  • 추상 메소드 : 리턴 타입, 메소드명, 매개변수만 기술되고 중괄호 {}를 붙이지 않는 메소드.
  • 인터페이스에 선언된 추상 메소드는 모두 public abstract의 특성을 갖기 때문에 자동적으로 붙는다.
    [public abstract] 리턴타입 메소드명(매개변수,...);

디폴트 메소드 선언

디폴트 메소드는 public 특성을 갖기 때문에 public을 생략하더라도 자동적으로 붙는다.
[public] default 리턴타입 메소드명(매개변수,...){...}

정적 메소드 선언

정적 메소드는 public 특성을 갖기 때문에 public을 생략하더라도 자동적으로 붙는다.
[public] static 리턴타입 메소드명(매개변수,...){...}

인터페이스 구현

구현 클래스

구현 클래스와 실행 클래스는 다르다.

public class 구현클래스명 implements 인터페이스명 {
    // 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}
  • 인터페이스의 모든 메소드는 기본적으로 public 접근 제한을 갖기 때문에 더 낮은 접근 제한으로 작성할 수 없다.
  • 인터페이스에 선언된 추상 메소드에 대응하는 실체 메소드를 구현 클래스가 작성하지 않으면 구현 클래스는 자동적으로 추상 클래스가 된다. 그렇기 때문에 클래스 선언부에 abstract 키워드를 추가해야 한다.
  • 구현 클래스가 작성되면 new 연산자로 객체를 생성할 수 있다.
  • 인터페이스 변수를 선언하고 구현 객체를 대입해야 한다. 인터페이스 변수는 참조 타입이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지를 저장한다.
    인터페이스 변수;
    변수 = 구현객체;
    or
    인터페이스 변수 = 구현객체;

익명 구현 객체

: 일회성의 구현 객체를 만들기 위해 사용하는 방법.

  • 하나의 실행문이므로 끝에는 세미콜론(;)을 반드시 붙여야 한다.
인터페이스 변수 = new 인터페이스() {
    // 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}
  • 중괄호 {} 에는 인터페이스에 선언된 모든 추상 메소드들의 실체 메소드를 작성해야 한다.
  • 추가적으로 필드와 메소드를 선언할 수 있지만 익명 객체 안에서만 사용할 수 있고 인터페이스 변수로 접근할 수 없다.
  • 모든 객체는 클래스로부터 생성되기 때문에 컴파일하면 자동으로 클래스 파일이 만들어진다.

다중 인터페이스 구현 클래스

  • 객체는 다수의 인터페이스 타입으로 사용할 수 있다.
public class 구현클래스명 implements 인터페이스A, 인터페이스B {
    // 인터페이스A에 선언된 추상 메소드의 실체 메소드 선언
    // 인터페이스B에 선언된 추상 메소드의 실체 메소드 선언
}
  • 다중 인터페이스를 구현할 경우 구현 클래스는 모든 인터페이스의 추상 메소드에 대해 실체 메소드를 작성해야 한다. 하나라도 없으면 추상 클래스로 선언해야 한다.

인터페이스 사용

인터페이스 변수;
변수 = 구현객체;
or
인터페이스 변수 = 구현객체;
ex) RemoteControl 인터페이스로 구현 객체인 Television과 Audio를 사용하려면 RemoteControl 타입 변수 rc를 선언하고 구현 객체를 대입해야 한다. (아마도 Television과 Audio는 RemoteControl의 구현 클래스.)

RemoteControl rc;
rc = new Television();
rc = new Audio();
  • 개발 코드에서 인터페이스는 클래스의 필드, 생성자 또는 메소드의 매개 변수, 생성자 또는 메소드의 로컬 변수로 선언될 수 있다.

추상 메소드 사용

구현 객체가 인터페이스 타입에 대입되면 인터페이스에 선언된 추상 메소드를 개발 코드에서 호출할 수 있게 된다.

RemoteControl rc = new Television();
rc.turnOn();

디폴트 메소드 사용

디폴트 메소드는 인터페이스에 선언되지만 인터페이스에서 바로 사용할 수 없다. 추상 메소드가 아닌 인스턴스 메소드이므로 구현 객체가 있어야 사용할 수 있다.
RemoteControl.setMute(true); // (X)

RemoteControl rc = new Television();
rc.turnOn();
  • 디폴트 메소드는 인터페이스의 모든 구현 객체가 가지고 있는 기본 메소드라고 생각하면 된다. 하지만 수정이 필요할 경우, 구현 클래스를 작성할 때 디폴트 메소드를 재정의(오버라이드)해서 수정하면 / 디폴트 메소드가 호출될 때 자신을 재정의한 메소드가 호출된다. 어떤 객체가 인터페이스에 대입되느냐에 따라 메소드 실행 결과는 달라진다.

정적 메소드 사용

정적 메소드는 인터페이스로 바로 호출이 가능하다.
인터페이스명.정적메소드명();

0개의 댓글