자바_오버라이딩

Larry·2021년 7월 12일
0
post-thumbnail

오버라이딩(overriding)

오버라이딩이란?

조상클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.
상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스의 메서드에 맞게 변경해야하는 경우가 많아 조상의 메서드를 오버라이딩을 한다.

오버라이딩의 조건

오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로, 메서드의 선언부는 조상의 것과 완전히 일치해야 한다.

자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
1. 이름이 같아야 한다.
2. 매개변수가 같아야 한다.
3. 반환타입이 같아야 한다.

오버로딩과 오버라이딩

많은 자바에 입문하는 사람들이 헷갈려하는 부분 중 하나가 오버로딩과 오버라이딩의 차이에 대해 헷갈려하는 경우가 많다. 필자 또한 둘의 차이를 이해하지 못해 많은 도서를 읽어보며 이해하게 되었다.
일단 형식적인 둘의 차이는 다음과 같다.

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

즉 새로운 메서드를 만들면 오버로딩, 상속받은 메서드의 내용만을 바꾼다면 오버라이딩이라고 생각하면 된다.

class Parent {
	void parentMethod() {}
}

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

super

super는 자손 클래스에서 조상클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다. 멤버변수와 지역변수의 이름이 같을 떄 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 멤버와 이름이 같을 때는 super를 붙여서 구별할 수 있다.

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

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);
    }
}

실행결과
x = 10
this.x = 10
super.x = 10

이 경우에는 x, this.x, super.x 모두 같은 변수를 의미하여 모두 같은 값이 출력되었다.

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

class Parent
{
   int x = 10;
}

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

실행결과
x = 20
this.x = 20
super.x = 10

super.x는 조상 클래스(Parent)로부터 상속받은 멤버변수 x를 뜻하며, this.x는 자손 클래스(Child)에 선언된 멤버변수를 뜻한다.

super() - 조상 클래스의 생성자

super() 또한 this()와 같이 생성자이다. this()는 같은 클래스의 다른 생성자를 호출하는 데 사용되지만, super()는 조상 클래스의 생성자를 호출하는데 사용된다.

class PointTest {
    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);
    }
}

class Point {
    int x = 10;
    int y = 20;

    Point(int x, int y) {
        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;
    }
}

위의 코드를 보면 어떤 클래스의 인스턴스를 생성하면, 클래스 상속관계의 최고조상인 Object클래스까지 거슬러 올라가면서 모든 조상클래스의 생성자가 순서대로 호출된다는 것을 알 수 있다.

참고 자바의 정석 p327 ~ p335

profile
Be yourself, no matter what they say

0개의 댓글

관련 채용 정보