다중 상속을 지원하기 위해서 추상 클래스와 유사한 인터페이스를 제공한다
이론적인 측면에서 객체는 코드를 갖는 구체적인 객체와 실제 코드를 갖지 않는 추상적인 객체로 구분
1 2 3 4 5 6 7 8 9 10 11 | // 사물을 표현하기 위한 Thing 클래스 public abstract class Thing { public String name; public Thing(String name) { this .name=name; } } |
1 2 3 4 5 | // 인터페이스 선언 interface Valuable { public int value(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 시계를 표현하기 위한 클래스 public class Watch extends Thing implements Valuable { String brand; Watch(String b) { super( "시계" ); brand = b; } public int value() { return 10000; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 돈을 표현하기 위한 클래스 public class Money extends Thing implements Valuable { int value; Money( int value) { super( "돈" ); this .value = value; } public int value() { return value; } } |
1 2 3 4 5 6 7 8 | // 쓰레기를 표현하기 위한 클래스 public class Trash extends Thing { Trash() { super( "쓰레기" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | // 가게를 표현하기 위한 클래스 public class Shop { String name; public Shop(String name) { this .name=name; } public void sell(Valuable v, String goods) { System.out.print(name + "에서" ); System.out.print(v.value() + "원어치" ); System.out.println(goods + "를 팔았습니다" ); } public static void main(String args[]) { Shop myshop = new Shop( "자바 슈퍼" ); Money money = new Money(5000); Watch watch = new Watch( "로렉스" ); Trash trash = new Trash(); myshop.sell(money, "과자" ); myshop.sell(watch, "음료수" ); } } |
- 멤버 필드는 디폴트로 static, final로 선언되어 있다
따라서 인터페이스 멤버 필드의 값을 변경하려는 시도는 컴파일 시에 에러를 발생시킨다
- 인터페이스의 구현도 상속과 같은 개념이기 때문에 인터페이스를 구현한 서브클래스는 인터페이스의 멤버 필드를 상속받아서 사용할 수 있다
- 슈퍼클래스의 변수를 지칭할때는 super
인터페이스의 변수를 지칭할 때는 interface 형태
- 콤마를 이용해서 여러개를 기술할수 있다