Cracking Code

[Java] 메서드 오버라이딩 (Method Overriding) 본문

Java/Java language

[Java] 메서드 오버라이딩 (Method Overriding)

CrackCo 2020. 8. 13. 23:10
상속 관계에 있는 부모 클래스에 정의된 메소드를 자식 클래스에서 다시 정의한 것

메서드 오버라이딩

자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 것을 갖추고 있습니다.

상속 받은 메서드는 그대로 사용할 수도 있지만 자식 클래스에서 필요로 한다면

같은 이름과 같은 매개변수의 메서드로 다시 정의해서 사용할 수 있습니다.

 

오버라이딩의 조건

오버라이딩은 메서드의 동작만을 재정의하는 것입니다.

그러므로 메서드의 선언(반환 타입, 메서드 이름, 매개 변수)은 부모 클래스의 메서드와 같게 해야합니다.

접근 지정자의 경우 부모 클래스의 메서드보다 같거나 더 넓은 범위로만 지정할 수 있습니다.

예외 클래스의 경우 부모 클래스의 메서드보다 같거나 더 좁은 범위로만 지정할 수 있습니다.

 

E.g.

// Employee.java - 부모 클래스
public class Employee {
    private String name;
    private int salary;

    public Employee() { // 기본 생성자
    }

    public Employee(String name, int salary) { // name과 salary를 인자로 받는 생성자 #2
        this.name = name;
        this.salary = salary;
    }
    
    public String getEmployee() {
        return name + " " + salary;
    }
}


// Manager.java - 자식 클래스
public class Manager extends Employee { // Employee 클래스 상속
    private String depart; // 자식 클래스만의 멤버 변수

    public Manager(String name, int salary, String depart) {
        super(name, salary); // 부모의 생성자 #2 를 호출하여 부모 객체 먼저 생성
        this.depart = depart; // 자식 클래스만의 멤버 변수 초기화
    }
    
    @Override
    public String getEmployee() { // 부모 클래스의 getEmployee() 메서드 재정의
    
        // 부모 클래스의 getEmployee() 메서드 반환 값에 자신의 멤버 변수 값 추가 후 반환
        return super.getEmployee() + " " + depart;
    }
}


// Main.java
public class Main {
    public static void main(String[] args) {
        Employee e = new Employee("홍길동", 2000); // 부모 객체 생성
        System.out.println(e.getEmployee()); // 부모 객체의 getEmployee() 메서드 호출

        // 다형성에 의해 부모 클래스 타입이 자식 객체를 가리킬 수 있음
        e = new Manager("이순신", 4000, "개발"); // 자식 객체 생성
        
        // 동적 바인딩, 자동으로 오버라이딩 된 자식 객체의 getEmployee() 메서드 호출
        System.out.println(e.getEmployee());
    }
}

// 실행 결과
홍길동 2000
이순신 4000 개발

부모 클래스인 Employee 클래스는 name:String 과 salary:int 를 멤버 변수로 갖고 있으며

getEmployee():String 메서드를 갖고 있습니다.

 

Employee 클래스를 상속 받은 자식 클래스인 Manager 객체는 depart:String 을 멤버 변수로 갖고 있으며

getEmployee():String 메서드를 갖고 있습니다.

 

원칙적으로 main 메서드에서 자식 클래스의 Manager 객체를 통해 getEmployee() 메서드를 수행하게 된다면

name 변수에 저장된 값과 salary 변수에 저장된 값만 출력되야하지만

자식 클래스에서 메서드를 오버라이딩(재정의)하여 name 값, salary 값, depart 값을 전부 출력하도록 수정했기 때문에

name, salary, depart 값이 전부 출력됩니다.

'Java > Java language' 카테고리의 다른 글

[Java] 추상 클래스 (Abstract class)  (0) 2020.08.25
[Java] 다형성 (Polymorphism)  (0) 2020.08.25
[Java] 상속 (Inheritance)  (0) 2020.08.12
[Java] this 키워드  (0) 2020.08.09
[Java] 생성자 (Constructor)  (0) 2020.08.06
Comments