#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 (추상화) 를 알아보자...
잡담. 갈수록 내용이 재미있어 지나요? *^^* 오늘도 고생하셨고, 모두 화이팅 입니다^^!
'Developer > Java-oop' 카테고리의 다른 글
#018. Interface (인터페이스) 알아보기... (0) | 2011.04.07 |
---|---|
#017. abstract (추상화) 알아보기... (0) | 2011.04.06 |
#015. upcasting / downcasting 알아보자... (0) | 2011.03.31 |
#014. inheritance (상속) 알아보자... (0) | 2011.03.31 |
#013. package / import 알아보자... (0) | 2011.03.30 |