▶ 인터페이스
✔ 같은 목적 하에 동일한 기능을 수행하게 하는것
> 사용자가 프로그램을 이용하는 방법은 플랫폼이 달라지더라도 일정해야 한다
✔ 인터페이스는 객체를 생성할 수 없다
> 그래서 필드를 선언하려면 객체 생성과 관계없이 사용할 수 있는 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 |