인터페이스를 사용하면 코드를 객체에 종속되지 않게(loose coupling. 약한 결합) 사용할 수 있다.
코드가 객체에 강하게 종속된 형태를 tight coupling(강한 결합) 되었다고 함.
Tightly Coupled(클래스를 직접 사용) <-> Loosely Coupled(인터페이스 사용)
interface 인터페이스명{
// 1. (static final) 상수
타입 상수명 = 값; //static final로 선언
// 2. 추상메소드
타입메소드명(매개변수, ...); //규격 (시그니처)
///////////////////////// 자바 7까지는 위의 두 가지만 인터페이스의 멤버로 가능했으나,
///////////////////////// 자바 8 이후 아래 두 가지가 추가됨.
// 3. 디폴트 메소드
public deault 타입 메소드명 (매개변수, ...){...}
// 4. 정적 메소드
public static 타입 메소드명(매개변수){...} //clazz 객체 >> 메소드영역에 생성
} //end interface
상수는 static final 로만 가능. 그냥 final은 불가능
->> new로 새로운 객체 생성할 수 없으니까! 무조건 static final
public static final int MAX_VOLUME = 10;
public static final int MIN_VOLUE = 0;
public abstract void turnOn();
public abstract void turnOff();
public abstract void setVolume(int volume);
[public] static 리턴타입 메소드명(매개변수, ...){...}
인터페이스 변수 = new 인터페이스() {
// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
};
인터페이스에는 생성자가 없으므로 매개변수 신경 X. 그냥 소괄호 () 만 작성하면 됨.
다중상속은 extends 키워드 사용 (implements 키워드 아님!)
public interface IC
extends IA, IB{
;;
} //end interface
인터페이스 a b c 가 있는데, c가 인터페이스 a, b 를 다중상속 받고있을 때
구현클래스 d가 인터페이스 c를 상속받을 때
d 에서는 a, b, c 의 abstract method를 모두 overriding해야 한다.
public class CImpl //구현클래스는 관례상 Impl을 붙임
implements IC { //impelements IA, IB, IC 로 작성해도 똑같다. 단, 이 경우 인터페이스간에는 implement가 일어나지 않음.
;;
} //end class
public class CImpl
extends Parent //클래스를 상속도 받고
implements IA, IB, IC { //인터페이스를 다중상속 받는것은 당연히 가능하고, 이런식으로 클래스를 선언하는 경우가 다수임
;;
}
인터페이스는 추상클래스에 있는 추상메소드와 동일하게 반드시 오버라이딩 하도록 강제성을 갖는것은 같지만,
인터페이스의 원래 역할은 객체 사용 설명서!! 이다.
어떤 객체가 받든 같은 규격을 사용하도록 함.
근데 추상클래스는 규격으로서의 메소드, 필드도 사용할 수 있지만, 그 외의 기능도 많이 가질 수 있다.
진짜 규격다운 규격은 인터페이스임.
...?? 추상클래스랑 인터페이스 차이 다시 확인하기***