[자바 기초] 다형성
복습
https://shins99.tistory.com/32
[JAVA] 상속
복습 https://shins99.tistory.com/25 [자바 기초] 배열 복습 https://shins99.tistory.com/23 [자바 기초] static 복습 https://shins99.tistory.com/21 [자바 기초] C R U D 의 개념 복습 https://shins99.tistory.com/20 [자바 기초] this
shins99.tistory.com
💡 학습 목표
1. 다형성에 대한 개념을 이해하자.
2. 업캐스팅이란 무엇일까?
3. 다운캐스팅이란 무엇일까?
4. instanceof 연산자를 이해하자.
다형성 (Polymorphism)
- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
(자료형을 다양한 형태로 볼 수 있다)
- 같은 코드에서 여러 실행 결과가 나옴
- 정보 은닉, 상속과 더불어 객체 지향 프로그래밍의 가장 큰 특징 중 하나
- 다향성을 잘 활용하면 유연하고 확장성 있는, 유지보수가 편리한 프로그램 만들 수 있음
하나의 타입을 다양한 형태로 바라볼 수 있다.
package ch05;
public class Animal {
public void move() {
System.out.println("동물이 움직입니다.");
}
public void eating() {
System.out.println("동물이 먹이를 먹습니다.");
}
} // end of Animal class
class Tiger extends Animal {
@Override // 오버라이드
public void move() {
System.out.println("호랑이가 네발로 움직입니다");
}
@Override
public void eating() {
System.out.println("호랑이가 사냥을 합니다");
}
}
class Human extends Animal {
@Override
public void move() {
System.out.println("사람이 두발로 걸어 다닙니다.");
}
@Override
public void eating() {
System.out.println("밥을 먹습니다.");
}
public void readBooks() {
System.out.println("사람이 책을 읽습니다.");
}
}
참조형 형 변환 (Reference Type Casting)
- 상속 관계에서 부모 클래스, 자식 클래스간의 형 변환
업 캐스팅
- 부모 클래스 타입으로 변수 선언, 자식 클래스의 생성자로 인스턴스 생성
- 해당 참조변수는 자식 클래스의 멤버변수에 접근 불가
: 컴파일 시점에 컴파일러가 부모 클래스만 확인하기 때문 - 다운 캐스팅 필요
// 다형성, 업캐스팅
// 업 캐스팅은 하위 클래스의 객체를 상위 클래스 타입으로 변환하는 것
// 이 경우에는 데이터 손실이 없다.
// 업 캐스팅은 자동적으로 이루어짐으로 별도의 형 변환 연산자가 필요없다.
Animal animal = new Bird(); // 업캐스팅.
다운 캐스팅
- 부모 클래스의 참조를 자식 클래스의 참조로 변환하는 과정
- 업 캐스팅된 참조변수에 대해, 자식 클래스로 사용하겠다고 컴파일러에게 명시하는 과정
- 자식 클래스에 정의된 메서드, 멤버변수 사용하기 위해 씀
- 강제 형 변환과 유사
// 다운 캐스팅
// 다운 캐스팅은 업캐스팅 된 객체를 다시 원래의 하위 클래스 타입으로 변환하는 것
// 다운 캐스팅은 수동적으로 형 변환 연산자를 사용해야 함.
// 업캐스팅 된 객체를 하위 클래스의 메서드, 속성을 사용하기 위해 필요
Bird bird = (Bird)animal; // 다운캐스팅
bird.fly();
instanceof
어떤 객체가 특정한 클래스의 인스턴스인지 확인하는 용도로 사용
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
if (animal1 instanceof Dog) {
System.out.println("animal1은 개입니다!");
}
if (animal2 instanceof Cat) {
System.out.println("animal2는 고양이입니다!");
}
}
}