오버라이딩은 부모 클래스에서 상속받은 메서드를 자식 클래스에서 재정의하는 것을 의미한다. 상속받은 메서드를 그대로 사용하지 않고, 자식 클래스에 맞게 내용을 변경하는 것이 필요할 때 오버라이딩을 사용한다.
부모 클래스에서 상속받은 메서드를 자식 클래스에서 이름, 매개변수, 반환 타입을 동일하게 유지하면서 새롭게 재정의하는 것
protected
라면, 자식 클래스는 protected
또는 public
으로만 오버라이딩할 수 있다.class Parent {
void display() {
System.out.println("Parent method");
}
}
class Child extends Parent {
@Override
void display() { // 오버라이딩: 부모 메서드 재정의
System.out.println("Child method");
}
}
🌀 오버로딩(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
키워드가 가리키는 객체는 자식 클래스와 부모 클래스 모두가 속해 있는 하나의 객체이다. 그래서 부모 클래스와 자식 클래스 모두 같은 주소값을 가진다.자식 클래스 객체를 생성할 때 부모 클래스의 생성자가 자동으로 먼저 호출된다. 자식 클래스는 부모 클래스의 모든 필드와 메서드를 상속받기 때문에, 자식 클래스 객체는 부모 클래스와 자식 클래스의 모든 특성을 하나의 객체로 관리하게 된다.
📌
자식 객체는 부모 객체를 포함하고, 자식 객체와 부모 객체는 같은 메모리 공간(주소)을 공유한다.