JAVA/기초공부

[JAVA] 메소드 오버라이딩

SoU330 2024. 10. 1. 05:08

 

메소드 오버라이딩 ( 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