이것이 자바다(8) 인터페이스-1

Sungmin·2023년 10월 31일
0

자바 기본 개념

목록 보기
20/21

인터페이스의 역할

자바에서 인터페이스는 객체 사용 방법을 정의한 타입이다.
개발 코드가 인터페이스의 메서드를 호출하면 인터페이스는 객체의 메서드를 호출시킨다.

개발 코드가 직접 객체의 메서드를 호출하지 않고 중간에 인터페이스를 두는 이유는
개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록
하기 위해서 이다.

결론적으로 개발 코드의 변경없이 실행 내용과 리턴값을 다양화할 수 있다.

상수 필드 선언

인터페이스는 데이터를 저장할 수 없기 때문에 데이터를 저장할 인스턴스나 정적 필드를 선언할 수 없다. 대신 상수 필드만 선언할 수 있다.

인터페이스에서 선언된 필드는 모두 public static final의 특성을 갖는다.

public interface RemoteControl {
	//상수
	public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
}

추상 메서드 선언

인터페이스에서 호출된 메서드는 최종적으로 객체에서 실행되므로 실행 블록이 필요 없는 추상 메서드로 선언한다.

추상 메서드는 모두 public abstract의 특성을 갖고 생략 가능하다.

public interface RemoteControl {
	//상수
	public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
    
    //추상 메서드
    public void turnOn();
    public void turnOff();
    public void setVolume(int volume);
}

디폴트 메서드 선언

형태는 클래스의 인스턴스 메서드와 동일한데 default 키워드가 리턴 타입 앞에 붙는다.

디폴트 메서드는 public 특성을 갖고 생략 가능하다.

public interface RemoteControl {
	//상수
	public int MAX_VOLUME = 10;
    public 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("무음 해제합니다.");
      }
    }
}

정적 메서드 선언

형태는 클래스의 정적 메서드와 완전 동일하다.

정적 메서드는 public 특성을 갖고 생략 가능하다.

public interface RemoteControl {
	//상수
	public int MAX_VOLUME = 10;
    public 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("건전지를 교환합니다.");
    }
}

인터페이스 구현

[과정]
개발 코드가 인터페이스 메서드를 호출하면 인터페이스는 객체의 메서드를 호출.
[조건]
객체는 인터페이스에서 정의된 추상 메서드와 동일한 메서드 이름, 매개 타입, 리턴 타입을 가진 실체 메서드를 가지고 있어야 한다.

구현 클래스

[생성]
보통의 클래스와 동일하지만 인터페이스 타입으로 사용할 수 있음을 알려주기 위해 선언부에 implements 키워드를 추가하고 인터페이스 명을 명시해야 함.

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

구현 클래스에서 추상 메서드의 실체 메서드를 작성할 때 주의할 점은
인터페이스의 모든 메서드는 기본적으로 public 접근 제한을 갖기 때문에 public 보다 더 낮은 접근 제한으로 작성할 수 없다.

//인터페이스 변수에 구현 객체 대입 방법

public class RemoteControlExample {
	public static void main(String[] args) {
    	RemoteControl rc;
        rc = new Television();
        rc = new Audio();
    }
}
profile
Let's Coding

0개의 댓글