Computer Science

오버라이딩 vs 오버로딩

Jinhwan 2021. 12. 28. 21:48

오버라이딩 정의


오버 라이딩이란 자식 클래스가 부모 클래스의 메소드를 상속 받은 후 해당 메소드들에 대한 수정을 진행 하는 것을 의미한다. 해당 과정에서 기존에 부모 클래스가 사용하던 메소드들이 가지는 input의 갯수와 데이터 타입들은 자식 클래스 에서도 동일하게 적용되어 질 때 오버라이딩이라고 불려진다.


오버로딩 정의


오버 로딩이란 같은 클래스 내에 메소드 이름이 인수가 다른 경우 중복을 허용하는 것을 의미한다.

Q) 왜 필요한가

만약 상속받은 메소드가 자식클래스에서는 받는 인수마다 처리하는 과정이 다르다고 가정한다면 인수가 어떤 것이냐에 따라 메소드의 이름이 다수 생성될 것이다. 이는 중복되는 코드가 다수 생길 수 있습니다. 따라서 이를 방지하고자 오버로딩이 필요한것이다.


오버라이딩 vs 오버로딩

 

https://mangkyu.tistory.com/193

오버라이딩과 오버로딩으로 정의된 메소드들은 파일이 실행되면서 정의되는 시점이 다르다.

오버로딩으로 구현된 메소드는 인수가 다르고 오버라이딩이 된 메소드가 아니기 때문에 컴파일 시에 해당 메소드의 고유성이 보장 될 수 있다. 따라서 오버로딩으로 구현된 메소드는 컴파일 바인딩이 진행되게 된다.

하지만 오버라이딩은 컴파일 시점에는 해당 메소드가 부모 클래스로 부터 온 메소드인지 자식 메소드에서 호출 된 메소드인지 알기 어렵다. 따라서 런타임 바인딩을 진행하게 된다.


오버 라이딩 메소드 정의 과정

오버라이딩의 메소드 정의 과정은 앞써 말한대로 런타임시에 결정이 된다.

과정은 다음과 같다.

  1. self 참조 생성
  2. Java에서 객체에 있는 메소드가 호출이 된다면 self 참조 변수를 컴파일러가 임시로 만들고 해당 참조 변수는 호출을 한 메소드가 있는 객체를 가르키게 된다.
  3. 해당 객체의 클래스에서 호출이 된 메소드를 찾는다
  4. 이후 메소드를 찾게되면 호출이 되지만 메소드를 찾지 못하면 상위 클래스로 self 참조변수가 넘어가서 메소드를 찾게 된다.

Q) 만약 오버라이딩이 된 메소드를 가지는 클래스를 부모 클래스로 참조 타입을 선언을 한다면 어떻게 자식클래스의 메소드가 호출이 될까?

public class main
{
    public static void main(String[] args)
    {
		//오버 라이딩
        System.out.println("====");
        A obj = new B();
        System.out.println(obj.x()); 
        // "B.x1

		//오버로딩
        System.out.println(obj.x(10));
        //method x in class A cannot be applied to given types;

		//자식 클래스에만 존재하는 메소드 호출
        System.out.println(obj.y()); //  
        cannot find symbol
        System.out.println("====");

    }
}

class A{
    public String x(){return "A.x";}
}

class B extends A{
    public String x(){return "B.x";}
	public String x(int a){return a}
    public String y(){return "y";}
}

자식 클래스를 부모 클래스 타입으로 인스턴스화 시켰을 때

  • 오버라이딩 : 자식 클래스에 있는 메소드가 호출이 된다.
  • 오버로딩 : 호출이 되지 못한다.
  • 자식 클래스에서만 정의된 메소드 : 호출이 되지 못한다.

왜 이럴까?

오버로딩과 자식클래스에서만 정의된 메소드는 객체가 상위 클래스의 참조타입으로 인스턴스화 되었을 때 상위 클래스 내에서 해당 메소드가 정의 되지 않았기 때문에 호출이 되지 못한다.

하지만 오버라이딩이 된 메소드의 경우 부모클래스에도 해당 메소드가 정의 되기 때문에 해당 메소드는 인스턴스화 되었을 때 들어가질 수 있게 되는 것이다.