#015. upcasting / downcasting 알아보자...
1. upcasting 은 자식객체를 부모타입의 객체에 저장을 할 수가 있다. 부모타입으로 저장된 자식의 객체는 자식의 내용을 처리 할 수가 없다. 이것이 캡슐화다.
downcasting 은 이렇게 캡슐화된 객체로 어떤 자식인지 구별 할 수 있다면, 자식의 내용도 처리 할 수 있는 것을 말한다.
2. 먼저 upcasting 에 대해서 테스트를 해보자.
이전시간에 했던 예제 중 SchoolTest Class 의 내용을 변경해서 작성해보자.
코드 | package oop2; public class SchoolDemo { public static void printerTest(School sc) { sc.printer(); } public static void printerTest(Student st) { st.study(); } public static void printerTest(Professor pr) { pr.research(); }
public static void main(String[] args) { Student st = new Student(); st.dept = "전산학과"; st.name = "김동혁"; st.grade = 2; st.score = 99; Professor pr = new Professor(); pr.dept = "국어국문"; pr.name = "김교수"; pr.subject = "언어학"; printerTest((School)st); // 기존코드=printerTest(st) printerTest((School)pr); // 기존코드=printerTest(pr) } } |
결과 | 학과:전산학과, 성명:김동혁 // 기존결과 수업을 듣습니다... 학과:국어국문, 성명:김교수 // 연구를 합니다... |
설명 | 문장17,18: upcasting 한것이다. 각각의 객체를 School 객체로 변환해서 문장3의 printerTest가 호출이 되는 것을 확인 할 수 있다. |
3. 이번엔 printerTest 한번의 호출로 학생, 교수의 출력인 각각의 메서드 (study(),research()) 기능도 같이 호출 하고 싶다. 이때 사용되는 것이 downcasting 이다.
또, 위 예제로 수정을 좀 하겠다.
코드 | package oop2; public class SchoolDemo { public static void printerTest(School sc) { sc.printer(); if (sc instanceof Student){ ((Student)sc).study(); } else if (sc instanceof Professor){ ((Professor)sc).research(); } } // 아래의 내용은 변경된게 없습니다. (^^;) public static void printerTest(Student st) { st.study(); } public static void printerTest(Professor pr) { pr.research(); }
public static void main(String[] args) { Student st = new Student(); st.dept = "전산학과"; st.name = "김동혁"; st.grade = 2; st.score = 99; Professor pr = new Professor(); pr.dept = "국어국문"; pr.name = "김교수"; pr.subject = "언어학"; printerTest((School)st); // 기존코드=printerTest(st) printerTest((School)pr); // 기존코드=printerTest(pr) } } |
결과 | 학과:전산학과, 성명:김동혁 수업을 듣습니다... 학과:국어국문, 성명:김교수 연구를 합니다... |
설명 | 기존 소스에서 (문장5~9) 이부분만 변경이 됐다. 문장5: sc 가 Student 의 원래 Student의 객체인지 확인을 한다. 문장6: 자신의(Student) 원래 형태로 캐스팅(downcasting)후 Student 고유의 기능중 study()를 호출한다. 문장7: 객체를 확인한다. 문장8: 역시 자신이 속한 클래스로 변형 후 고유의 기능인 research()를 호출한다. |
다음 시간엔 method overriding (메서드 재정의)에 대해서 알아보겠다.
잡담. 오늘도 고생하셨습니다. (__) 화이팅~
'Developer > Java-oop' 카테고리의 다른 글
#017. abstract (추상화) 알아보기... (0) | 2011.04.06 |
---|---|
#016. method overriding (메서드 재정의) 알아보기... (0) | 2011.04.01 |
#014. inheritance (상속) 알아보자... (0) | 2011.03.31 |
#013. package / import 알아보자... (0) | 2011.03.30 |
#012. access modifier (접근제한자) 알아보기... (0) | 2011.03.30 |