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
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA] 인터페이스 사용 (0) | 2021.07.13 |
---|---|
[JAVA] 인터페이스 구현 (2) (0) | 2021.07.13 |
[JAVA] 인터페이스 (0) | 2021.07.12 |
[JAVA] 추상 클래스(Abstract Class) (0) | 2021.07.08 |
[JAVA] 타입변환과 다형성(polymorphism) (2) (0) | 2021.07.08 |