07
12
728x90

구현 객체와 구현 클래스

인터페이스의 추상 메소드에 대한 실체 메소드를 가진 객체 = 구현 객체

구현 객체를 생성하는 클래스 = 구현 클래스

 

구현 클래스 선언

자신의 객체가 인터페이스 타입으로 사용할 수 있음을 implements 키워드로 명시

public class 구현클래스명 implements 인터페이스명
{
       //인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}

 

추상 메소드의 실체 메소드를 작성하는 방법

- 메소드의 선언부가 정확히 일치해야 한다.

- 인터페이스의 모든 추상 메소드를 재정의하는 실체 메소드를 작성해야 한다.

-  추상 메소드를 일부만 재정의 할 경우, 추상 클래스로 선언해야하며 abstract 키워드가 붙어야 한다.

public abstract class Television implements RemoteControl
{
       public void turnOn() { ... }     //setVolume() 메소드가 오버라이딩되지 않았다. (일부만 구현)
       public void turnOff() { ... }     //3개의 메소드중에 2개만 오버라이딩 되었으므로 이는 추상 클래스
}

- 인터페이스의 모든 메소드는 public 접근 제한을 갖기 때문에 public 보다 더 낮은 접근 제한으로 작성할 수 없다.

- 이클립스의 자동 생성 기능을 이용한다.

- @Override 어노테이션을 이용해서 정확히 재정의되었는지 컴파일러가 체크하도록 한다.

 

예제)

package sec03.exam01_name_implement_class;

public interface RemoteControl 
{
	//상수
	int MAX_VOLUME = 10;
	int MIN_VOLUME = 0;
	
	//추상메소드
	void turnOn();
	void TrunOff();
	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.exam01_name_implement_class;

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) //MAX_VOLUME보다 값을 높여도
		{
			this.volume = RemoteControl.MAX_VOLUME;  //최대인 MAX_VOLUME으로 저장
		}
		else if(RemoteControl.MIN_VOLUME > volume) //MIN_VOLUME보다 값을 낮춰도
		{
			this.volume = RemoteControl.MIN_VOLUME; //최소인 MIN_VOLUME으로 저장
		}
		else
		{
			this.volume = volume;
		}
		System.out.println("현재 TV 볼륨 : " + this.volume);
	}
}
package sec03.exam01_name_implement_class;

public class Audio implements RemoteControl 
{
	private int volume;
	
	@Override
	public void turnOn() 
	{
		System.out.println("Audio를 켭니다.");
	}
	@Override
	public void turnOff() 
	{
		System.out.println("Audio를 끕니다.");
	}
	@Override
	public void setVolume(int volume) 
	{
		if(volume > RemoteControl.MAX_VOLUME) //MAX_VOLUME보다 값을 높여도
		{
			this.volume = RemoteControl.MAX_VOLUME;  //최대인 MAX_VOLUME으로 저장
		}
		else if(RemoteControl.MIN_VOLUME > volume) //MIN_VOLUME보다 값을 낮춰도
		{
			this.volume = RemoteControl.MIN_VOLUME; //최소인 MIN_VOLUME으로 저장
		}
		else
		{
			this.volume = volume;
		}
		System.out.println("현재 TV 볼륨 : " + this.volume);
	}
}

 

인터페이스 변수와 구현 객체

인터페이스를 사용하지 않은 경우

Television tv = new Television();

인터페이스를 사용한 경우

인터페이스 변수 = 구현객체;
인터페이스 변수;
변수 = 구현객체;

 

예제)

package sec03.exam01_name_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.exam01_name_implement_class;

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) //MAX_VOLUME보다 값을 높여도
		{
			this.volume = RemoteControl.MAX_VOLUME;  //최대인 MAX_VOLUME으로 저장
		}
		else if(RemoteControl.MIN_VOLUME > volume) //MIN_VOLUME보다 값을 낮춰도
		{
			this.volume = RemoteControl.MIN_VOLUME; //최소인 MIN_VOLUME으로 저장
		}
		else
		{
			this.volume = volume;
		}
		System.out.println("현재 TV 볼륨 : " + this.volume);
	}
}
package sec03.exam01_name_implement_class;

public class Audio implements RemoteControl 
{
	private int volume;
	
	@Override
	public void turnOn() 
	{
		System.out.println("Audio를 켭니다.");
	}
	@Override
	public void turnOff() 
	{
		System.out.println("Audio를 끕니다.");
	}
	@Override
	public void setVolume(int volume) 
	{
		if(volume > RemoteControl.MAX_VOLUME) //MAX_VOLUME보다 값을 높여도
		{
			this.volume = RemoteControl.MAX_VOLUME;  //최대인 MAX_VOLUME으로 저장
		}
		else if(RemoteControl.MIN_VOLUME > volume) //MIN_VOLUME보다 값을 낮춰도
		{
			this.volume = RemoteControl.MIN_VOLUME; //최소인 MIN_VOLUME으로 저장
		}
		else
		{
			this.volume = volume;
		}
		System.out.println("현재 TV 볼륨 : " + this.volume);
	}
}
package sec03.exam01_name_implement_class;

public class RemoteControlExample 
{
	public static void main(String[] args) 
	{
		RemoteControl rc;
		//인터페이스는 객체를 생성할 수 없음 / 인터페이스는 객체의 사용방법을 기술 / 구현 객체를 대입해야함
		// rc = new RemoteControl(); (x)
		rc = new Television();
		rc = new Audio();
		
		//인터페이스를 통해 메소드를 호출해서 사용
		rc.turnOn();
		rc.turnOff();
	}
}

출력 결과

728x90
COMMENT