이 글은 이것이 자바다를 참고하여 작성되었습니다.
: 객체의 사용 방법을 정의한 타입.
- 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 한다.
[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();
- 디폴트 메소드는 인터페이스의 모든 구현 객체가 가지고 있는 기본 메소드라고 생각하면 된다. 하지만 수정이 필요할 경우, 구현 클래스를 작성할 때 디폴트 메소드를 재정의(오버라이드)해서 수정하면 / 디폴트 메소드가 호출될 때 자신을 재정의한 메소드가 호출된다. 어떤 객체가 인터페이스에 대입되느냐에 따라 메소드 실행 결과는 달라진다.
정적 메소드는 인터페이스로 바로 호출이 가능하다.
인터페이스명.정적메소드명();