인터페이스 (p292 참조)
다중상속이 불가능하므로 클래스에서 인터페이스를 구현.
공통 기능은 표현 가능하나 공통 데이터는 사용 불가.
implementation 구현
클래스 implements 인터페이스명 {
interface Member {
final static
abstract void sub();
}
인터페이스는 무조건 값을 바꿀 수 없는 final static 변수를 씀.
인터페이스의 메소드는 내용이 없는 추상메소드이며, 일부러 메소드 선언에 abstract 안써도 됨
class Mem implements Member { // 상위 객체의 abstact 매소드를 구현
}
1) 대출가능 인터페이스 Lendable
package ClassExtends;
public interface Lendable { // 인터페이스 선언
final static byte STATE_BORROWED = 1; //대출중
final static byte STATE_NORMAL = 0; //대출아닌상태
abstract void checkOut(String aborrower, String date); // 대출 메소드
abstract void checkIn(); // 반납 메소드
}
※ 인터페이스는 본체가 없는 추상 메소드만 가질 수 있다.
따라서 인터페이스를 구현하는 클래스에게 메소드의 로직을 상속해줄 수 없음.
---------------------------------
2) 대출가능 인터페이스(Lendable)를 구현하는 단행본 클래스 SeparateVolume
package ClassExtends; //대출가능한 인터페이스를 구현하는 단행본 클래스
public class SeparateVolume implements Lendable { // 인터페이스를 구현
String requestNo; // 청구번호
String bookTitle; // 제목
String writer; // 저자
String borrower; //대출인
String checkOutDate; //대출일
byte state; // 대출상태
SeparateVolume(String requestNo, String bookTitle, String writer) {
this.requestNo = requestNo;
this.bookTitle = bookTitle;
this.writer = writer;
}
public void checkOut(String borrower, String date) { // 인터페이스의 대출 메소드. public 필수!
if (state != STATE_NORMAL) return;
this.borrower = borrower;
this.checkOutDate = date;
this.state = STATE_BORROWED;
System.out.println("*"+bookTitle+"이(가) 대출되었습니다.");
System.out.println("대출인:"+borrower);
System.out.println("대출일:"+date+"\n");
}
public void checkIn() { // 인터페이스의 반납 메소드. public 필수!
this.borrower = null;
this.checkOutDate = null;
this.state = STATE_NORMAL;
System.out.println("*"+bookTitle+"이(가) 반납되었습니다.");
}
}
※ 인터페이스의 메소드를 구현할 때에는 반드시 public을 붙여준다.
---------------------------------------------------
3) 상속을 위한 슈퍼클래스 CDInfo
package ClassExtends; //CD클래스
public class CDInfo {
String registerNo; // 관련번호
String title; // 타이틀
CDInfo (String registerNo, String title){
this.registerNo = registerNo;
this.title = title;
}
}
---------------------------------------------------
4) 슈퍼클래스(CDInfo)의 상속과 대출가능 인터페이스(Lendable)를 구현하는 CD 클래스 AppCDInfo
package ClassExtends; //대출가능한 인터페이스를 구현하는 CD 클래스
public class AppCDInfo extends CDInfo implements Lendable { // 클래스 상속과 인터페이스 구현을 동시에
String borrower; //대출인
String checkOutDate; //대출일
byte state; // 대출상태
AppCDInfo(String registerNo, String title) {
super(registerNo, title);
}
public void checkOut(String borrower, String date) {
if (state != 0) return;
this.borrower = borrower;
this.checkOutDate = date;
this.state = 1;
System.out.println("*"+title+"CD가 대출되었습니다.");
System.out.println("대출인:"+borrower);
System.out.println("대출일:"+date+"\n");
}
public void checkIn() { // 반납한다
this.borrower = null;
this.checkOutDate = null;
this.state = 0;
System.out.println("*"+title+"CD가 반납되었습니다.");
}
}
------------------------------------------------------------------------------------------------------
5) 단행본 클래스와 부록 CD 클래스를 사용하는 프로그램
package ClassExtends;
public class InterfaceExample1 {
public static void main(String[] args) {
SeparateVolume obj1 = new SeparateVolume("863?774개", "개미", "베르베르"); // 단행본 클래스 사용
AppCDInfo obj2 = new AppCDInfo("2005-7001","Redhat Fedpra"); // 부록 CD 클래스 사용
obj1.checkOut("김영숙","20160315");
obj2.checkOut("박희경","20160317");
obj1.checkIn();
obj2.checkIn();
}
}
------------------------------------------------------------------------------------------------------
6) 결과
*개미이(가) 대출되었습니다.
대출인:김영숙
대출일:20160315
*Redhat FedpraCD가 대출되었습니다.
대출인:박희경
대출일:20160317
*개미이(가) 반납되었습니다.
*Redhat FedpraCD가 반납되었습니다.
------------------------------------------------------------------------------------------------------
인터페이스 변수의 다형성
상속관계에 있을 때에는 상위 객체의 변수를 하위 객체의 변수에 new 해서 상위 객체 담을 수 있음
Landabel obj;
인터페이스의 변수에는 그 인터페이스를 구현하는 클래스의 객체는 어떤 객체든 다 대입 가능.
1) Lendable 인터페이스 변수의 다형성을 이용하는 프로그램
package ClassExtends;
public class InterfaceExample2 {
public static void main(String args[]){
Lendable arr[] = new Lendable[3]; // 인터페이스 타입의 배열
arr[0] = new SeparateVolume("883ㄱ326","푸코의진자","에코"); // 배열에 여러타입 객체 저장
arr[1] = new SeparateVolume("235ㅇ261","서양미술사","곰브리치");
arr[2] = new AppCDInfo("2002-1742","XML 자바프로그래밍");
checkOutAll(arr, "윤지혜", "20060315"); // 배열을 파라미터로 넘김
}
static void checkOutAll(Lendable arr[],String borrower,String date){
for (int cnt = 0; cnt<arr.length;cnt++)
arr[cnt].checkOut(borrower, date);
}
}
---------------------------------------------------
인터페이스의 상수 필드
인터페이스에 인스턴스 필드는 선언할 수 없으나 상수 필드만큼은 선언할 수 있다.
final static으로 선언되는데 굳이 final static 붙이지 않아도 자동으로 추가된 효과를 가짐.
인터페이스의 상속
인터페이스도 클래스처럼 상속이 가능하다.
interface Transformable extends Movable { // 다른 인터페이스를 상속
인터페이스의 다중 상속
인터페이스는 클래스와 달리 다중 상속도 허용된다.
interface Changeable extends Resizable, Colorable { // 다양한 인터페이스를 상속