티스토리 뷰
업캐스팅이란 부모 클래스의 자료형으로 자식클래스를 가리키는 것이다.
예를 들어 Person이라는 부모 클래스와 이 클래스를 상속받는 Student,Chile,Adult라는 3개의 자식 클래스가 존재한다고 해보자.
이때 Person* p = new Student(); 와 같이 부모 클래스의 포인터로 자식클래스를 가리키는 현상이다.
이렇게 되면 부모클래스 자료형 p로는 Student에 존재하는 public 멤버 중에서 Person의 멤버만 접근이 가능하다.
다운 캐스팅이란 업캐스팅된 p의 자료형을 다시 자식 클래스의 자료형으로 바꿔주는 작업이다. 이때는 명시적으로 형변환을 해줘야 한다.
Student* s = (Student)p; //명시적 형 변환
이렇게 될 경우 Student 객체를 Student형 포인터로 가리키고 있으므로 Student의 모든 멤버에 접근 가능하다.
하지만 다운 캐스팅을 할때는 조심해 줘야 할 것이 있는데, 아래 상황을 가정해보자.
Person형 객체 배열에 Student,Child,Adult형 객체가 들어있다고 생각해보자. 이때 각각 Person[0] Person[1] Person[2]는 부모 클래스형 포인터로 생각할수 있고, 모두 업캐스팅 된 형태로 배열에 들어가있는것이다.
근데 이때 만약에 내가 이 배열에 있는 객체중에서 Student형 객체를 찾아서 다운캐스팅을 하고 싶을땐 어떻게 해야할까?
(Student)Person[i]; 이런식으로 반복문을 돌려서 강제적 형변환을 하게 될경우 Child형 객체를 Student형으로 바꿔버리는 불상사가 발생할수 있다.
그렇기 때문에 실행시간에 동적으로 객체의 자료형을 확인해서 안전하게 다운 캐스팅 하는 방법인 dynamic_cast<Student *>(Person[i]);
다이나믹 캐스트를 사용해야 한다.
쉽게 말하면, 그 객체의 실제 자료형을 확인해서 Student형이면 Person형->Student형으로 다운캐스트 하겠다는 의미이고, 만약에 Child형 객체와 같은 것이 들어오면 강제적으로 형변환 시키지 않고 null을 리턴하겠다는 의미이다.
이런식으로 다이나믹 캐스트를 사용하게 되면 안전하게 다운 캐스팅을 할 수 있다.
자바에서는 isinstaceof라는 함수를 통해서 그 객체의 실제 자료형이 무엇인지 확인할수 있기 때문에 내가 다운 캐스팅 하려고 하는 자료형에 알맞게 안전하게 확인해가면서 다운 캐스팅을 할 수 있다. c++에서 자바의 isinstanceof함수 역할을 하는것이 다이나믹 캐스트라고 생각하면 될것 같다.
다시 말해서 다운캐스팅을 할때 내가 어떤 자료형으로 다운캐스팅 해야되는지 정확히 알고 있으면, 그냥 그 타입으로 다운캐스팅을 해버리면 되는데,
업캐스팅된 배열같이 반복을 진행해 가면서 어떤 자료형의 객체가 나올지 모르는 상황에서는(어떤 자료형으로 다운캐스팅해야되는지 실행시간에 결정해야 하는 상황) 안전하게 타입을 확인해가면서 다운캐스팅 해야 한다는 의미이다.
'컴퓨터 공학과 졸업 > 객체지향' 카테고리의 다른 글
객체 지향의 4대 특징 (1) | 2018.07.27 |
---|---|
클래스와 객체의 관계 (1) | 2018.07.27 |
다형성이란 (0) | 2018.01.22 |
추상 클래스와 인터페이스 (0) | 2018.01.22 |
자바와 자바 가상 머신 (0) | 2017.09.09 |
- Total
- Today
- Yesterday
- state
- atomic design
- webpack
- promise
- Action
- reactdom
- reducer
- react hooks
- typescript
- design system
- type alias
- javascript
- async
- server side rendering
- return type
- props
- hydrate
- computed
- mobx
- reflow
- await
- rendering scope
- storybook
- Polyfill
- Next.js
- useEffect
- es6
- useRef
- react
- Babel
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |