인터페이스
인터페이스의 역할
객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다.
public interface RemoteControl { //인터페이스
int MAX_VOLUME = 10; //상수(public static final 생략 가능)
void turnOn(); //추상 메소드(public abstract 생략 가능)
default void setMute() {...} //디폴트 메소드(public 생략 가능)
static void changeBattery() {...} //정적 메소드(public 생략 가능)
}
상수 필드 선언
1. 인터페이스는 상수 필드만 선언 가능 - 데이터를 저장하지 않는다.
2. 인터페이스에 선언된 필드는 모두 public static final
- 생략하더라도 자동적으로 컴파일 과정에서 붙는다.
3. 상수명은 대문자로 작성한다. - 서로 다른 단어로 구성되어 있을 경우에는 언더바로 연결한다.
4. 선언과 동시에 초기값을 지정한다.
package sec02.exam02_constant_field;
public interface RemoteControl {
int MAX_VOLUME = 10;
int MIN_VOLUME = 0;
}
추상 메소드 선언
인터페이스를 통해서 호출된 메소드는 최종적으로 객체에서 실행된다.
- 인터페이스의 메소드는 기본적으로 실행 블록이 없는 추상 메소드로 선언한다.
- public abstract를 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
//추상 메소드 : 인터페이스를 구현한 구현 클래스를 만들게 꼭 구현(재정의) 해야 한다.
abstract void turnOn(); //abstract 생략 가능.
void turnOff();
void setVolume(int volume);
디폴트 메소드 선언
자바8에서 추가된 인터페이스의 새로운 멤버
실행 블록을 가지고 있는 메소드
default 키워드를 반드시 붙여야 한다.
기본적으로 public 접근 제한
- 생략하더라도 컴파일 과정에서 자동으로 붙는다.
//디폴트 메소드
default void setMute(boolean mute) {
//default 접근제어자는 생략 불가능.
//default 접근제어자를 생략할 경우 추상 메소드로 인식한다.(중괄호 작성 시 에러)
if(mute)System.out.println("무음 처리합니다.");
else System.out.println("무음 해제합니다.");
}
정적 메소드 선언
자바 8버전에서 추가된 인터페이스의 새로운 멤버이다.
//정적 메소드
static void changeBattery() {
//static 접근제어자 필수로 작성해야 한다.
//자바 8 버전부터 사용 가능한 메소드
System.out.println("건전지를 교환합니다.");
}
인터페이스를 상속받는 클래스
package src.com.kh.interface_;
public class Television implements RemoteControl{
//필드
private int volume;
@Override
public void turnOn() {
System.out.println("TV를 켭니다.");
}
@Override
public void turnOff() {
System.out.println("TV를 끕니다.");
}
@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("현재 TV 볼륨 : "+volume);
}
}
클래스 사용 예제
package src.com.kh.interface_;
public class RemoteControlExample {
//필드 (멤버변수), 전역 변수
static int num = 1;
public static void main(String[] args) {
RemoteControl rc = new Television();//자동형변환, 인터페이스<-구현객체
rc.turnOn();
rc = new Audio();
rc.turnOn();
RemoteControl rc2 = new Audio();
rc2.turnOn();
}
}
익명 구현 객체
소스 파일을 생성하지 않고도 구현 객체를 만들 수 있는 방법이다. 작성 시 주의할 점은 하나의 실행문이므로 끝에는 세미콜론을 반드시 붙여야 한다.
사용 목적은 단 한번만 객체를 생성하면 되는 경우에 주로 사용한다.
package src.com.kh.interface_;
public class 익명_구현_객체 {
public static void main(String[] args) {
RemoteControl rc = new RemoteControl() {
@Override
public void turnOn() {
System.out.println("익명 구현 객체1의 turnOn() 실행");
}
@Override
public void turnOff() {
}
@Override
public void setVolume(int volume) {
}
};
rc.turnOn();
rc = new RemoteControl() {
@Override
public void turnOn() {
System.out.println("익명 구현 객체2의 turnOn() 실행");
}
@Override
public void turnOff() {
}
@Override
public void setVolume(int volume) {
}
};
rc.turnOn();
}
}
다중 인터페이스 구현 클래스
상속을 두개 이상의 인터페이스로부터 받아 사용이 가능하다.
package src.com.kh.multiextendsinterface;
public class SmartTelevision implements RemoteControl, Searchable {
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 볼륨: " + volume);
}
public void search(String url) {//Searchable로부터 상속받은 추상 메소드
System.out.println(url +" 주소.");
}
}
인터페이스 사용
개발 코드에서 인터페이스는 클래스의 필드, 생성자 또는 메소드의 매개 변수, 생성자 또는 메소드의 로컬 변수로 선언될 수 있다.
// 기본형
인터페이스 변수;
변수 = 구현객체;
인터페이스 변수 = 구현객체;
// 인터페이스 사용의 예
public class MyClass {
RemoteControl rc = new Television(); //필드. rc 인터페이스 타입의 Television객체 생성
MyClass(RemoteControl rc) { // 생성자, MyClass mc = new MyClass(new Television());
this.rc = rc;
}
void methodA(){//메소드
RemoteControl rc = new Audio(); //로컬 변수
}
void methodB(RemoteControl rc){...} //매개 변수, mc.methodB(new Audio());
}
디폴트 메소드 사용
인터페이스만으로는 사용 불가
- 구현 객체가 인터페이스에 대입되어야 호출할 수 있는 인스턴스 메소드
모든 구현 객체가 가지고 있는 기본 메소드로 사용
- 필요에 따라 구현 클래스가 디폴트 메소드를 재정의해 사용한다.
package src.com.kh.default_method;
public class RemoteControlExample {
public static void main(String[] args) {
//익명 구현 객체
RemoteControl rc = new RemoteControl() {
@Override
public void turnOn() {
System.out.println("추상 메소드 turnon 실행");
}
@Override
public void turnOff() {
// TODO Auto-generated method stub
}
@Override
public void setVolume(int volume) {
// TODO Auto-generated method stub
}
};
rc.turnOn();//추상 메소드 turnon 실행
rc = new Television();
rc.turnOn();//추상 메소드가 아닌 TV의 turnon 실행
rc.setMute(true);//Television에는 setMute가 구현되어 있지 않으므로 디폴트 메소드로 실행이 된다.
rc = new Audio();
rc.turnOn();//추상 메소드가 아닌 Audio의 turnon 실행 -> Audio 킴
rc.setMute(true);//Television과 달리 setMute가 구현되어 있으므로 디폴트 메소드가 아닌 Audio 클래스에 존재하는 setMute가 실행이 된다.
//RemoteControl.changeBattery();
}
}
실행 결과
추상 메소드 turnon 실행
TV켬.
디폴트 메소드로 소리끔.
Audio 킴.
Audio 소리끔.
정적 메소드 사용
메인 함수에서 인터페이스로 바로 호출 가능. 대신 구현부에서 static 접근 제어자를 필수로 사용해 주어야 한다.
RemoteControl.changeBattery();
++추가++
추상 클래스와 인터페이스를 모두 상속 받는 경우에는 추상 클래스를 먼저 상속 받고, 그 다음 인터페이스를 상속 받아야 한다.
abstract class A{}
interface B{}
class S extends A implements B{}
디폴트 메소드와 인터페이스 확장
디폴트 메소드의 필요성
기존 인터페이스를 확장해서 새로운 기능을 추가하기 위해 사용한다.
새로운 추상 메소드를 추가하지 않고 디폴트 메소드를 선언하여 사용할 수 있기 때문이다.
디폴트 메소드가 있는 인터페이스 상속
자식 인터페이스에서 디폴트 메소드를 활용하는 방법은 다음 세 가지가 있다.
1. 디폴트 메소드를 단순히 상속만 받는다.
2. 디폴트 메소드를 재정의해서 실행 내용을 변경한다.
3. 디폴트 메소드를 추상 메소드로 재선언한다.
추상 클래스와 인터페이스의 차이점
차이점은 게시물을 따로 두어 다시 정리하였다.(다음 게시물)
구분 | 추상 클래스 | 인터페이스 |
1. 목적 | 상속을 통해 기능 이용/확장시키며, 특히 자식객체 간에 공통된 이름(필드, 메소드)으로 통일화시킨다. | 구현 객체의 동일한 사용법을 보장하므로, 객체의 교환성을 높여 다형성을 구현한다. |
2. 구성멤버 | 필드, 생성자, 추상메소드, 일반메소드 | 상수, 추상메소드, 디폴트메소드, 정적메소드 |
3. 객체 생성/ 구현 방법 | extends로 상속받아 자식 객체를 생성한다. | implements로 구현 객체를 생성한다. |
4. Override/Implement 대상 | 추상 메소드만 재정의하면 된다. | 추상 메소드는 반드시 재정의되어야 하고, 디폴트 메소드는 선택 사항이다. |
5. 다중상속 | 허용하지 않는다. | 허용한다. |
'교육 | 외부활동 > 이론_JAVA' 카테고리의 다른 글
KH_JAVA_13_예외처리 (0) | 2022.11.21 |
---|---|
KH_JAVA_12_중첩 클래스와 중첩 인터페이스 (0) | 2022.11.21 |
KH자바수업_10_추상 클래스 (2) | 2022.11.17 |
KH자바수업_9_다형성 (0) | 2022.11.14 |
KH자바수업_8_상속 (0) | 2022.11.14 |