형식) public interface 인터페이스명 {
자료형 필드명=초기값;//public static final 생략 가능
반환형 메소드명(자료형 변수명, 자료형 변수명,...);//public abstract 생략 가능
}
인터페이스 이름은 파스칼 표기법을 사용하여 작성하는 것을 권장
인터페이스로 객체를 생성할 수 없지만 클래스 선언시 인터페이스를 상속받아 작성
상속을 목적으로 작성된 자료형 : 상속관계 - 실체화 관계(Realization)
형식) public class 클래스명 implements 인터페이스명, 인터페이스명, ... { }
클래스는 implements 키워드를 사용하여 다수의 인터페이스 상속 가능 - 다중상속
인터페이스를 상속받은 클래스는 상속받은 인터페이스의 모든 추상메소드를 무조건 오버라이딩 선언
인터페이스로 참조변수를 생성하여 클래스의 생성자로 객체를 생성하여 저장 가능 - 묵시적 객체 형변환에 의해 참조변수로 클래스의 객체를 참조해 클래스의 메소드 호출 가능
인터페이스 선언시 다른 인터페이스를 상속받아 작성 가능 - 다중상속 가능
형식) public interface 인터페이스명 extends 인터페이스명, 인터페이스명, ... { }
클래스는 extends 키워드로 상속받아 사용 - 단일상속
자식클래스는 부모클래스의 필드 또는 메소드를 상속받아 사용
인터페이스는 implements 키워드로 상속받아 사용 - 다중상속
자식클래스는 부모인터페이스의 모든 추상메소드를 오버라이딩 선언하여 사용
package xyz.it.realization;
public class Human {
public void speak() {
System.out.println("[인간]대화할 수 있는 능력");
}
public void walk() {
System.out.println("[인간]두발로 걸을 수 있는 능력");
}
public void smile() {
System.out.println("[인간]활짝 웃을 수 있는 능력");
}
}
package xyz.it.realization;
public interface Wolf {
// 추상메서드
//public abstract void fastWalk();
void fastWalk(); //public abstract 생략 가능
void cryLoudly();
}
public class WolfHuman extends Human implements Wolf {
// interface
@Override
public void fastWalk() {
System.out.println("[늑대]네발로 빠르게 달리는 능력");
}
// interface
@Override
public void cryLoudly() {
System.out.println("[늑대]큰소리로 울부짖을 수 능력");
}
public void change() {
System.out.println("[늑대인간]변신할 수 능력");
}
}
public class WolfHumanApp {
public static void main(String[] args) {
//자식클래스의 생성자를 호출하여 부모클래스의 객체와 자식클래스의 객체를 모두 생성하여
//자식클래스의 참조변수에 저장
// => 자식클래스의 참조변수로 자식클래스의 객체를 참조하여 자식클래스의 메소드를 호출
//할수 있으며 상속관계의 의해 부모클래스의 객체를 참조해 부모클래스의 메소드 호출 가능
WolfHuman wolfHuman=new WolfHuman();
wolfHuman.speak();
wolfHuman.walk();
wolfHuman.smile();
wolfHuman.change();
wolfHuman.fastWalk();
wolfHuman.cryLoudly();
System.out.println("==============================================================");
//자식클래스의 생성자를 호출하여 부모클래스의 객체와 자식클래스의 객체를 모두 생성하여
//부모클래스의 참조변수에 저장
// => 부모클래스의 참조변수로 부모클래스의 객체를 참조하여 부모클래스의 메소드 호출 가능
// => 객체 형변환을 사용하면 참조변수를 이용해 자식클래스의 객체를 참조해 자식클래스의 메소드 호출 가능
Human human=new WolfHuman();
human.speak();
human.walk();
human.smile();
System.out.println("==============================================================");
//명시적 객체 형변환을 사용하여 자식클래스의 객체를 참조해 자식클래스의 메소드 호출
((WolfHuman)human).change();
//((WolfHuman)human).fastWalk();
//((WolfHuman)human).cryLoudly();
System.out.println("==============================================================");
//자식클래스의 생성자를 호출하여 부모클래스의 객체와 자식클래스의 객체를 모두 생성하여
//부모인터페이스의 참조변수에 저장
//Wolf wolf=new WolfHuman();
//자식클래스가 같은 클래스와 인터페이스는 명시적 객체 형변환을 사용하여 자식클래스의
//객체를 공유하여 저장 가능
//Wolf wolf=(WolfHuman)human;
//참조변수를 자식클래스로 형변환하지 않고 부모클래스 또는 부모인터페이스로 명시적 객체
//형변환하여 참조변수에 저장 가능
Wolf wolf=(Wolf)human;
//부모인터페이스의 참조변수로 추상메소드를 호출하면 묵시적 객체 형변환에 의해 자식클래스의
//객체를 참조하여 자식클래스의 메소드 호출
wolf.fastWalk();
wolf.cryLoudly();
System.out.println("==============================================================");
}
}