티스토리 뷰
다운 캐스팅
(down casting)
업 캐스팅 된 클래스를 다시 원래의 타입으로 형 변환하는 것을 말합니다.
Customer vc = new VIPCustomer(); //묵시적 형변환 : 컴파일러가 코딩을 하는 것
VIPCustomer vCustomer = (VIPCustomer)vc; //명시적 형변환 : 개발자가 직접 코딩을 하는 것
다운 캐스팅을 하려면 개발자가 직접 책임을 지고 명시적 형변환을 통해 수행해야 합니다.
다음 예시로 업캐스팅을 거쳐 다운캐스팅을 해봅시다
public void testDownCasting(ArrayList<Animal> list) {
for(int i =0; i<list.size(); i++) {//기본 반복문을 사용해 다운캐스팅해보자
Animal animal = list.get(i);
if (animal instanceof Human) {
Human human = (Human)animal;// animal이라는 최상위 클래스에 자식클래스를 대입을 하려고 하면 컴파일러의 입장에선 논리적으로 에러이다.
//캐스팅 형변환을 해서 animal앞에 (Human)을 넣는다면 컴파일러는 개발자에게 모든 책임을 넘기고 허용을 해준다.
human.readBooks(); //다운캐스팅 수행(허락)이 가능하다.
}else if(animal instanceof Tiger) {
Tiger tiger = (Tiger)animal;//캐스팅을 개발자가 직접 강제로 캐스팅한다.
tiger.hunting();
}
else if(animal instanceof Eagle) {
Eagle eagle = (Eagle)animal;
eagle.flying();
}
else {
System.out.println("error");
}
}
}
+
Tiger tiger = new Tiger();
Human human = (Human)tiger;
자식끼리의 형변환? 불가하다.
animal = new Animal();
new를 사용하지 않으면 [스택<->힙]에서 animal이 스택에만 존재하게 됩니다
하지만 new를 사용하면 heap에 메모리의 공간이 생성이 된 것!
animal의 자식클래스들이 형변환이 되기전에 메모리공간(동적공간)에 세팅되어 버립니다. 객체가 생성이 되어버린것입니다. extends를 만나기 전단계에 끝나버린 것으로, 업,다운캐스팅의 인식이 불가합니다.
따라서 new라는 연산자를 사용하면 에러가 납니다. 업,다운캐스팅을 하기위해서는 new를 사용하지 말아야하고 instanceof를 사용하는 방법이 있습니다.
Instanceof(참조변수 연산자)를 이용하여 인스턴스의 형 체크할 수 있습니다. 마치 안전장치와도 같은 역할을 합니다.
원래 인스턴스의 형이 맞는지 여부를 체크하는 키워드 맞으면 true 아니면 false를 반환 합니다
쉽게 말하면 (왼쪽 참조변수 instance of 오른쪽 클래스타입)으로 바꿀수 있는지의 여부를 체크해 가능하면 수행하고 아니면 빠져나갑니다.
상속이란 클래스와 클래스간에 확장과 캐스팅형변환이 이루어 지는 것인데,
캐스팅형변환을 개발자가 직접하면서 부모타입의 참조변수와 자식타입의 참조변수간의 상속이 이루어지는 것이 가능하다는 것을 보여줍니다.
업캐스팅이 이루어지면서 부모의 역할을 수행가능하고, 본인이 가지고있는 역할은 접근이 안되는 것이지 사용은 가능한데, 다운캐스팅이 이루어지면서 본인이 가지고 있는 역할에 접근하여 사용가능합니다. //상속받은 기능+ 본연의 기능 = 오버라이드 라는 예외가 있긴합니다.
쉽게 말해 개발자 책임하에 자식이 부모집에 얹혀살다가 독립해 나오면서 상속받은 기능도 사용가능하며 자신이 가지고있는 본연의 역할도 사용 가능하다는 이야기입니다.
'자바(Java)학습 > 3_Java 상속' 카테고리의 다른 글
7.상속은 언제 사용할까? (0) | 2021.09.30 |
---|---|
2.상속을 활용한 멤버십 클래스 구현하기 (0) | 2021.09.23 |
1.객체 간의 상속은 어떤 의미일까? (0) | 2021.09.17 |
- Total
- Today
- Yesterday
- java란
- if if
- 반복문 break continue
- 반복문
- Switch Case
- 자바 연산자 우선순위
- 자바
- 자바 프로그래밍이란
- 자바 if else if else
- 객체지향이란
- java 기초
- if else if
- 자바 if if
- 스프링 로그
- 조건문
- 다운캐스팅
- 중첩반복문
- Downcasting
- java
- 자바 반복문
- 자바 조건문 if else if문
- 스프링 로깅
- 데이터베이스 null
- 자바 switch case
- java 프로그래밍이란
- 자바 do while
- 자바 조건문 if else
- 자바의 기초
- 자바 반복문 for문
- 스프링 logging
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |