📌 오버라이딩 (Overriding)

오버라이딩은 부모 클래스에서 상속받은 메서드를 자식 클래스에서 재정의하는 것을 의미한다. 상속받은 메서드를 그대로 사용하지 않고, 자식 클래스에 맞게 내용을 변경하는 것이 필요할 때 오버라이딩을 사용한다.

부모 클래스에서 상속받은 메서드를 자식 클래스에서 이름, 매개변수, 반환 타입을 동일하게 유지하면서 새롭게 재정의하는 것

  • 메서드 이름의 통일성을 유지하면서, 자식 클래스에서 더 구체적인 동작을 정의할 수 있다.
  • 다형성(polymorphism)을 구현할 수 있다. 부모 클래스 타입으로 자식 클래스 객체를 참조할 때, 자식 클래스에서 재정의된 메서드가 호출된다.

🤙🏻 오버라이딩의 조건

  • 메서드 이름, 매개변수, 반환 타입이 부모 클래스와 같아야 한다.
  • 접근 제어자는 부모 클래스 메서드보다 더 좁은 범위로 변경할 수 없다. 예를 들어, 부모 클래스 메서드의 접근 제어자가 protected라면, 자식 클래스는 protected 또는 public으로만 오버라이딩할 수 있다.
  • 인스턴스 메서드static 메서드로, 또는 그 반대로 변경할 수 없다.
class Parent {
    void display() {
        System.out.println("Parent method");
    }
}

class Child extends Parent {
    @Override
    void display() { // 오버라이딩: 부모 메서드 재정의
        System.out.println("Child method");
    }
}

🚨 오버로딩(Overloading) vs 오버라이딩(Overriding)

🌀 오버로딩(Overloading)
같은 이름을 가진 새로운 메서드를 추가하는 것이다. 즉, 메서드 이름은 같지만 매개변수의 타입 또는 개수가 다를 때 오버로딩이 성립한다. 반환 타입은 달라도 상관없다.

메서드 이름을 일관되게 유지하면서, 다양한 매개변수로 호출할 수 있도록 유연성을 높이는 것

class Example {
    void display(int a) {
        System.out.println(a);
    }
    void display(String s) {
        System.out.println(s);
    }
}

📝 오버라이딩(Overriding)
부모 클래스의 메서드를 재정의하는 것이다. 메서드의 이름, 매개변수, 반환 타입이 완전히 동일해야 하며, 자식 클래스에서 부모 클래스의 메서드를 새로운 방식으로 동작하게 만든다.

상속받은 메서드를 자식 클래스에 맞게 변경하여 동작을 맞추는 것


⭐️ 자식 객체와 부모 객체의 관계

class Parent {
    Parent() {
        System.out.println("Parent : " + this );
    }
}

class Child extends Parent {
    Child() {
        System.out.println("Child : " + this);
    }
}

public class InheritanceEx03 {
    public static void main(String[] args) {
        Child c = new Child();
        System.out.println("c : " + c);
    }
}

출력 결과:

Parent : Child@4e25154f
Child : Child@4e25154f
c : Child@4e25154f

** 자식 클래스 객체 `Child`는 **부모 클래스 `Parent`를 포함**하고 있기 때문
  • 자바에서 객체를 생성할 때, 자식 객체는 부모 객체도 함께 생성된다. 즉, 자식 객체는 부모 객체를 포함하는 구조로, 하나의 객체 안에 부모와 자식 클래스의 모든 필드와 메서드가 함께 존재하게 된다.
  • 따라서 자식 클래스의 인스턴스를 생성할 때 this 키워드가 가리키는 객체는 자식 클래스와 부모 클래스 모두가 속해 있는 하나의 객체이다. 그래서 부모 클래스와 자식 클래스 모두 같은 주소값을 가진다.

자식 클래스 객체를 생성할 때 부모 클래스의 생성자가 자동으로 먼저 호출된다. 자식 클래스는 부모 클래스의 모든 필드와 메서드를 상속받기 때문에, 자식 클래스 객체는 부모 클래스와 자식 클래스의 모든 특성을 하나의 객체로 관리하게 된다.

📌
자식 객체는 부모 객체를 포함하고, 자식 객체와 부모 객체는 같은 메모리 공간(주소)을 공유한다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN