본문 바로가기

Developer/Java-oop

#015. upcasting / downcasting 알아보자...

#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 (메서드 재정의)에 대해서 알아보겠다.

 

잡담. 오늘도 고생하셨습니다. (__) 화이팅~