앞서 배운 클래스 상속에서 연속되는 개념이다.
업캐스팅
하위 클래스에서 상위 클래스로 형변환. 모든 하위 클래스는 상위 클래스로 묵시적 형변환이 가능하다.
하위 클래스에서 상위 클래스 타입을 내포하고 있기 때문이다.
역은 성립하지 않는다.
Animal 클래스가 상위 클래스
Human, Tiger, Eagle가 하위 클래스이다.
하위 클래스는 상위 클래스로 선언 가능하다.
class Animal {
public void move() {
System.out.println("동물이 움직입니다.");
}
public void readBooks() {
System.out.println("독서");
}
}
class Human extends Animal {
public void move() {
System.out.println("사람이 두발로 걷습니다.");
}
}
class Tiger extends Animal {
public void move() {
System.out.println("호랑이가 네발로 뛴다.");
}
public void hunting() {
System.out.println("사냥");
}
}
class Eagle extends Animal{
public void move() {
System.out.println("독수리가 하늘을 날아간다.");
}
public void flying() {
System.out.println("날기");
}
}
메인에서 실행시키면 위와 아래 모두 동일한 결과라는 것을 확인할 수 있다.
public class AnimalTest {
public static void main(String[] args) {
Animal hAnimal = new Human();
Animal tAnimal = new Tiger();
Animal eAnimal = new Eagle();
AnimalTest test = new AnimalTest();
test.moveAnimal(hAnimal);
test.moveAnimal(tAnimal);
test.moveAnimal(eAnimal);
}
//하나의 메소드로 다양한 메소드를 구현 가능
public void moveAnimal(Animal animal) {
animal.move();
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal hAnimal = new Human();
Animal tAnimal = new Tiger();
Animal eAnimal = new Eagle();
ArrayList<Animal> animalList = new ArrayList<>();
animalList.add(hAnimal);
animalList.add(tAnimal);
animalList.add(eAnimal);
for(Animal animal: animalList) {
animal.move();
}
}
}
형변환에서 메모리
Customer vc = new VIPCustomer();에서 vc가 가리키는 것은 Customer이다.
VIPCustomer() 생성자 호출로 인스턴스는 모두 생성되었지만 타입이 Customer이므로 접근가능한 변수와 메서드는 Customer로 제한되어 있다.
클래스 계층구조가 여러 단계인 경우?
가장 아래 리프노드가 자신의 상위 클래스의 타입을 모두 포함하고 있다.
Primate pHuman = new Human();
Mammal mHuman = new Human();
가능하다.
다운캐스팅
상위 클래스에서 하위 클래스로 형변환
가능하긴 하나 업캐스팅과 다르게 명시적으로 형변환을 해야 한다.
Animal hAnimal = new Human();
//다운 캐스팅
Human human = (Human)hAnimal;
human.readBooks();
// 컴파일 시 에러 발생
Eagle eagle = (Eagle)hAnimal;
Eagle 인스턴스 생성은 hAnimal이 Human의 인스턴스 이기 때문에 Eagle로 형변환이 불가능하다.
코드에선 에러가 발생하지 않지만 컴파일 시 에러가 발생한다.
instanceof
인스턴스의 타입을 체크하는 메서드이다.
인스턴스 이름 instanceof 인스턴스 타입
으로 사용하며 인스턴스 타입에 해당한다면 true를, 그렇지않다면 false를 리턴한다.
위에서 다운캐스팅시 코드 에러가 뜨지 않지만 컴파일 시 에러가 발생하므로
에러 발생 방지를 위해 타입을 확인해주는 코드를 넣어주자.
if( hAnimal instanceof Human) { // hAnimal이 Human타입인지 t/f를 반환
Human human = (Human)hAnimal;
human.readBooks();
}
'프로그래밍 언어 > java' 카테고리의 다른 글
[java] final, 템플릿 메서드 (0) | 2021.03.11 |
---|---|
[java] 추상클래스 (0) | 2021.03.11 |
[java] 상속, 생성과정 (0) | 2021.03.09 |
[java] static 변수와 메서드, 싱글톤 패턴 (0) | 2021.02.26 |
[java] this와 참조자료형 (0) | 2021.02.24 |
댓글