오버라이딩 정의
오버 라이딩이란 자식 클래스가 부모 클래스의 메소드를 상속 받은 후 해당 메소드들에 대한 수정을 진행 하는 것을 의미한다. 해당 과정에서 기존에 부모 클래스가 사용하던 메소드들이 가지는 input의 갯수와 데이터 타입들은 자식 클래스 에서도 동일하게 적용되어 질 때 오버라이딩이라고 불려진다.
오버로딩 정의
오버 로딩이란 같은 클래스 내에 메소드 이름이 인수가 다른 경우 중복을 허용하는 것을 의미한다.
Q) 왜 필요한가
만약 상속받은 메소드가 자식클래스에서는 받는 인수마다 처리하는 과정이 다르다고 가정한다면 인수가 어떤 것이냐에 따라 메소드의 이름이 다수 생성될 것이다. 이는 중복되는 코드가 다수 생길 수 있습니다. 따라서 이를 방지하고자 오버로딩이 필요한것이다.
오버라이딩 vs 오버로딩
오버라이딩과 오버로딩으로 정의된 메소드들은 파일이 실행되면서 정의되는 시점이 다르다.
오버로딩으로 구현된 메소드는 인수가 다르고 오버라이딩이 된 메소드가 아니기 때문에 컴파일 시에 해당 메소드의 고유성이 보장 될 수 있다. 따라서 오버로딩으로 구현된 메소드는 컴파일 바인딩이 진행되게 된다.
하지만 오버라이딩은 컴파일 시점에는 해당 메소드가 부모 클래스로 부터 온 메소드인지 자식 메소드에서 호출 된 메소드인지 알기 어렵다. 따라서 런타임 바인딩을 진행하게 된다.
오버 라이딩 메소드 정의 과정
오버라이딩의 메소드 정의 과정은 앞써 말한대로 런타임시에 결정이 된다.
과정은 다음과 같다.
- self 참조 생성
- Java에서 객체에 있는 메소드가 호출이 된다면 self 참조 변수를 컴파일러가 임시로 만들고 해당 참조 변수는 호출을 한 메소드가 있는 객체를 가르키게 된다.
- 해당 객체의 클래스에서 호출이 된 메소드를 찾는다
- 이후 메소드를 찾게되면 호출이 되지만 메소드를 찾지 못하면 상위 클래스로 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";}
}
자식 클래스를 부모 클래스 타입으로 인스턴스화 시켰을 때
- 오버라이딩 : 자식 클래스에 있는 메소드가 호출이 된다.
- 오버로딩 : 호출이 되지 못한다.
- 자식 클래스에서만 정의된 메소드 : 호출이 되지 못한다.
왜 이럴까?
오버로딩과 자식클래스에서만 정의된 메소드는 객체가 상위 클래스의 참조타입으로 인스턴스화 되었을 때 상위 클래스 내에서 해당 메소드가 정의 되지 않았기 때문에 호출이 되지 못한다.
하지만 오버라이딩이 된 메소드의 경우 부모클래스에도 해당 메소드가 정의 되기 때문에 해당 메소드는 인스턴스화 되었을 때 들어가질 수 있게 되는 것이다.
'Computer Science' 카테고리의 다른 글
소프트웨어 테스트 (0) | 2022.01.16 |
---|---|
웹 서버와 WAS (0) | 2021.12.29 |
상속과 다형성 (0) | 2021.12.27 |