본문 바로가기

학습 기록 (Learning Logs)/자바

[java] interface

interface : 객체의 사용 방법을 정의한 타입이다.

 

개발코드가 직접 객체의 메소드를 호출하면 간단한데 왜??

왜 중간에 인터페이스를 두는가??

 

개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기 위함.

 

 

개발 코드가 인터페이스의 메소드 호출 -> 인터페이스는 객체의 메소드를 호출한다.

개발 코드는 객체의 내부 구조를 알 필요가 없다.

인터페이스의 메소드만 알고 있으면 된다.

 

 

클래스 인터페이스
필드, 생성자, 메소드
객체를 생성할 수 있다
상수, 메소드
객체를 생성할 수 없다

자바7: 메소드: 실행 블록이 없는 추상 메소드 선언
자바8: 디폴트 메소드, 정적 메소드 선언 가능
  interface 인터페이스명{
   타입 상수명 = 값;
   타입 메소드명(매개변수,..);
   default 타입 메소드명(매개변수,..){ ... }
   static 타입 메소드명(매개변수,...){ ... }
}

default 메소드 : 인터페이스에 선언되지만 사실은 객체가 가지고 있는 인스턴스 메소드이다.

static 메소드 : 객체가 없어도 인터페이스만으로도 호출이 가능하다.

 

 

 

추상 메소드 : 중괄호를 넣지 않음

public interface RemoteControl {
    int MAX_VOLUME = 10;
    int MIN_VOLUME = 0;

    void turnOn(); // 추상 메소드: 메소드 선언부만 작성 public abstract
    void turnOff(); // 추상 메소드: 메소드 선언부만 작성 public abstract
    void setVolume(int volume); // 추상 메소드: 메소드 선언부만 작성 public abstract
}

인터페이스에서 선언된 추상 메소드는 모두 public abstract 특성을 갖기 때문에 안 써도 자동으로 컴파일 과정에서 붙는다.

 

 

default 메소드 : 인터페이스에 선언되지만 사실은 객체가 가지고 있는 인스턴스 메소드이다.

자바 8에서 추가된 인터페이스의 새로운 멤버이다.

형태는 클래스의 인스턴스 메소드와 동일하다.

default 키워드가 리턴 타입 앞에 붙는다.

default 메소드는 public 특성을 갖는다. 그래서 적지 않아도 자동으로 컴파일 과정에서 public이 붙는다.

 

public interface RemoteControl {
    int MAX_VOLUME = 10;
    int MIN_VOLUME = 0;

    void turnOn();
    void turnOff();
    void setVolume(int volume);

    default void setMute(boolean mute) { // 디폴트 메소드, public이 맨앞에 없지만 컴파일 과정에서 생성된다.
        if(mute) { // 실행 내용까지 작성
            System.out.println("무음 처리합니다.");
        } else {
            System.out.println("무음 해제합니다.");
        }
    }
}

 

 

 

static 메소드 

정적 메소드는 디폴트 메소드와 마찬가지로 자바 8에서 추가된 인터페이스의 새로운 멤버이다.

정적 메소드는 public 특성을 갖기 때문에 생략하더라도 컴파일 과정에서 붙게 된다.

 

 

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

    void turnOn();//추상 메소드
    void turnOff();//추상 메소드
    void setVolume(int volume);//추상 메소드

    default void setMute(boolean mute) { // 디폴트 메소드, public이 맨앞에 없지만 컴파일 과정에서 생성된다.
        if(mute) { // 실행 내용까지 작성
            System.out.println("무음 처리합니다.");
        } else {
            System.out.println("무음 해제합니다.");
        }
    }
    
    static void changeBattey(){//정적 메소드
    	System.out.println("건전지를 교환합니다.");
    }
}

 

 

 

 

인터페이스는 객체를 만들 수 없다.

인터페이스 내용을 구현시키려면?

 

구현 클래스가 필요하다.

 

구현 클래스

public class 구현클래스명 implements 인터페이스명 {
  // 인터페이스의 추상 메소드를 구현하면 된다.
}

 

 

그리고 인터페이스에서 선언된 추상 메소드의 실체 메소드를 선언 해야 한다.

 

public class Television implements RemoteControl {
   private int volume; // 필드

   public void turnOn(){// 추상 메서드 구현
   		System.out.println("TV를 켭니다.");
   }
   
   public void turnOff(){// 추상 메서드 구현
   		System.out.println("TV를 끕니다.");
   }
   
   
 	public void setVolume(int volume){// 추상 메서드 구현
  	 	if(volume > RemoteContorl.MAX_VOLUME){
   		 	this.volume = RemoteControl.MAX_VOLUME;
   		 }else if((volume > RemoteContorl.MIN_VOLUME){
    	this.volume = RemoteControl.MIN_VOLUME;
  		  }else{
   		  this.volume = volume;
    	}
  		System.out.println("현재 TV 볼륨: "+ volume);
	}
    
}

'학습 기록 (Learning Logs) > 자바' 카테고리의 다른 글

[java] 전략 패턴 (Strategy pattern)  (0) 2022.01.01
[java] 싱글톤  (0) 2022.01.01
[java] 생성자  (0) 2021.12.30
[java] final  (0) 2021.12.29
[java] 상속  (0) 2021.12.29