1. Java OOP 다형성
- 다형성이란? 하나의 타입이나 메소드가 여러 타입이나 메소드들을 가지거나 실행하는 능력
package exercise.chapter_33;
public class Animal {
protected String gender;
public void eat(String food) {
System.out.println("동물이 " + food + "를 먹습니다");
}
public void sleep() {
System.out.println("동물이 잠을 자고 있습니다");
}
}
...
public class Bird extends Animal {
@Override
public void eat(String food) {
System.out.println("새가 " + food + "를 부리로 쪼아먹고 있습니다");
}
}
...
public class AnimalTest {
public static void main(String[] args) {
Animal bird = new Bird(); //업캐스팅
feed(bird, "모이");
}
public static void feed(Animal animal, String food) {
animal.eat(food); //각 인스턴스의 오버라이딩된 메소드 실행
// 출력 : 새가 모이를 부리로 쪼아먹고 있습니다
}
}
2. Java 다운 캐스팅
- 부모클래스에서 자식클래스 타입으로 형변환
- 하위클래스 인스턴스인지 확인하는 방법
package exercise.chapter_33;
public class AnimalDownCasting {
public static void main(String[] args) {
//다운 캐스팅 확인
Animal animal = new Bird();
Bird bird = (Bird) animal; //다운캐스팅, Bird 인스턴스만 형변환 가능
checkBirdAndFly(animal);
Animal animal2 = new Animal();
//Bird bird2 = (Bird) animal2; //오류 발생, animal2는 Animal 인스턴스임
checkBirdAndFly(animal2);
Animal animal3 = new Person();
//Bird bird3 = (Bird) animal3; //오류 발생, animal3는 Person 인스턴스임
checkBirdAndFly(animal3);
}
static void checkBirdAndFly(Animal animal) {
if (animal instanceof Bird) { //animal 객체가 Bird 인스턴스인지 확인
Bird bird = (Bird) animal;
bird.fly();
} else {
System.out.println("새가 아닙니다");
}
}
}
/*
출력:
새가 날고 있습니다
새가 아닙니다
새가 아닙니다
*/
package exercise.chapter_33;
public class AnimalCasting {
public static void main(String[] args) {
Animal[] animals = {
new Animal(), new Person(), new Fish(), new Bird(),
};
sleepTogether(animals);
System.out.println("----------------");
doSomethingSeparately(animals);
}
static void sleepTogether(Animal[] animals) {
for (Animal animal : animals) {
animal.sleep(); //각 인스턴스의 오버라이딩된 sleep 함수 실행
}
}
static void doSomethingSeparately(Animal[] animals) {
for (Animal animal : animals) {
if (animal instanceof Bird) {
Bird bird = (Bird) animal; //다운캐스팅
bird.fly();
} else if (animal instanceof Fish) {
Fish fish = (Fish) animal; //다운캐스팅
fish.swim();
} else if (animal instanceof Person) {
Person person = (Person) animal; //다운캐스팅
person.walk();
} else {
System.out.println("동물 클래스이거나 지원하지 않는 객체");
}
}
}
}
/*
출력:
동물이 잠을 자고 있습니다
사람이 자고 있습니다
물고기가 잠을 자고 있습니다
새가 잠을 자고 있습니다
----------------
동물 클래스이거나 지원하지 않는 객체
사람이 걷고 있습니다
물고기가 헤엄을 치고 있습니다
새가 날고 있습니다
*/
3. Java final 키워드
- final로 변화 제어 : 클래스 상속, 함수 오버라이딩 못하게 막기
public final class Animal {
...
}
...
public class Bird extends Animal { //Animal class가 final로 선언되었기 때문에 상속 불가
...
}
class Animal{
public final void eat(String food) {
...
}
}
class Bird extends Animal{
...
@Override
public void eat(String food) {
//부모 클래스의 eat 함수가 final로 선언되었기 때문에 오버라이드 할수 없음
}
}
- final로 상수 정의
static final double PI = 3.141592;