본문 바로가기

Java

인터페이스3

인터페이스 사용

인터페이스를 사용할때 인터페이스의 변수를 선언 하고 구현 객체를 대입하하는 방법으로 사용한다.

예) 인터페이스 변수명;             인터페이스 변수 = new 구현객체();

변수 = new 구현객체();

예를 들어 RemoteControl 이라는 인터페이스에 

구현객체 Television과 Audio를 대입해보자

RemoteControl rc;

rc = new Television();

rc = new Audio();

이 뿐만 아니라 개발시 인터페이스는 클래스의 필드, 생성자와 메소드의 매개변수, 생성자와 메소드의 로컬 변수로 사용이 가능하다. 

public class MyClass{

// 필드

RemoteControl rc = new Television();


//생성자

MyClass(RemoteControl rc){                <<-  main에서 MyClass mc = new MyClass(new Television()); 

this.rc = rc;                                        어떤 구현 객체든 올 수 있다.

}


//메소드

void methodA(){

//로컬 변수

RemoteControl rc = new Audio();

}


void methodB(RemoteControl rc){             <<- main에서 mc.methodB(new Audio());

}

}

위의 어떤 구현 객체 든 올 수 있다는 말은 지금은 기억 안나 지만 예전에 상속에 대해 배울때 클래스 타입이 매개변수로 온다면 

그 클래스를 상속받은 자식 클래스도 사용할 수 있다고 했다.

이와 같이 참조 타입인 인터페이스를 매개 변수로 쓴다면 여기에 어떠한 구현객체든 들어올수 있다. 

결국 모양은 RemoteControl rc = new 구현객체(); 가 되기 때문이다.


추상메소드의 사용

구현 객체가 인터페이스 타입에 대입되면 인터페이스에 선언된 추상 메소드를 코드에서 호출할 수 있게 된다. 이 추상 메소드를 호출 하면 구현객체의 추상메소드를 구현화한 메소드가 자동으로 호출된다. 

예를 들어  RemoteControl 이라는 인터페이스에 추상메소드 turnOn();, turnOFF() 가 있다. 그리고 구현 객체에서 구현해 대입했다면 

개발 코드에서 이 추상 메소드를 호출했을때 자동으로 구현객체에 있는 구현된 turnOn();와 turnOFF();메소드가 호출된다.

RemoteControl rc = new Television();

rc.turnOn(); >> Television의turnOn() 실행

rc.turnOff(); >> Television의turnOff() 실행


디폴트메소드 사용

디폴트메소드는 자바8부터 추가된 녀석이다.  인터페이스에서는 추상 메소드만 넣는 다는 규칙을 깨고 이녀석은 구현부분을 다 가지고 있다. 

선언 방법은 default void 메소드명 (){.....}<< 이런 식

인터페이스에 선언된 구현 코드를 가진 메소드니까 호출할 때는??

만약 RemoteControl 이라는 인터페이스에 setMute라는 디폴트 메소드가 있다고 하자 그렇다면 메인 클래스에서 RemoteControl.setMute();<<이걸 로 호출이 가능할까? 정답은 아.니.다.

이녀석은 추상 메소드가 아닌 인스턴스 메소드 이므로 구현 객체가 있어야 사용이 가능하다. 

그러니까 RemoteControl에 구현 클래스 Television이 있다고 하자 

그렇다면 메인에서 RemoteControl rc = new Television();<<이런 식으로 구현 객체를 대입한 뒤 

rc.setMute(....)<<이런 방법으로 사용이 가능한것.

물론 이녀석은 인터페이스에서 이미 구현이 되어 있기 때문에 굳이 구현 객체에서 따로 선언하지 않아도된다. 그냥 구현객체가 대입만 되있으면됨.

그러니까 이녀석은 RemoteControl인터페이스에 대입하는 모든 구현객체에서 호출이 가능하다. 인터페이스의 모든 구현객체가 가지고있는 기본(default)메소드 라고 생각하면 된다.

만약 어떤 구현객체에서 이녀석이 맞지 않다고 할 경우 재정의 도 가능하다. 

이런 모양으로 인터페이스에서 디폴트 메소드가 선언되어 있을때

default void setMute(boolean mute) {

if(true){

System.out.println("나는 디폴트 메소드");

}

}

구현객체 에서 재정의 한다면?? 어떤 모양이 될까>

@Override

public void setMute(boolean mute) {

...........

}

인터페이스에서 디폴트메소드를 선언할때는 default를 사용하지만 재정의 할때는 그냥 public void를 사용하면된다.


정적메소드 사용

디폴트메소드와 같이 자바8에서 나온 기능이다. 마찬가지로 인터페이스 내부에서 구현까지된다. 다른점은 디폴트 메소드의 경우 메인 메소드에서 인터페이스 타입에 구현객체를 대입해야만 사용할 수 있었지만 정적메소드는 그냥 바로 사용 할 수있다.

인터페이스 RemoteControl의 안에 정적 메소드changeBattery가 선언되있다고 하자


public interface RemoteControl {

//정적메소드

static void changeBattery() {

System.out.println("건전지를 교환합니다.");

}

}


이때 메인 메소드에서 정적 메소드를 호출 하려면??

public static void main(String[] args) {

RemoteControl.changeBattery(); 

}

이거면 된다. 

 

'Java' 카테고리의 다른 글

인터페이스 5  (2) 2019.01.29
인터페이스4  (0) 2019.01.19
인터페이스(Interface)2  (1) 2018.12.31
인터페이스 (Interface)  (0) 2018.12.29
추상클래스(abstract)  (0) 2018.12.23