본문 바로가기

IT

오버로딩과 오버라이딩

728x90

오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것 (new)

오버라이딩 : 상속받은 메서드의 내용을 변경하는 것 (change, modify)

class Parent { void parentMethod() {} }

class Child extends Parent {
	void parentMethod() {} // 오버라이딩
	void parentMethod(int i) {} // 오버로딩
	
	void childMethod() {}
	void childMethod(int i) {} // 오버로딩
}

 

바인딩

오버로딩 : 정적 바인딩, 호출될 메소드가 컴파일 시점에 결정된다. (컴파일 다형성)

오버라이딩 : 동적 바인딩, 호출될 메소드가 실행 시점에 결정된다. (런타임 다형성)

 

바인딩이란 프로그래밍에서 컴각종 값들이 확정되어 더이상 변경할 수 없는 구속(bind) 상태가 되는 것

정적 바인딩 (Static Binding)

  • 원시 프로그램의 컴파일링 또는 링크 시에 확정 되는 바인딩

동적 바인딩 (Dynamic Binding)

  • 프로그램의 실행되는 과정에서 바인딩 되는 것

ex)

int a = 1;
// 데이터 타입 int 로 바인딩 : 정적 바인딩
// 변수명 a 로 바인딩 : 정적 바인딩
// a에 1이라는 값이 바인딩 : 동적 바인딩 

 

 

오버로딩 사용 시 주의점 

매개변수에 대해 어떤 오버로딩 메소드가 호출되는지 분명하게

  • 매개 변수 중 최소한 하나가 근본적으로 다른 타입 (각 타입의 인스턴스를 다른 타입으로 캐스팅 할 수 없는 것)
  • ex) ArrayList<Integer> remove(E) remove(int) </aside>
// <Integer> 타입의 Object와 int 가 상충

// remove(int)
    public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

// remove(Object) 
    public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }