본문 바로가기

Developer/Java-oop

#016. method overriding (메서드 재정의) 알아보기...

#016. method overriding (메서드 재정의) 알아보기...

 

1. 오버라이딩 이란 부모의 메서드를 자신에 맞게 재정의 하는 것이다.

오버라이딩 관계에서는 부모클래스로 upcasting 되어도 자기 자신의 함수를 호출한다.

 

2. 이전에 했던 School 예제에서 조금 더 수정해 보자.

이번엔 overriding 을 하기 위해 아래와 같은 작업을 할 것이다.

학교 = School Class 에 exe 메서드를 만든다.

학생 = Student Class 에도 exe 메서드를 만든다.

교수 = Professor Class 에도 exe 메서드를 만든다.

테스트 = SchoolDemo Class 에 exeTest 메서드를 만들고, 그 안에 exe 메서드를 호출한다.

 

1) 학교 class (School.java)

코드

package oop2;

// 부모 클래스 입니다. 계속 써먹으니 헷갈리시죠? ㅎㅎ

public class School {

    String dept;

    String name;

    

    public void printer(){

        System.out.println("학과:"+dept+", 성명:"+name);

    }

    // 아래코드만 추가됨..

    public void exe() {

        System.out.println("부모(School)객체를 실행합니다.");

    }

}

설명

문장11~13: exe 메서드를 만들었다.

 

2) 학생 class (Student.java)

코드

package oop2;

//자식1 클래스 입니다. 계속 써먹으니 헷갈리시죠? ㅎㅎ

public class Student extends School {

    int grade;

    int score;

    

    public void study(){

        System.out.println("수업을 듣습니다...");

    }

    // 아래코드만 추가됨..

    public void exe() {

        System.out.println("자식1(Student)객체를 실행합니다.");

    }

}

설명

문장11~13: 부모 클래스와 똑같이 exe 메서드를 만든다.

 

3) 교수 class (Professor.java)

코드

package oop2;

//자식2 클래스 입니다. 계속 써먹으니 헷갈리시죠? ㅎㅎ

public class Professor extends School {

    String subject;

    

    public void research(){

        System.out.println("연구를 합니다...");

    }

    // 아래코드만 추가됨..

    public void exe() {

        System.out.println("자식2(professor)객체를 실행합니다.");

    }

}

설명

문장10~12: 부모 클래스와 똑같이 exe 메서드를 만든다.

 

4) 데모 class (SchoolDemo.java)

코드

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 exeTest(School s){

        s.exe();

    }

    

    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((School)pr);

        // 아래코드가 추가되었습니다.

        School sc = new School();

        exeTest(sc);

        exeTest(st);

        exeTest(pr);

    }

}

결과

학과:전산학과, 성명:김동혁

수업을 듣습니다...

학과:국어국문, 성명:김교수

연구를 합니다...

부모(School)객체를 실행합니다.

자식1(Student)객체를 실행합니다.

자식2(professor)객체를 실행합니다.

설명

문장30: School 의 객체를 생성한다.

문장31~33: 각 객체를 자동 upcasting 되어 public static void exeTest(School s) 를 호출 한다.

문장17: upcasting이 된 객체의 exe를 호출을 하면, 자기 자신의 객체에 있는 메서드를 호출하게 된다.

이전시간에 배운 if (sc instanceof Student){ 는 자식의 객체가 많아지면, 코드의 문장도 많아지게 되지만, method overriding 을 사용하면, down casting 을 하지 않고도, 원하는 기능을 사용 할 수가 있다.

 

그럼 다음 시간엔 다른 새로운 예제로 abstract (추상화) 를 알아보자...

 

잡담. 갈수록 내용이 재미있어 지나요? *^^* 오늘도 고생하셨고, 모두 화이팅 입니다^^!