여러 가지 글과 책, 수업을 바탕으로 정리한 내용이니 알맞지 않은 내용이 있다면 댓글 남겨주시면 수정하겠습니다. 추가적으로 위의 책을 참고하여 글을 작성하였습니다.
인터페이스(Interface)란?
인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 말합니다.
객체들 사이에서 상호 작용할 수 있도록 하는 매개 역할입니다.
인터페이스는 하나의 규격이라 생각하면 좋습니다.
인터페이스의 특징
인터페이스는 객체를 직접 생성하지 않습니다.
필드는 상수만 갖고 있습니다.
추상 메서드를 갖고 있습니다.
static 메서드와 인스턴스 메서드도 사용할 수 있습니다.
❗단, defualt 키워드를 반드시 명시해야 합니다.❗
인터페이스는 다중 구현(implements)이 가능합니다.
인터페이스 선언 방법
인터페이스의 선언은 class 키워드 대신 interface 키워드를 사용합니다.
public interface 인터페이스 이름 {
//필드;
//메서드;
}
인터페이스는 객체를 생성할 수 없기 때문에 생성자를 가질 수 없습니다.
인터페이스에 상수 필드 선언
인터페이스는 객체 사용 방법을 정의한 것입니다.
따라서 실행 시 데이터를 저장할 수 있는 인스턴스 또는 정적 필드를 선언할 수 없습니다.
하지만 상수 필드는 선언이 가능합니다.
상수는 고정된 값이므로 실행 시에 데이터를 바꿀 수 없습니다.
상수는 public static final로 선언이 가능합니다.
인터페이스의 필드는 모두 public static final의 특성을 갖기 때문에
상수를 선언할 때 public static final을 생략해도 컴파일 과정에서 자동으로 붙게 됩니다.
public static final 타입 상수이름 = 값;
인터페이스에 추상 메서드 선언
인터페이스를 통해 호출된 메서드는 최종적으로 객체에서 실행됩니다.
따라서 인터페이스의 메서드는 실행 블록이 없는 추상 메서드로 선언해야 합니다.
인터페이스의 메서드는 public abstract의 특성을 갖고 있습니다.
따라서 public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙게 됩니다.
하지만 인스턴스 메서드를 생성하면 추상 메서드와 구분을 지기 위해서
인스턴스 메서드는 반드시 default키워드를 붙여 주어야 합니다.
public abstract 리턴타입 메서드 (매개변수 ,...);
인터페이스 구현
개발 코드가 인터페이스 메서드를 호출하면 인터페이스는 객체의 메서드를 호출하게 됩니다.
객체는 인터페이스에서 정의된 추상 메서드와 동일한 메서드 이름,매개 타입, 리턴 타입을 가진
실체 메서드를 갖고 있어야합니다.
이러한 객체를 인터페이스의 구현 객체라고 합니다.
구현 객체를 생성하는 클래스를 구현 클래스라고 합니다.
구현 클래스
구현 클래스는 클래스를 선언할 때 구현하고자 하는 인터페이스의 타입으로 사용할 수 있음을 알려주기 위해서
클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시해 주어야 합니다.
그리고 인터페이스의 추상 메서드를 모두 구현해야 합니다.
public class 구현클래스이름 implements 인터페이스이름{
//인터페이스에 선언된 추상 메서드의 실체 메서드 선언
}
인터페이스 사용해보기
ReomteControl 인터페이스
public interface RemoteControl {
//상수
public int MAX_VOLUME=10;
public int MIN_VOLUME=0;
//추상 메서드
public void turnOn();
public void turnOff();
public void setVolume(int volume);
}
RemoteControl인터페이스를 구현한 Televison 클래스
public class Televison implements RemoteControl{
private int volume;
//turnOn( )실체 메서드 구현
public void turnOn() {
System.out.println("TV를 켭니다.");
}
public int getVolume() {
return this.volume;
}
//turnOff( )실체 메서드
public void turnOff() {
System.out.println("TV를 끕니다.");
}
//setVolume( )실체 메서드
public void setVolume(int volume) {
if(volume>RemoteControl.MAX_VOLUME) {
this.volume=RemoteControl.MAX_VOLUME;
}else if(volume<RemoteControl.MIN_VOLUME) {
this.volume=RemoteControl.MIN_VOLUME;
}else {
this.volume=volume;
}
System.out.println("현재 TV볼륨"+this.volume);
}
RemoteControl 인터페이스를 구현한 Audio 클래스
public class Audio implements RemoteControl {
private int volume;
@Override
public void turnOn() {
System.out.println("Audio를 켭니다.");
}
@Override
public void turnOff() {
System.out.println("Audio를 끕니다.");
}
@Override
public void setVolume(int volume) {
if(volume>RemoteControl.MAX_VOLUME) {
this.volume=RemoteControl.MAX_VOLUME;
}else if(volume<RemoteControl.MIN_VOLUME) {
this.volume=RemoteControl.MIN_VOLUME;
}else {
this.volume=volume;
}
System.out.println("현재 Audio볼륨"+this.volume);
}
새로운 클래스 MyClass 생성 후 상황별로 구현 객체 사용해보기
1. 필드에 때
public class MyClass {
//필드
//rc필드가 Televison의 객체를 생성했다하더라도
//MyClass의 객체를 생성할 때 new연산자로 생성되는 객체에 따라
//원하는 객체 생성가능
RemoteControl rc= new Televison();
위의 코드는 인터페이스가 필드 타입으로 사용되는 경우입니다.
rc라는 변수는 RemoteControl 인터페이스의 타입이며
new 연산자로 Television 객체를 생성했습니다.
1-1. 필드로 선언된 rc 사용하기
public static void main(String[] args) {
MyClass mc= new MyClass(new Audio());
mc.rc.turnOff();
mc.rc.setVolume(5);
}
위의 코드와 같이 Televison클래스의 실체 메서드를 사용할 수 있습니다.
rc를 필드처럼 사용할 수 있으며 rc는 선언할 때 Televison클래스의 객체를 생성했기 때문에
Televison의 메서드를 사용할 수 있게 됩니다.
출력 결과
2. 클래스의 생성자에 인터페이스가 매개변수 타입으로 생성되었을 경우
public class MyClass {
RemoteControl rc; //RemoteControl 타입의 rc변수 선언
MyClass(RemoteControl rc){
this.rc=rc;
rc.setVolume(5);
rc.turnOff();
}
위의 코드는 MyClass의 생성자입니다.
매개변수를 RemoteControl타입의 변수로 받아옵니다.
따라서 MyClass를 생성할 때 매개변수로 new연산자를 통해 객체를 생성하면
생상 자안의 메서드는 생성된 객체의 메서드 내용이 실행됩니다.
2-1. Audio클래스의 객체를 MyClass의 생성자를 통해 생성해보기
public static void main(String[] args) {
MyClass mc= new MyClass(new Audio());
mc.rc.turnOff();
}