Family[] fml = new Family[3];
fml[0] = new Daughter();
fml[1] = new Son();
fml[2] = new Puppy();
FamilyPicnic(new Daughter());
FamilyPicnic(new Son());
FamilyPicnic(new Puppy());
//Upcasting
Family fml = new Son();
Family fml = new Daughter();
//Downcasting
((Daughter)d).studentFamilyGoToSchool(); //Daughter의 고유 메소드 호출
((Son)s).childrenFamilyGoToPlayground(); //Son의 고유 메소드 호출
public void familAtTheMorning(Famimly f)
if(d instanceof Family){ //Daughter d = new Daughter();일 때
((Daughter)d).studentFamilyGoToSchool();
//Daughter의 레퍼런스 d가 Family의 후손 클래스가 맞다면,
//Daughter의 고유 메소드 호출
}else if (s instanceof Family){
((Son)s).childrenFamilyGoToPlayground();
//Son의 레퍼런스 s가 Family의 후손 클래스가 맞다면,
//Son의 고유 메소드 호출
}
추상 클래스: abstract가 있는 메소드를 포함한 클래스. 클래스 선언부에 abstract 키워드 작성.
추상 메소드: Body가 없는 메소드로, 메소드의 선언부에 abstract 키워드를 사용항 선언한다. 상속시, 반드시 구현해야 하는 메소드이며 Overriding이 강제된다. (구현하지 않을 시 Compile 에러 발생.)
public abstract class AbstractClassTest{ //추상 클래스
public abstract void familyAtTheMorning(); //추상 메소드
}
상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체. 메소드의 통일성을 부여하기 위해서 추상 메소드만 따로 모아 놓은 것으로, 상속시 인터페이스 내에 정의된 모든 추상 메소드를 구현해야 한다. 즉, 모든 인터페이스의 메소드는 묵시적으로 public abstract이다.
상위 타입의 역할로 다형성을 지원하여 연결해 주는 역할을 수행한다.
해당 객체가 다양한 기능을 제공하는 경우에도 인터페이스에 해당하는 기능만을 사용하도록 제한이 가능하다.
공통 기능상의 일관성을 제공하여, 공동 작업을 위한 인터페이스를 제공한다.
public interface InterfaceName{
publc static final int PORT = 1025;
[public abstract] int CallPort (Network n);
//[public abstract]는 생략되기 때문에 오버라이딩시 public 표기 필요.
}
CheckedException(非RuntimeExcpetion 후손): 소스 코드 상에서 반드시 개발자가 처리해야 하는 Checked Exception(확인 가능 예외)이란 Runtime Exception의 후손이 아닌 Exception등을 일컫는다. 즉, 프로그램을 실행하지 않아도 컴파일 단계에서 에러가 있음을 확인할 수 있는 경우이다. 여기에는 IOException, EOFException, FileNotFoundException등이 있다.
UnckeckedException(RuntimeException 후손): 소스 코드 상에서 개발자가 반드시 처리하지는 않아도 되는 경우이자 대개 개발자의 부주의로 인해 발생 즉 Unchecked(확인되지 않는) 경우이다. 이들은 RuntimeException의 후손으로, 컴파일 시에는 오류가 있음을 알 수 없고 프로그램을 실행시킨 후에 에러가 있음을 알 수 있다. 여기에는 ArithmeticException(산술 예외), NullPointerException(Null 예외), ArrayIndexOutOfBoundsException(인덱스 범위 예외)등이 포함된다.