JAVA
JAVA ) interface의 역할과 선언방법 (코드)
알아가는 번데기
2020. 5. 27. 20:06
저번 포스팅에서 interface의 개념과 역할의 대해서 이론적인 내용만 다뤄었다, 백문이 불여일견이라고
이번엔 직접 interface를 구성하는 멤버들 각각의 선언방식과 의미 및 특징에 대해서 코드로 구현해보며 이해하려고 한다.
interface를 구성하는 멤버
- 정적필드
- 추상메소드
- 디폴트메소드
- 정적메소드
// 인터페이스
public interface Annotation {
// 상수 필드
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
// 추상 메소드
public abstract void turnOn(int volume);
// 디폴트 메소드
default void setMute(boolean mute){
if(mute){
System.out.println("무음 처리합니다.");
}else{
System.out.println("무음 해제합니다.");
}
}
// 정적 메소드
static void ChangeBattery(){
System.out.println("정적 메소드입니다.");
}
}
interface 선언 특징
1. 필드, 메소드 선언시 접근제어자를 사용하지 않아도 컴파일시 자동적으로 public으로 선언해준다,추상 메소드의 abstract도 적용된다
2. 추상메소드를 선언한다면 implements된 구현 클래스에서 실체 메소드를 작성 하지 않으면 오류가 발생한다. 선택적으로 추상 메소드의 실체 메소드 만을 가지고 싶다면 구현 클래스를 추상 클래스(abstract)로 선언해야된다.
3. 디폴트메소드의 기능을 인터페이스에서 선언하지만 다른 멤버와 다르게 강제성이 없어 선언 규제가 자유롭다, 즉 디폴트 메소드를 오버라이드를 하지 않더라도 오류가 발생하지 않는다.
4. 정적메소드는 상수필드와 같이 초기값을 가진뒤 수정이 절대적으로 불가능하다, 하지만 선언 규제에서는 자유롭다
// interface를 implements한 구현 클래스 Car
public class Car implements Annotation{
// 추상 메소드
public void turnOn(int volume){
System.out.println(" turnOf !! " + volume);
}
// 디폴트 메소드
public void setMute(boolean mute){
System.out.println("디폴트 메소드를 재정의 했습니다. "+ mute);
}
}
// interface를 implements한 구현 클래스 Tire
public class Tire implements Annotation{
public void turnOn(int volume){
System.out.println(" 추상 메소드의 실체 메소드입니다. = "+ volume);
}
}
//mian
public class Main {
public static void main(String[] args){
// interface로 구현 객체를 선언하는 두 가지 방법.
Annotation a1;
a1 = new Car();
Annotation a2 = new Tire();
// 하나의 인터페이스 타입에 어느 객체를 대입하는냐에 따라 실행결과가 달라지며 다향성이 구현된다!
// 정수필드
System.out.println(a1.MAX_VOLUME);
System.out.println(a2.MAX_VOLUME);
// 추상 메소드
a1.turnOn(5);
a2.turnOn(10);
// 디폴트 메소드
a1.setMute(true);
// 정적 메소드
Annotation.ChangeBattery();
}
}
디폴트 메소드의 선언은 인터페이스에서 하지만 사실은 구현 객체가 가지고 있는 인스턴스 메소드이기 때문에 오버라이드가 불가능하다.
정적메소드는 구현 객체를 통하거나 객체변수로 호출이 불가능하다, 오로지 intetface 클래스 명으로 호출이 가능하다.
=