우리는 오버라이딩 이라는 것을 배웠다.
하지만 인터페이스의 경우 오버라이딩의 문제점이 없지만
상속의 경우 오버라이딩의 사용을 주의깊게 해야한다.
이게 무슨뜻일까 한번 예제로 보자.
public class parent {
public static void main(String[] args) {
parent parent =new parent();
System.out.println(parent.sum(1,2));
child child = new child();
System.out.println(child.sum(1,2));
parent parents = new child();
System.out.println(parents.sum(1,2));
}
int sum(int x,int y){
return x+y;
}
}
class child extends parent{
@Override
int sum(int x, int y) {
return x-y;
}
}
이러한 코드가 있고
사진으로 본다면 이런느낌이다.
여기에서 본다면 parent 클래스는 sum이라는 메서드를 가지고 있고
child는 sum의 메서드를 오버라이딩 한 상태이다.
하지만 여기서 잘 봐야한다.
일반 기본적으로 오버라이딩이 된 경우에
parent parent =new parent();
이렇게 생성이되면 객체 타입이 부모클래스 이기때문에
parent 변수로 sum을 불러와도 child 클래스에 오버라이딩이 1번되어있든 천번 되어있던
영향이 1도없다.
parent parent =new parent();
즉 객체 타입과 생성자 타입을 부모객체로 선언하면 child의 오버라이딩이 되어있든 없든
"무조건" 부모에 있는 메서드를 호출한다.
두 번째의 경우 객체 타입을 child로 줬음으로
child의 있는 sum이 호출될 것 이다.
위에서도 말했지만 객체 타입이 child이면 부모 클래스를 명시적으로 상속받은 것임으로
오버라이딩이 된 메서드가 실행됨으로 값은 -1이 될 것이다.
하지만 상속으로 다형성을 사용한 경우에는 어떻게 될까?
이렇게 부모 클래스를 주고 생성자를 부모 생성자로 사용하면 얘기가 조금 달라진다.
분명 객체는 parent이지만 다형성의 의해서 부모 메서드가 실행되는 것이 아닌
child의 메서드가 실행된다.
즉 그림으로 본다면 이 child의 메서드가 실행되는 것 이다.
그렇기 때문에 사용을 조심해야한다.
상속의 경우는 사용해서도 안되지만 자바에서는 다형성이 필수 요소이다.
하지만 이렇게 다형성을 이용해서 사용한다면 이렇게 오버라이딩이 된 코드가 나오는 것 이다.
나의 의도와는 상관없이 다른 코드가 나오는 것 이다.
그렇기에 상속을 사용할땐 항상 조심해야 한다.
쉽게 생각한다면
객체 타입이 부모 클래스이면 오버라이딩 절대 안된다 XXX
객체 타입이 자식 타입이면 오버라이딩 된다 O
다형성을 사용하면 객체 타입이 부모 클래스라도 반드시 자식의 오버라이딩된 메서드가 나온다.
즉 객체 생성할때 자식과 조금이라도 관련이 있으면 오버라이딩 되서 나온다고 생각하면 쉽다
이해가 됐다면 이 문제를 한번 풀어보라.
이것이 풀린다면 오버라이딩의 개념을 이해한 것 이다.
답은 : 11
'JAVA 기초' 카테고리의 다른 글
[자바 기초] Return 과 break의 개념과 차이 점 - With Java (0) | 2023.08.03 |
---|---|
[자바 기초] if 와 esle if의 차이 점 (0) | 2023.07.31 |
[자바 기초] 자바 객체 생성 이글 하나로 완벽히 이해하자. (0) | 2023.07.04 |
자바,C언어 변수 초기화 안하면 생기는 일 ,변수 초기화 뜻 (0) | 2023.06.29 |
[자바 기초] 객체 참조란? 객체 참조에 대해 알아보자. (0) | 2023.06.28 |