인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 함.
(동일한 목적하에 동일한 기능을 강제로 수행하게 하는 것)
개발코드가 인터페이스의 메소드 호출 -> 인터페이스는 객체의 메소드를 호출하는 방식
개발 코드가 직접 객체의 메소드를 호출하면 간단한데 중간에 인터페이스를 두는 이유
개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해서
[public] interface 인터페이스이름 { }
public을 생략하더라도 컴파일 과정에서 자동으로 붙음
public 접근 제한은 다른 패키지에서도 인터페이스를 사용할 수 있게 해줌
클래스 구성 멤버 - 필드, 생성자, 메소드
인터페이스 구성 멤버 - 상수 필드, 추상 메소드
*인터페이스는 객체를 생성할 수 없음 -> 생성자를 가질 수 없음
[public static final] 타입 상수이름 = 값;
public static final을 생략하더라도 컴파일 과정에서 자동으로 붙음
인터페이스는 객체 사용 방법을 정의한 것
-> 실행 시 데이터를 저장할 수 있는 인스턴스 또는 정적 필드 선언 불가능
but 상수 필드는 선언 가능.
인터페이스 상수는 반드시 선언과 동시에 초기값을 지정해줘야 함
[public abstract] 리턴타입 메소드이름 (매개변수, ...)
인터페이스에 선언된 모든 추상 메소드는 public abstract 특성을 가지므로 public abstract 생략 가능
인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행
그렇기 때문에 인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언
(선언부만 있는 메소드가 추상 메소드)
인터페이스를 구현하려면 객체는 인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메소드를 가지고 있어야 함
이러한 객체를 인터페이스의 구현 객체라고 하고 구현 객체를 생성하는 클래스를 구현 클래스라고 함
구현 클래스는 보통 클래스와 동일함
but, 인터페이스 타입으로 사용할 수 있음을 알리기 위해서
클래스 선언부에 implements 키워드 추가 및 인터페이스 이름 명시
public class 구현클래스이름 implements 인터페이스 이름 {
//인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}
구현 클래스에서 public을 생략하면 "Cannot reduce the visibility of the inherited method" 에러 발생
인터페이스의 모든 메소드는 기본적으로 public 접근 제한을 가지므로
public 보다 더 낮은 접근 제한으로 작성할 수 없기 때문
객체는 다수의 인터페이스 타입으로도 사용 가능함
but 두 인터페이스를 모두 구현해야 함
public class 구현클래스이름 implements 인터페이스A, 인터페이스B {
//인터페이스 A에 선언된 추상 메소드의 실체 메소드 선언
//인터페이스 B에 선언된 추상 메소드의 실체 메소드 선언
}
클래스 선언 시, 인터페이스는 필드, 생성자 또는 메소드의 매개 변수, 생성자 또는 메소드의 로컬 변수로 선언될 수 있음
인터페이스가 필드 타입으로 사용 -> 필드에 구현 객체 대입 가능
인터페이스가 생성자의 매개 변수 타입으로 사용 -> new 연산자로 객체 생성시 구현 객체>를 생성자의 매개 값으로 대입 가능
인터페이스가 로컬 변수 타입으로 사용 -> 변수에 구현 객체 대입 가능
인터페이스가 메소드의 매개 변수 타입으로 사용 -> 메소드 호출시 구현 객체를 매개값으로 대입 가능
오늘은 인터페이스에 관한 내용을 정리했습니다.
사용하는 방법이 다양한만큼 활용도도 높을 것 같다는 생각이 들었습니다.
수정할 사항이나 추가해야 할 사항이 있다면 댓글이나 이메일로 연락남겨주세요.
아래는 공부하면서 실습했던 코드입니다.
interface RemoteControl {
int MAX_VOLUME = 100;
int MIN_VOLUME = 0;
void turnOn();
void turnOff();
void setVolume(int volume);
}
public class Television implements RemoteControl{
private int volume;
public void turnOn() {
System.out.println("TV를 켭니다.");
}
public void turnOff() {
System.out.println("TV를 끕니다.");
}
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);
}
}
public class Audio implements RemoteControl{
private int volume;
public void turnOn() {
System.out.println("Audio를 켭니다.");
}
public void turnOff() {
System.out.println("Audio를 끕니다.");
}
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);
}
}
public class Main {
public static void main(String[] args) throws Exception {
Audio walkMan = new Audio();
walkMan.turnOn();
walkMan.setVolume(70);
walkMan.setVolume(111);
walkMan.turnOff();
Television lgOLED = new Television();
lgOLED.turnOn();
lgOLED.setVolume(15151);
lgOLED.setVolume(44);
lgOLED.setVolume(-5);
lgOLED.turnOff();
}
Main(RemoteControl rc) {
rc.turnOn();
rc.turnOff();
}
}