instanceof
어떤 객체가 특정 클래스의 객체인지 조사할 때 사용animal instanceof Tiger
== animal 객체는 Tiger 클래스로 만들어진 객체니?interface Predator {
(... 생략 ...)
}
class Animal {
(... 생략 ...)
}
class Tiger extends Animal implements Predator {
(... 생략 ...)
}
class Lion extends Animal implements Predator {
(... 생략 ...)
}
class ZooKeeper {
(... 생략 ...)
}
class Bouncer {
void barkAnimal(Animal animal) {
if (animal instanceof Tiger) {
System.out.println("어흥");
} else if (animal instanceof Lion) {
System.out.println("으르렁");
}
}
}
public class Sample {
public static void main(String[] args) {
Tiger tiger = new Tiger();
Lion lion = new Lion();
Bouncer bouncer= new Bouncer();
bouncer.barkAnimal(tiger);
bouncer.barkAnimal(lion);
}
}
// 어흥
// 으르렁
implements
할 수 있다....
interface Barkable {
void bark();
}
...
class Tiger extends Animal implements Predator, Barkable {
public String getFood() {
return "apple";
}
public void bark() {
System.out.println("어흥");
}
}
class Lion extends Animal implements Predator, Barkable {
public String getFood() {
return "banana";
}
public void bark() {
System.out.println("으르렁");
}
}
...
class Bouncer {
void barkAnimal(Barkable animal) { // Animal 대신 Barkable을 사용
animal.bark();
}
}
...
Tiger tiger = new Tiger(); // Tiger is a Tiger
Animal animal = new Tiger(); // Tiger is a Animal
Predator predator = new Tiger(); // Tiger is a Predator
Barkable barkable = new Tiger(); // Tiger is a Barkable
...
interface BarkablePredator extends Predator, Barkable {
}
...
abstract class Predator extends Animal { // Animal 클래스 기능 유지하기 위해 상속
abstract String getFood();
default void printFood() { // default 를 제거한다.
System.out.printf("my food is %s\n", getFood());
}
static int LEG_COUNT = 4; // 추상 클래스의 상수는 static 선언이 필요하다.
static int speed() {
return LEG_COUNT * 30;
}
}
...
// interface BarkablePredator extends Predator, Barkable {} 삭제
...
class Tiger extends Predator implements Barkable {
(... 생략 ...)
}
class Lion extends Predator implements Barkable {
(... 생략 ...)
}
....
추상클래스는 인터페이스와 달리 일반 클래스처럼 객체번수, 생성자, private 메서드 등을 가질 수 있다.