TIL/TIL

[JAVA] 오버로딩(overloading) vs 오버라이딩(overriding)

JoJobum 2022. 9. 6.

맨날 헷갈리는 오버로딩과 오버라이딩... 

 

오버로딩(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

댓글