일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- TiL_1st_0419
- 생성자
- JVM
- 스레드
- static
- Diary 해우소
- 스파르타내일배움캠프TIL
- #내일배움캠프
- GitHub
- 스파르타내일배움캠프
- 클래스
- 내일배움캠프
- diary
- 메서드
- 인스턴스
- Github_token
- #스파르타내일배움캠프TIL
- 성장기록
- Git
- KPT
- 변수의 다양성
- 회고록
- Token
- 포맷은 최후의 보루
- 객체지향 언어
- #스파르타내일배움캠프
- Java
- 감사기록
- Java의 이점
- 해우소
- Today
- Total
몬그로이
다형성 캐스팅 본문
흔히 부모와 자식의 상속이라고 표현하기 때문에
나 또한 Parent(부모) 와 Childe(자식) 이라고 표현하겠다
Parent 가 Child 에게 extend 해 준다
Parent 클래스는 Child 클래스에 비해 추상적이다
Child 클래스는 Parent 클래스에 비해 논리적이다
그렇기 때문에 상속이 되면 개념의 범위가 달라진다
개념이 더 좁혀지고, 메서드는 더 구체적이 된다
하지만, 필드값은 변화가 없다
Parent 클래스는 개념의 범위가 더 크기 때문에 더 큰 창고가 필요하다
Child 클래스는 개념의 범위가 더 작기 때문에 더 작은 창고라도 충분하다
그렇기 때문에
Parent 타입을 담을 수 있는 A 는 Child 타입의 인스턴스를 받을 수 있다
하지만 Child 타입을 담을 수 있는 B 는 Parent 타입의 인스턴스를 받을 수 없다
필드 값은 고정된 값이므로 Parent 와 Child 둘 다 서로 가지는 구성품이다
Parent 클래스에 정의되는 메서드가 더 추상적이기 때문에 로직이 간단하다
Child 클래스에 정의되는 메서드가 더 구체적이기 때문에 로직이 복잡하다
따라서
Child 타입을 담은 Parent 타입을 담는 A라고 할지라도 Child 클래스의 메서드를 사용할 수는 없다
Parent 타입을 담은 Child 는 있을 수 없기 때문에 논외이다
하지만
캐스팅이라는 기능을 이용하면
Child 타입을 담을 수 있는 B도 강제로 Parent 타입의 인스턴스를 받을 수 있다
Parent parent1 = new Parent;
Parent parent2 = new Child;
Child child = new Child;
Parent parent3 = child;
Child child1 = (Child) parent1;
Child child2 = (Child) parent2;
Child child3 = (Child) parent3;
|
cs |
-> child1
Parent 타입을 받은 Parent 타입의 parent1을 받는 경우로
Child타입을 담는 그릇으로는 Parent 타입을 받을 수 없어 논외(미스캐스팅, 컴파일 오류)
-> child2
Child 타입을 받은 Parent 타입의 parent2 를 받는 경우
처음부터 Child 타입을 받았기에 child2 가 가지게 되는 건 Child 타입이므로
Child 클래스의 메서드를 사용할 수 있다
즉, child2.childMethod(); 가능
child2.parentMethod(); 가능
-> child3
Child 타입을 받은 child 를, Parent 타입을 받는 parent3 가 받았는데
그 parent3를 Child 타입을 받는 child3 가 받는 경우
child3는 Child 클래스의 메서드를 사용할 수 있다
즉, child3.childMethod(); 가능
child3.parentMethod(); 가능
@Override
Parent 클래스의 메서드를 Child 클래스에서 재정의 후 표시할 때 사용
앞서
Child 타입을 담은 Parent 타입을 담는 A라고 할지라도 Child 클래스의 메서드를 사용할 수는 없다
라고 이야기 했었다
하지만 @Override 를 설정한 후에는 아래와 같다
Parent parent = new Child;
parent.ParentValue; 의 결과는 parent.parentValue; 인 반면,
parent.ParentMethod(); 의 결과는 child.ChildMethod(); 가 된다
비교
Parent paretn = new Parent
parent.ParentValue; 의 결과는 parent.ParentValue;
parent.ParentMethod(); 의 결과는 parent.ParentMethod();
'Dev 언어 정리 & Self QnA > Java' 카테고리의 다른 글
Import 없이 사용 가능한 Class (0) | 2024.05.21 |
---|---|
프로세스의 자원을 스레드가 공유한다? (0) | 2024.05.03 |
void와 return && for문, sout 와 return값 (0) | 2024.04.26 |
왜 때문인지 혼란스러웠던 클래스 멤버와 인스턴스 멤버 설명해보기 (0) | 2024.04.25 |
이름이 동일한 method? (0) | 2024.04.25 |