▶ 인터페이스

✔ 같은 목적 하에 동일한 기능을 수행하게 하는것

  > 사용자가 프로그램을 이용하는 방법은 플랫폼이 달라지더라도 일정해야 한다

 

✔ 인터페이스는 객체를 생성할 수 없다

  > 그래서 필드를 선언하려면 객체 생성과 관계없이 사용할 수 있는 static으로 선언해야 한다

 

✔ 인터페이스는 상수 필드만 선언 가능 (public static fianl)

  > 데이터 저장하지 않음

  > public : 누구나 접근하여 사용할 수 있음

  > static : 인스턴스 생성 없이 사용할 수 있음

  > fianl : 초기화된 값을 변경할 수 없음

 

▶ 인터페이스 선언

인터페이스는 추상 메소드(public abstract)와 상수(public static final)로 이루어진다

  • interface : 기능별 클래스를 정한다
  • (매개변수) : 기능별 메서드의 선언부를 정한다
  • 자료형 : 기능별 필드를 정한다

public interface 인터페이스명 {

     public static final 자료형 변수명 = 값;     // 상수 필드 선언
     public abstract void 메소드명1(매개변수);     // 추상 메소드 선언

     public defult void 메소드명2(매개변수) {...}     // 디폴트 메서드 선언

     public static void 메소드명3(매개변수) {...}     // 정적 메서드 선언

     private void 메서드명4(매개변수) {...}     // private메서드 선언

     

}


▶ 인터페이스 예시

더보기

부모 인터페이스

public interface RemoteControl {

	//상수 필드 선언(최대볼륨|최소볼륨)
	public static final int Max_VoLUME=32;
	int MINI_VOLUM=0;
	
	//추상 메서드 선언(전원끄기|전원켜기|볼륨설정)
	public abstract void turnOn();
	public abstract void turnOff();
	void setVolume(int volume);
	
	//디폴트 메소드 선언(볼륨 무음처리)
	public default void setMute(boolean mute) {
		if(mute) {
			System.out.println("무음 처리합니다");
		}
		else {
			System.out.println("무음 해제합니다");
			}
		}
	
	//정적 메소드 선언(배터리 체인지)
	public static void changeBattery() {
		System.out.println("건전지를 교환합니다");
		}
	}

인터페이스를 상속받은 클래스

// interface RemoteControl상속
public class Radio implements RemoteControl{
	
	//필드 선언
	private int volume;
	private double radioFrequency;
	
	//매개변수 선언
	public Radio(double radioFrequency) {
		this.radioFrequency=radioFrequency;
	}
	
	//추상 메서드
	@Override
	public void turnOn() {
		System.out.println("Radio를 킵니다");
		}
	
	@Override
	public void turnOff() {
		System.out.println("Radio를 끕니다");
		}
	
	//디폴트 메서드 
	@Override
	public void setVolume(int volume) {
		if(volume>RemoteControl.Max_VoLUME) {			//만약 볼륨이 최대치보다 커지면
			this.volume=RemoteControl.Max_VoLUME;		//볼륨은 최대볼륨과 같아진다
		}else if (volume<RemoteControl.MINI_VOLUM) {	//만약 볼륨이 최소치보다 작아지면
			this.volume=RemoteControl.MINI_VOLUM;		//볼륨은 최소볼륨과 같아진다
		} else {										//두개 다 아니면
			this.volume=volume;							//볼륨은 볼륨과 같아진다
		}
	}
	
	//정적메소드
	public static void changeBattery() {
		System.out.println("건전지를 교체합니다");
	}
	
	//일반메소드
	public void printRF() {
		System.out.println("현재 주파수:"+radioFrequency+"입니다");
	}
	public String toString() {
		return "현재 볼륨은"+volume+"입니다";
	}
}

 

종류 설명 사용
상수
public static final
인터페이스에서 값을 정해줄테니 함부로 바꾸지 말고 제공해주는 값만 참조해라 절대적
추상메소드
public abstract
가이드만 줄테니 추상메소드를 오버라이딩해서 재구현해라 강제적
디폴트메소드
public defult
인터페이스에서 기본적으로 제공해주지만, 맘에 안들면 각자 구현해서 써라
추가 요건으로 인해 불가피하게 반영을 해야할 때 디폴트메소드를 쓰면 효과적
선택적
정적메소드
public static
인터페이스에서 제공해주는 것으로 무조건 사용
정적메소드는 오버라이딩을 할 수 없다
절대적

✔ default 메소드 선언

∘ 실행 블록을 가지고 있는 메소드이다

∘ 인터페이스를 구현하는 클래스에 자동 상속되는 메소드이다

∘ default 키워드를 반드시 붙여야 한다

∘ 기본적으로 public 접근 제한 (생략하더라도 컴파일 과정에서 자동으로 붙음)

 

✔ 정적 메소드 선언

∘ static으로 선언된 메서드는 프로그램 시작 시 메모리에 사용 준비가 완료되므로 인스턴스 생성과 상관없이 바로 사용할 수 있다

∘ 인터페이스에 static 메서드를 선언하는 목적은 해당 인터페이스를 구현하고 있는 모든 객체에서 자주 사용하는 유용한 기능을 제공하는데 있다

 

✔ private 메소드 선언

∘ 접근제한자를 private으로 선언한다는 의미는 외부에서 접근할 수 없도록 접근 권한을 제한하는 것이다

∘ private 메서드는 동일한 인터페이스에 선언된 defult 메서드에서만 사용할 목적으로 본문을 구현하는 메서드이다

 

 추상 클래스와 인터페이스 비교

✔ 공통점

- 객체를 생성할 수 없고, 상속을 위한 슈퍼 클래스로만 사용

- 클래스의 다향성을 실현하기 위한 목적

✔ 차이점

비교 목적 구성
추상 클래스 추상 클래스는 서브 클래스에서 필요로 하는 대부분의 기능을 구현하여 두고 서브 클래스가 상속받아 활용할 수 있도록 하되, 서브 클래스에서 구현할 수밖에 없는 기능만을 추상 메소드로 선언하여, 서브 클래스에서 구현하도록 하는 목적(다형성) ∘ 추상 메소드와 일반 메소드
∘ 상수, 변수, 필드 
인터페이스 인터페이스는 객체의 기능을 모두 공개한 표준화문서와 같은 것으로, 개발자에게 인터페이스를 상속받는 클래스의 목적에 따라 인터페이스의 모든 추상 메소드를 만들도록 하는 목적(다향성) ∘ 변수 필드(멤버 변수)는 X
∘ 상수, 추상 메소드, 일반 메소드, default메소드, 정적메소드 
∘ protected 접근 지정 선언 불가
∘ 다중 상속 지원

 

 클래스와 추상 클래스, 인터페이스

  일반 클래스 추상 클래스 인터페이스
메서드의 재정의 선택적 필수 필수
상속, 구현시 예약어 extends extends implements
필드 선언 가능 가능 불가능
상수 선언 가능 가능 가능
생성자 선언 가능 가능 불가능
추상 메서드  미포함 포함 포함
객체(클래스의 인스턴스) 생성 가능 불가능 불가능
다중 상속 불가능 불가능 가능

 

'Language > Java' 카테고리의 다른 글

내부 클래스 (중첩 클래스)  (0) 2022.02.21
다형성 (Polymorphism)  (0) 2022.02.21
추상 클래스/메소드  (0) 2022.02.21
클래스  (0) 2022.02.21
자바  (0) 2022.02.18