하나의 클래스 내에서 동일한 이름의 메서드를 여러 개 사용할 수 있는 객체지향 기법
System.out.println("String");
System.out.println('c');
System.out.println(10);
System.out.println(10.2f);
System.out.println(false);
오버로딩 메서드의 예시: System.out.println 함수
System.out.println 함수는 어떤 인자를 넣어도 프린트가 된다. 이 역시 한 클래스에 같은 이름으로 여러 개의 함수를 시그니처만 다르게 하여 메서드를 정의하였기 때문이다.
시그니처: 매개변수의 개수, 매개변수의 타입컴파일 시점에 사용될 메서드가 결정되고 변경되지 않는 바인딩 방식

오버로딩은 정적 바인딩을 통해 구현된다.
컴파일 시점에 컴파일러는 메서드의 오버로딩이 있을 때 전달된 인자의 개수와 타입(시그니처)을 보고 어떤 함수를 호출할지 결정(바인딩)한다.
필요한 경우 컴파일 시점에 메서드의 이름을 내부적으로 변경하여 바인딩한다(매개변수 타입을 언더스코어로 잇는다).
따라서 런타임에 이미 어떤 함수가 호출될지 결정되어 있으므로 오버로딩은 실행 시간에 검색 작업(중복된 이름을 가진 메서드들 중 전달 인자와 일치하는 시그니처를 가진 메서드를 찾는 것)으로 인한 성능 저하를 초래하지 않는다.
자식 클래스에서 부모 클래스의 정적 멤버에 접근할 수 있으며, 이는 부모 클래스명을 사용하여 접근할 수도 있고, 더 간단하게 자식 클래스명을 사용하여 접근할 수도 있다.
하지만 정적(static) 멤버는 상속될 수 있지만 오버라이딩될 수는 없다. 자식 클래스에서 동일한 이름의 정적 멤버를 선언하더라도 부모 클래스의 정적 멤버를 오버라이딩하는 것이 아니라, 완전히 새로운 정적 멤버가 생성되는 것이다.
정적(static) 멤버들은 클래스가 로드될 때 메모리에 할당되어야 하므로, 정적(static) 로딩에 의해 메모리에 올려진다. 따라서 자식 클래스를 통해 부모의 정적(static) 멤버들을 접근하게 되면, 자식 클래스의 정적 멤버들과 부모 클래스의 정적 멤버들이 모두 메모리에 로딩되며, 멤버들은 모두 Method Area(메서드 영역)에 올라가게 된다.
