메소드 오버라이딩 ( Method Overridings )
: 부모 클래스에서 정의된 메소드를 자식 클래스에서 재정의하여 사용하는 것
- 오버라이딩은 다형성을 구현하는 중요한 방법 중 하나
- 자식 클래스에서 부모 클래스의 메소드를 그대로 사용하는 대신 해당 메소드의 기능을 자식 클래스에 맞게 재정의하는 경우에 사용
오버라이딩과 오버로딩의 차이점
오버로딩 : 같은 클래스 내에서 메소드 이름은 같지만 매개변수의 개수나 타입이 다른 여러 메소드를 정의하는 것
오버라이딩 : 상속받은 메소드를 자식 클래스에서 재정의 하는 것
자바에서 오버라이딩이 존재하는 이유
1. 다형성 구현
다형성 : 같은 인터페이스나 상위 클래스의 메소드가 여러 형태로 동작할 수 있도록 하는 객체 지향 프로그래밍의 중요한 개념
오버라이딩을 통해 부모 클래스 타입으로 자식 클래스의 메소드를 호출할 수 있게 되어, 동일한 메소드 호출이 객체의 실제 타입에 따라 다른 동작을 수행하게 된다.
2. 상속받은 메소드를 자식 클래스에 맞게 재정의
부모 클래스는 일반적이고 공통적인 동작을 정의할 수 있지만 자식 클래스는 상황에 맞게 그 동작을 수정해야 할 경우가 많다.
오버라이딩을 통해 부모 클래스에서 제공하는 기본 메소드의 동작을 그대로 사용하지 않고 자식 클래스에 적합한 방식으로 재정의할 수 있다.
3. 코드의 재사용성과 유지보수성 향상
공통 기능은 부모 클래스에서 구현하고 필요한 부분만 자식 클래스에서 변경할 수 있기 때문에 코드 중복을 줄이고 유지보수를 쉽게 할 수 있다.
4. 유연하고 확장 가능한 설계
새로운 기능을 추가하거나 변경할 때 부모 클래스의 코드를 그대로 사용할 수 있는 동시에 필요한 부분만 자식 클래스에서 수정할 수 있기 때문에 기존 코드를 수정하지 않고도 새로운 클래스를 쉽게 확장할 수 있다.
메소드 오버라이딩 예1
부모 클래스 OldPerson
public class OldPerson {
protected String name;
protected int age;
protected String address;
// 멤버변수에 저장된 값을 출력
public void displayPerson() {
System.out.printf("이름 : %s, 나이 : %d, 주소 : %s\n",name,age,address);
}
}
자식 클래스 OldStudent
public class OldStudent extends OldPerson{
protected int number; // 학번
protected String memClass; // 학과
protected String subject; // 전공
protected String grade; // 성적
// 상속 받은 클래스 내의 displayPerson() 메소드를 오버라이딩(재정의)
public void displayPerson() {
System.out.printf("이름 : %s, 나이 : %d, 주소 : %s\n",name,age,address);
System.out.printf("학번 : %d, 학과 : %s, 전공 : %s, 성적 : %s\n",number,memClass,subject,grade);
}
}
테스트 코드
public class OverridingTest_01 {
public static void main(String[] args) {
OldPerson person = new OldPerson();
person.name = "아빠";
person.age = 57;
person.address = "하계동";
person.displayPerson();
System.out.println();
// OldStudent 클래스는 Oldperson 클래스로 부터 상속받아서 student 생성
OldStudent student = new OldStudent();
student.name = "아들";
student.age = 23;
student.address = "방";
student.number = 20003324;
student.memClass = "소프트웨어학과";
student.subject = "파이썬";
student.grade = "A+";
student.displayPerson();
}
}
결과
-> 같은 이름의 메소드 displayPerson() 을 사용하였는데 하위 클래스에서 재정의 한대로 구현되어 person 객체와 student 객체의 동작이 약간 다르다.
메소드 오버라이딩 예2
상위 클래스 Person
public class Person {
protected String name;
protected int age;
// 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 멤버변수에 저장된 값 출력
public void printInfo() {
System.out.println("<개인>");
System.out.printf("이름 : %s\n",name);
System.out.printf("나이 : %d\n",age);
}
}
Person 을 상속받은 Professer 클래스
public class Professor extends Person{
private String major;
public Professor(String name, String major, int age) {
super(name,age);
this.major = major;
}
// 상속받은 클래스로부터 printInfo() 메서드 오버라이딩
public void printInfo() {
System.out.println("<교수>");
System.out.printf("이름 : %s\n",name);
System.out.printf("나이 : %d\n",age);
System.out.printf("전공 : %s\n",major);
}
}
Person을 상속받은 Student 클래스
public class Student extends Person{
private String majorClass, grade;
// 생성자
public Student(String name, String majorClass, String grade, int age){
super(name,age);
this.majorClass = majorClass;
this.grade = grade;
}
// printInfo 메서드를 오버라이딩
public void printInfo() {
System.out.println("<학생>");
System.out.printf("이름 : %s\n",name);
System.out.printf("나이 : %d\n",age);
System.out.printf("학과 : %s\n",majorClass);
System.out.printf("학년 : %s\n",grade);
}
}
테스트 코드
public class OverridingTest_02 {
public static void main(String[] args) {
Person person = new Person("유진",25);
Professor professor = new Professor("교수님","가르치기 싫어학과",55);
Student student = new Student("학생님","공부하기 싫어학과","3학년",22);
person.printInfo();
professor.printInfo();
student.printInfo();
}
}
결과
-> 같은 이름의 메소드라도 각각의 클래스에 맞게 재정의한대로 실행된다.
'JAVA > 기초공부' 카테고리의 다른 글
[JAVA] 형 변환, static, final (2) | 2024.10.09 |
---|---|
[JAVA] 접근 제한자 (11) | 2024.10.03 |
[JAVA] 패키지 (3) | 2024.09.29 |
[JAVA] String 클래스 (1) | 2024.09.29 |
[JAVA] this와 this() 메소드 (0) | 2024.09.28 |