public class Driver {
public static void main(String[] args) {
동물[] 동물들 = new 동물[5];
동물들[0] = new 쥐();
동물들[1] = new 고양이();
동물들[2] = new 강아지();
동물들[3] = new 송아지();
동물들[4] = new 병아리();
for( int i = 0; i < 동물들.length; i++ ) {
동물들[i].울어보세요();
}
}
}
class 쥐 extends 동물 {
void 울어보세요() {
System.out.println("나는 쥐! 찍! 찍!");
}
}
class 고양이 extends 동물 {
void 울어보세요() {
System.out.println("나는 고양이! 야옹! 야옹!");
}
}
class 병아리 extends 동물 {
void 울어보세요() {
System.out.println("나는 병아리! 삐약! 삐약!");
}
}
class 동물 {
void 울어보세요() {
System.out.println("나는 동물! 어떻게 울까?" );
}
}
위 소스를 보면 동물 클래스의 인스턴스는 어떻게 울어야 하는걸까? "동물"클래스의 인스턴스가 울게 하는 게 논리적으로 말이 되지 않는다. 그렇다고 해당 함수의 몸체를 비워두는 것도 이상하다. 바로 이런 경우에 추상 메서드를 사용하게 된다. 메서드 선언은 있으되 몸체는 없는 형태로 메서드를 구현하는 것이다.( 누군가 동물 객체를 만들고 울어보세요() 메서드를 호출하는 것도 퍽 난감하다. )
abstract class 동물 {
abstract void 울어보세요();
}
위와 같은 식으로 하면 해결된다.
public class Driver05 {
public static void main(String[] args) {
System.out.println("main 메서드 시작");
System.out.println(Animal.age);
}
}
class Animal {
static int age = 0;
static {
System.out.println("Animal class ready on!");
}
}
출력 결과
main 메서드 시작
Animal class ready on!
0
위 소스를 실행하면 클래스가 맨 처음 사용될 때 메모리의 스태틱 영역에 로딩되며, 이 때 단 한번 해당 클래스의 static 블록이 실행되기 때문에 Animal class ready on! 이 출력되었다.
여기서 클래스가 제일 처음 사용될 때는 아래 세가지 중 하나이다.
(1) 클래스의 정적 속성을 사용할 때
(2) 클래스의 정적 메소드를 사용할 때
(3) 클래스의 인스턴스를 최초로 만들 때
class 동물 {
}
class 조류 extends 동물 {
}
interface 날수있는 {
}
class 박쥐 implements 날수있는 {
}
public class Driver {
public static void(String[] args) {
동물 동물객체 = new 동물();
동물 조류객체 = new 조류();
System.out.println(동물객체 instanceof 동물 );
System.out.println(조류객체 instanceof 동물 );
System.out.println(조류객체 instanceof 조류 );
날수있는 박쥐객체 = new 박쥐();
System.out.println(박쥐객체 instanceof 날수있는);
System.out.println(박쥐객체 instanceof 박쥐);
}
}
출력결과
true
true
true
true
true