프로그래밍 언어/JAVA
[JAVA] 인터페이스 구현 (2)
김곰댕
2021. 7. 13. 15:52
728x90
익명 구현 객체
명시적인 구현 클래스 작성을 생략하고 바로 구현 객체를 얻는 방법
- 이름이 없는 구현 클래스 선언과 동시에 객체를 생성한다.
인터페이스 변수 = new 인터페이스()
{
//인터페이스에 선언된 추상 메소드의 실제 메소드 선언
};
-----------------------------------------------------------------------------
new : 객체를 생성하는 연산자
인터페이스() : {}안에서 선언된 기본 생성자를 호출
new 인터페이스(); (x)
인터페이스는 객체를 생성할 수 없음 , 인터페이스는 객체의 사용방법을 서술
인터페이스는 생성자가 없음
- 인터페이스의 추상 메소드들을 모두 재정의하는 실체 메소드가 있어야 한다.
- 추가적으로 필드와 메소드를 선언할 수 있지만 익명 객체 안에서만 사용할 수 있고, 인터페이스 변수로 접근할 수 없다.
주로 사용되는 곳
- UI 프로그래밍(Swing, Android)에서 이벤트를 처리하기 위해 주로 사용
- 임시 작업 스레드를 만들기 위해 사용
- 자바8부터 지원하는 람다식은 내부적으로 익명 구현 객체를 사용
익명 구현 객체도 클래스(바이트코드) 파일을 가지고 있다.
- 클래스$번호.class 파일명으로 생성된다.
예제)
package sec03.exam02_noname_implement_class;
import sec03.exam01_name_implement_class.RemoteControl;
public class RemoteControlExample
{
public static void main(String[] args)
{
//익명구현객체
RemoteControl rc = new RemoteControl()
{
@Override
public void turnOn() { }
@Override
public void turnOff() { }
@Override
public void setVolume(int volume) { }
};
}
}
다중 인터페이스 구현 클래스
public class 구현클래스명 implements 인터페이스 A, 인터페이스 B
{
//인터페이스 A에 선언된 추상 메소드의 실체 메소드 선언
//인터페이스 B에 선언된 추상 메소드의 실체 메소드 선언
}
예제)
package sec03.exam03_multi_implement_class;
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("건전지를 교환합니다.");
}
}
package sec03.exam03_multi_implement_class;
public interface Searchable
{
void search(String url);
}
package sec03.exam03_multi_implement_class;
public class SmartTelevision implements RemoteControl, Searchable
{
private int volume;
@Override
public void search(String url)
{
}
@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 sec03.exam03_multi_implement_class;
public class RemoteControlExample
{
public static void main(String[] args)
{
SmartTelevision tv = new SmartTelevision();
RemoteControl rc = tv; //tv객체를 인터페이스 변수에 대입
rc.turnOn();
rc.turnOff();
rc.setVolume(5);
Searchable searchable = tv; //tv객체를 인터페이스 변수에 대입
searchable.search("http://cage.mobilewebapp");
}
}
728x90