프로그래밍 언어/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