자바

JAVA 자바 인터페이스 구현 익명 구현 객체와 다중 인터페이스 구현 클래스

알통몬_ 2017. 3. 13. 10:13
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

익명 구현 객체

 구현 클래스를 만들어 사용하는 것이 일반적이고, 클래스를 재사용할 수 있기 때문에 편리하지만, 

일회성의 구현 객체를 만들기 위해 소스 파일을 만들고 클래스를 선언하는 것은 비효율적입니다.

자바는 따로 소스파일을 만들지 않고 구현 객체를 만들 수 있는 방법을 제공하는데 바로 익명 구현 객체입니다. 자바는 UI  프로그래밍에서 이벤트를 처리하기 위해 그리고 임시 작업 스레드를 만드기 위해 익명 구현 객체를 많이 사용하며 자바 8에서 지원하는 람다식은 인터페이스의 익명 구현 객체를 만들기 때문에 익명 구현 객체의 코드 패턴을 잘 익혀두어야 합니다.

아래 코드는 익명 구현 객체를 생성해서 인터페이스 변수에 대입하는 코드입니다. 

작성 시 하나 주의할 점은 하나의 실행문이기 때문에 끝에 ;세미콜론을 반드시 붙여야 합니다.

인터페이스 변수 = new 인터페이스() {

    //인터페이스에 선언된 추상 메서드의 실체 메서드 선언

};


인터페이스() {}는 인터페이스를 구현해서 중괄호와 같이 클래스를 선언하라는 뜻이고,

new 연산자는 이렇게 선언된 클래스를 객체로 생성합니다. 

중괄호{}에는 반드시 인터페이스에 선언된 추상 메서드들의 실체 메서드를 선언해야 합니다.

필드와 메서드르 선언할 수 있지만 익명 객체 안에서만 사용할 수 있고 인터페이스 변수로 접근할 수 없습니다. 


ex)

인터페이스

public interface RemoteControl {

//상수

int MAX_VOLUME = 10;

int MIN_VOLUME = 0;

//추상 메소드

void turnOn();

void turnOff();

void setVolume(int volume);

//디폴트 메소드

default void setMute(boolean mute) {

if(mute) {

System.out.println("무음 처리합니다.");

} else {

System.out.println("무음 해제합니다.");

}

}

//정적 메소드

static void changeBattery() {

System.out.println("건전지를 교환합니다.");

}

}


익명 구현 클래스

public class RemoteControlExample {

public static void main(String[] args) {

RemoteControl rc = new RemoteControl() {

public void turnOn() { /*실행문*/ }

public void turnOff() { /*실행문*/ }

public void setVolume(int volume) { /*실행문*/ }

};

}

}



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

 객체는 다수의 인터페이스를 사용할 수 있습니다.




public class 구현클래스명 implements 인터페이스A, 인터페이스B {

 // 인터페이스 A 에 선언된 추상 메서드의 실체 메서드 선언

 // 인터페이스 B 에 선언된 추상 메서드의 실체 메서드 선언

}

다중 인터페이스를 구현할 경우 구현 클래스는 모든 인터페이스의 추상 메서드에 대해 실체 메서드르 생성해야 합니다. 만약  하나라도 없으면 추상 클래스로 선언해야 합니다.


예제

RemoteControl 인터페이스

public interface RemoteControl {

//상수

int MAX_VOLUME = 10;

int MIN_VOLUME = 0;

//추상 메소드

void turnOn();

void turnOff();

void setVolume(int volume);

//디폴트 메소드

default void setMute(boolean mute) {

if(mute) {

System.out.println("무음 처리합니다.");

} else {

System.out.println("무음 해제합니다.");

}

}

//정적 메소드

static void changeBattery() {

System.out.println("건전지를 교환합니다.");

}

}


Searchable 인터페이스

public interface Searchable {

void search(String url);

}


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

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) {

System.out.println(url + "을 검색합니다.");

}

}


실행 클래스

public class RemoteControlExample {

public static void main(String[] args) {

SmartTelevision tv = new SmartTelevision();

RemoteControl rc = tv;

Searchable searchable = tv;

}

}

반응형