[JAVA] 오버로딩(Overloading)과 오버라이딩(Overriding)
2025. 1. 23. 10:31ㆍ언어(Language)/JAVA
1. 오버로딩( Overloading )
1. 오버로딩이란 무엇인가요?
- 정의: 메소드 이름이 같더라도 매개변수의 타입, 개수, 또는 순서가 다르면 서로 다른 메소드로 인식되는 기능
- 특징:
- 메소드 시그니처(메소드 이름 + 매개변수 타입과 개수)가 다르면 JVM은 별개의 메소드로 처리
- 반환 타입은 메소드 시그니처에 포함되지 않음
- 예시 코드:
public class Main {
public static void main(String[] args) {
MyClass mc = new MyClass();
mc.print(1); // 정수형 : 1
mc.print(1, 10); // 정수형 : 1, 10
mc.print('X'); // 문자형 : X
mc.print("메소드 오버로딩"); // 문자열 : 메소드 오버로딩
}
}
class MyClass {
public void print(int x) {
System.out.println("정수형 : " + x);
}
public void print(int x, int y) {
System.out.println("정수형 : " + x + "," + y);
}
public void print(char x) {
System.out.println("문자형 : " + x);
}
public void print(String s) {
System.out.println("문자열 : " + s);
}
}
Q1) 메서드 시그니처(method signature)에 어떤 요소들이 포함되나요?
- 정의: 메소드 시그니처는 메소드 이름과 매개변수의 타입 및 개수로 구성된다.
- 특징:
- 반환 타입은 메소드 시그니처에 포함되지 않는다.
- 매개변수의 순서도 시그니처에 영향을 준다.
- 예시 코드:
// System.out.println() 메소드
System.out.println("Hello, World!"); // 문자열 출력
System.out.println(100); // 정수 출력
System.out.println(3.14); // 부동소수점 출력
System.out.println(true); // 불리언 값 출력
System.out.println('A'); // 문자 출력
Object obj = new Object();
System.out.println(obj); // 객체 출력
- 매개변수 순서가 시그니처에 미치는 영향
public double add(int a, double b) {
return a + b;
}
public double add(double a, int b) {
return a + b;
}
⇒ 두 메소드는 같은 타입의 파라미터를 받지만, 파라미터의 순서가 다르기 때문에 메소드 오버로딩
Q2) 반환 타입만 다르게 정의하면 왜 컴파일 에러가 발생하나요?
반환 타입은 메서드 시그니처에 포함되지 않으며, 단지 메서드의 결과 타입을 정의하는 역할만을 한다.
⇒ 따라서 반환 타입만 다르게 정의한 메서드는 시그니처가 동일하게 되어 컴파일러가 어떤 메서드를 호출할지 판단할 수 없어 컴파일 에러가 발생하게 된다.
2. 오버로딩은 컴파일 시점과 런타임 중 어느 시점에서 결정되나요?
⇒ 오버로딩은 컴파일 시점에서 결정된다.
컴파일 시점에 결정되는 이유
- 호출하는 메서드를 컴파일러가 매개변수의 타입과 개수를 기준으로 분석해 결정하기 때문이다.
- 컴파일러는 이 정보를 바탕으로 어떤 메서드를 호출할지 코드가 실행되기 전에 미리 정한다.
2. 오버라이딩( Overriding )
1. 오버라이딩이란 무엇인가요?
- 정의: 부모 클래스의 메서드나 변수를 자식 클래스에서 재정의하는 것
2. 오버라이딩과 다형성(polymorphism)의 관계를 설명해주세요.
- 다형성이란?
- 하나의 부모 타입(예: 자동차)이 여러 자식 클래스(예: K3, 아반떼)의 객체를 참조할 수 있는 성질이다.
- 다형성과 오버라이딩의 관계:
- 오버라이딩은 다형성을 가능하게 한다.
- 부모 클래스 타입으로 선언된 변수가 자식 클래스의 객체를 참조할 때, 오버라이딩된 메서드가 자식 클래스에 맞게 동작하도록 해준다.
3. 오버라이딩은 컴파일 시점과 런타임 중 어느 시점에서 결정되나요?
⇒ 오버라이딩은 런타임 시점에서 결정된다.
런타임 시점에 결정되는 이유
- 컴파일 시점 역할:
- 컴파일러는 메서드의 존재 여부와 정의가 올바른지만 확인한다.
- 런타임 역할:
- 메서드 호출 시점에는 객체의 실제 타입을 기준으로, 어떤 클래스의 메서드를 실행할지 결정한다.
'언어(Language) > JAVA' 카테고리의 다른 글
[JAVA] toCharArray() vs charAt() (0) | 2024.04.11 |
---|---|
[JAVA] 백준 2738번 / BufferedWriter Int(정수)형 출력하기 (1) | 2024.03.28 |
[JAVA] StringTokenizer 여러 번 사용하기(NoSuchElementException 에러) (1) | 2024.02.27 |
[JAVA] StringTokenizer란? (split()과 비교) (0) | 2024.02.21 |
[JAVA] Map & HashMap (1) | 2024.02.20 |