[Java] 오버로딩

2024. 5. 9. 23:04Backend/Java

728x90

🎯 오버로딩

1.1 오버라이딩이란?

조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것

 

1.2 오버라이딩의 조건

  • 선언부가 같아야 한다.(이름, 매개변수, 리턴타입)
  • 접근제어자를 좁은 범위로 변경할 수 없다.
    조상의 메서드가 protected라면,  범위가 같거나 넓은 protected나 public으로만 변경할 수 있다.
  • 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다. 

 

1.3 오버로딩 vs. 오버라이딩

  • 오버로딩     - 기존에 없는 새로운 메서드를 정의하는 것(new)
  • 오버라이딩 - 상속받은 메서드의 내용을 변경하는 것(change, modify)

 

1.4 오버로딩, 오버라이딩 예제

class Parent{
    void parentMethod() {}
}

class  Child extends Parent {
    void parentMethod() {}      // 오버라이딩
    void parentMethod(int i) {} // 오버로딩

    void childMethod() {}
    void childMethod(int i) {}  // 오버로딩
    void childMethod() {}       // 에러(중복정의)
}

 

💡

조상 클래스에 정의된 static메서드를 자손 클래스에서 똑같은 이름의 static메서드로 정의할 수 있지만

이것은 각 클래스에 별개의 static 메서드를 정의한 것일 뿐 오버라이딩이 아니다.

static멤버들은 자신들이 정의된 클래스에 묶여있다고 생각하면 편할 것이다.


2.1 super

super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조 변수.

  • this - 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어 있음
    모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재
  • super - this와 같음. 조상의 멤버와 자신의 멤버를 구별하는 데 사용.
class Parent {
    int x = 10;
}

class Child extends  Parent {
    void method() {
        System.out.println("x = " + x);
        System.out.println("this.x = " + this.x);
        System.out.println("super.x = " + super.x);
    }
}

public class Test {
    public static void main(String[] args) {
      Child c = new Child();
      c.method();
    }
}

실행결과

x = 10

this.x = 10

super.x = 10

x, this.x, super.x 모두 같은 변수를 의미하므로 같은 값 출력

 

2.2 super()

this()와 마찬가지로 super()도 생성자이다. this()는 같은 클래스의 다른 생성자를 호출하는 데 사용하고,

super()는 조상 클래스의 생성자를 호출하는데 사용된다.

 

  • 자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
  • 조상의 멤버들도 초기화되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.
class Point {
    int x = 10;
    int y = 20;

    Point(int x, int y) {
        // 생성자 첫 줄에서 다른 생성자를 호출하지 않아서 컴파일러가 super()를 여기에 삽입
        this.x = x;
        this.y = y;
    }
}

class Point3D extends Point {
    int z = 30;

    Point3D() {
        this(100, 200, 300);        // Point3D(int x, int y, int z)를 호출
    }

    Point3D(int x, int y, int z) {
        super(x, y);                        // Point(int x, int y)를 호출
        this.z = z;
    }
}

public class Test {
    public static void main(String[] args) {
       Point3D p3 =new Point3D();
        System.out.println("p3.x = " + p3.x);
        System.out.println("p3.y = " + p3.y);
        System.out.println("p3.z = " + p3.z);

    }
}

실행결과

p3.x = 100

p3.y = 200

p3.z = 300

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

[Java] 추상클래스  (0) 2024.05.10
[Java] 다형성  (0) 2024.05.10
[Java] 상속  (0) 2024.05.09
[Java] 클래스와 객체2  (0) 2024.05.09
[Java] 클래스와 객체  (0) 2024.05.08