맨날 헷갈리는 오버로딩과 오버라이딩...
오버로딩(Overloading)은 한 클래스 내에서 각각 다른 파라미터를 가진 동명의 메소드를 정의
- 컴파일타임에 결정
오버라이딩(Overriding)은 상속된 클래스에서 부모 클래스에 존재하는 메소드를 재정의
- 런타임에 결정
오버로딩
//overloading
public class Overload {
public static void get(List<?> list) {
System.out.println("List");
}
public static void get(ArrayList<?> list) {
System.out.println("ArrayList");
}
public static void get(LinkedList<?> list) {
System.out.println("LinkedList");
}
public static void main(String[] args) {
List<?>[] listArray = { new ArrayList<>(), new LinkedList<>(), new Vector<>() };
Arrays.stream(listArray).forEach(list -> get(list));
}
}
실행 결과는
"ArrayList"
"LinkedList"
"List"
가 아니라
"List"
"List"
"List"
로 나오는데 그 이유는 오버로딩은 컴파일 타임에 결정되는데, new 연산자로 실제 객체를 생성하는 것은 런타임이기에
List<?>[] listArray 입장에서는 어떤 List 클래스 올지 모른다 (??: 진짜 모름)
그래서 List 클래스를 파라미터를 갖는 메소드를 호출하고 결과가 "List List List"가 나온 것 이다
오버라이딩
public class MyList<E> extends ArrayList<E> {
private static final long serialVersionUID = 1L;
@Override
public E get(int index) {
System.out.print("MyList get method returns = ");
return super.get(index);
}
public static void main(String[] args) {
ArrayList<String>[] listArray = new ArrayList[2];
listArray[0] = new ArrayList<String>();
listArray[1] = new MyList<String>();
Arrays.stream(listArray).forEach(list -> list.add("first object"));
Arrays.stream(listArray).forEach(list -> System.out.println(list.get(0)));
}
}
실행 결과는
"first object"
"MyList get method returns = first object"
오버라이딩의 경우는 런타임에 결정되기에 자연스럽게 동작
참고 블로그
오버로딩 & 오버라이딩의 결정 시점 차이 (Overloading & Overriding) :: Happy Sungman (tistory.com)
반응형
'TIL > TIL' 카테고리의 다른 글
[CS] OS 관련 (2) | 2022.09.25 |
---|---|
[JAVA] TIL (0) | 2022.09.06 |
[ML] Face Recognition details (0) | 2022.08.24 |
[CS] 캐시(Cache), 지역성(Locality) (0) | 2022.08.18 |
[ML] Face Recognition (0) | 2022.07.27 |
댓글