Java에서 오버로딩(Overloading)과 오버라이딩(Overriding)은 둘 다 다형성을 지원하는 기능이지만, 서로 다른 개념입니다.
-
오버로딩(Overloading)
- 메소드 이름은 같지만, 매개변수의 개수, 타입, 순서가 다르면 다른 메소드로 인식합니다.
- 같은 이름의 메소드를 여러 개 정의할 수 있으며, 메소드 오버로딩은 컴파일 시간 다형성입니다.
- 예를 들어, println() 메소드가 오버로딩된 메소드의 대표적인 예입니다. println(int x), println(double x), println(String x) 등의 매개변수를 다르게 받아 처리하는 메소드들이 오버로딩된 메소드입니다.
-
오버라이딩(Overriding)
- 부모 클래스에서 상속받은 메소드와 이름, 매개변수, 반환값이 모두 같은 메소드를 자식 클래스에서 재정의합니다.
- 자식 클래스에서 재정의한 메소드가 호출됩니다.
- 메소드 오버라이딩은 런타임 다형성입니다.
- 예를 들어, toString() 메소드가 오버라이딩된 메소드의 대표적인 예입니다. 자식 클래스에서 toString() 메소드를 재정의하면, 해당 객체를 문자열로 변환하는 방법을 변경할 수 있습니다.
오버로딩과 오버라이딩의 가장 큰 차이점은 메소드를 호출하는 시점에 있습니다. 오버로딩은 컴파일 시간 다형성이므로, 컴파일러는 메소드 호출 시점에서 어떤 메소드를 호출해야 하는지 결정합니다. 반면에, 오버라이딩은 런타임 다형성이므로, 메소드 호출 시점에서 객체의 타입에 따라서 호출될 메소드가 결정됩니다.
따라서, 오버로딩은 같은 이름의 메소드를 다양하게 사용할 수 있도록 하고, 오버라이딩은 상속받은 메소드를 자식 클래스에서 적합하게 재정의하여 확장성을 높이는데 사용됩니다.
컴파일, 런타임
- 컴파일(Compile) 컴파일은 소스 코드를 기계어로 변환하는 과정입니다. 컴파일러는 소스 코드를 분석하고, 기계어로 번역하여 실행 파일을 생성합니다. 컴파일 단계에서는 코드의 구문과 타입 오류를 검사하고, 실행 파일을 생성하는 것이 목적입니다.
Java의 경우, 소스 코드를 컴파일하면 .class 파일이 생성됩니다. 이 파일은 JVM(Java Virtual Machine)에서 실행되며, 바이트 코드(bytecode)로 변환된 상태입니다. 이러한 바이트 코드는 플랫폼에 종속적이지 않으므로, 한 번 작성하면 어떤 플랫폼에서든 실행할 수 있습니다.
- 런타임(Runtime) 런타임은 프로그램이 실행되는 동안의 시간을 의미합니다. 런타임에는 소스 코드가 컴파일되어 생성된 실행 파일이 실행되며, 프로그램이 동작합니다. 런타임 단계에서는 실행 파일이 실행되어 동적으로 메모리를 할당하고, 프로그램의 입력과 출력을 처리합니다.
Java의 경우, 런타임에는 JVM이 .class 파일을 읽어서 실행합니다. JVM은 바이트 코드를 읽어서 실행 코드로 변환하고, 메모리를 할당하며, 객체 생성과 메소드 호출 등의 작업을 처리합니다. 이러한 작업은 JVM이 수행하므로, Java 프로그램은 플랫폼에 종속적이지 않습니다.
컴파일과 런타임은 모두 프로그램 실행에 있어서 중요한 단계이며, 컴파일 단계에서는 코드의 구문과 타입 오류를 검사하고 실행 파일을 생성하며, 런타임 단계에서는 실행 파일이 실행되어 동작합니다. Java의 경우, 런타임에는 JVM이 중요한 역할을 수행하며, 플랫폼에 종속적이지 않으므로 다양한 플랫폼에서 실행할 수 있습니다.