자바

JAVA 자바 인터페이스 구현 클래스

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


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

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

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

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

 

인터페이스 구현

 개발 코드가 인터페이스의 메서드를 호출하면 인터페이스는 객체의 메서드를 호출합니다. 

인터페이스의 구현 객체 : 인터페이스에서 정의된 추상 메서드와 동일한 메서드 이름, 매개 타입, 리턴  타입을 가진 실체 메서드를 가지고 있어야 합니다. 

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



구현 클래스

 클래스 선언부에 implements 키워드를 추가하고 그뒤에 인터페이스명을 명시해야 합니다.

ex) public class 구현클래스명 implements 인터페이스명 {

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

}

예제를 보겠습니다.

아래 예제는  Television 과 Audio 라는 이름을 가진 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("건전지를 교환합니다.");

}

}



구현 클래스1

public class Television implements RemoteControl {

//필드

private int volume;

//turnOn() 추상 메소드의 실체 메소드

public void turnOn() {

System.out.println("TV를 켭니다.");

}

//turnOff() 추상 메소드의 실체 메소드

public void turnOff() {

System.out.println("TV를 끕니다.");

}

//setVolume() 추상 메소드의 실체 메소드

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

}

}


구현 클래스2

public class Audio implements RemoteControl {

//필드

private int volume;

//turnOn() 추상 메소드의 실체 메소드

public void turnOn() {

System.out.println("Audio를 켭니다.");

}

//turnOff() 추상 메소드의 실체 메소드

public void turnOff() {

System.out.println("Audio를 끕니다.");

}

//setVolume() 추상 메소드의 실체 메소드

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("현재 Audio 볼륨: " + volume);

}

}


RemoteControl 인터페이스는 3개의 추상 메서드를 가지고 있기 때문에 Television 과 Audio 구현 클래스는 이 3개의 추상 메서드에 대한 실체 메서드를 가져야 합니다.

주의할 점 : 인터페이스의 모든 메서드는 기본적으로 public 접근 제한을 갖기 때문에 public 보다 낮은 접근 제한으로 작성할 수 없습니다. 
 만약에 인터페이스에 선언된 추상 메서드에 대응하는 실체 메서드를 구현 클래스가 작성하지 않으면 구현 클래스는 자동적으로 추상 클래스가 됩니다. 그렇기 때문에 클래스 선언부에 abstract 키워드를 추가해야 합니다.
ex) public abstract class Television implements RemoteControl {
       public void turnOn() { ... } // setVolume() 실체 메서드가 없습니다.
       public void turnOff() { ... }     (일부만 구현한 것 입니다.)

-------------------------------------------------------------------------------------------------------------------------
* 이클립스는 인터페이스의 추상 메서드에 대한 실체 메서드를 자동으로 생성해주는 기능을 제공합니다. 
코드 창에서 인터페이스를 implements 한 후에 
이클립스 메뉴에서 Source -> Override/Implement Methods ... 을 선택하고 
추상 메서드들을 체크한 후에 Ok 버튼을 클릭하면 실체 메서드들이 자동으로 생성됩니다. 
자동으로 생성된 실체 메서드는 @Override 가 붙는데
@Override 는 인터페이스의 추상 메서드에 대한 정확한 실체 메서드인지 
컴파일러가 체크하도록 지시하는 어노테이션입니다. 
생략해도 상관은 없지만 잘못된 실체 메서드가 생기지 않도록 해주기 때문에 붙여주는 것이 좋습니다.

구현 클래스가 작성되면 new 연산자로 객체를 생성할 수 있습니다. 
문제는 어떤 타입의 변수에 대입하느냐 하는 것입니다. 

인터페이스로 구현 객체를 사용하려면 아래와 같이 하여야 합니다.
인터페이스 변수;             또는       인터페이스 변수 = 구현 객체;
변수 = 구현 객체;

사용 예제로 보겠습니다.
public class RemoteControlExample {
public static void main(String[] args) {
RemoteControl rc;
rc = new Television();
rc = new Audio();
}
}


반응형