오버로딩과 오버라이딩은 무엇일까?
오버로딩 (Overloading)
--
오버로딩은
하나의 클래스 내부에 같은 이름의 메서드를 여러 개 정의한 것을 의미한다.
오버로딩 조건
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 or 타입 or 순서가 달라야 한다.
- 반환 타입 또한 다르게 정의할 수 있다. (다만 반환 타입만 다르게 정의한 것은 오버로딩이 아니다.)
class Calculator {
// 두 개의 정수를 더하는 메서드
public int add(int a, int b) {
return a + b;
}
// 세 개의 정수를 더하는 메서드 (매개변수 개수 다름)
public int add(int a, int b, int c) {
return a + b + c;
}
// 두 개의 실수를 더하는 메서드 (매개변수 타입 다름)
public double add(double a, double b) {
return a + b;
}
}
Calculator calc = new Calculator();
System.out.println(calc.add(10, 20)); // 두 정수를 더함
System.out.println(calc.add(10, 20, 30)); // 세 정수를 더함
System.out.println(calc.add(10.5, 20.5)); // 두 실수를 더함
add() 메서드가 여러 개 정의되어 있지만
각각 매개변수를 다르게 하여 조금 더 유연한 결과를 나타낼 수 있다.
가변인자와 오버로딩
일반적인 오버로딩은 매개변수의 개수를 정확하게 고정하여 정의해야 하지만
가변인자를 사용하면 매개변수를 유동적으로 받을 수 있게 된다.
메서드(타입... 변수명) {
...
}
String test(Stirng s1, String s2) { ... }
String test(String s1, String s2, String 3) { ... }
Stirng test(String s1, String s3, String s3, String s4) { ... }
// 위 처럼 직접 3개를 만들어야 하는 것을 아래처럼 가변인자를 사용하며 대체할 수 있다.
String test(String... str) { ... }
test(); // 인자가 없어도 된다.
test("aaa");
test("aaa", "bbb");
test("aaa", "bbb", "ccc");
test("aaa", "bbb", "ccc", "ddd");
String arr = {"aa", "bb", "cc"};
test(arr); // 배열도 가능하다.
String test(String format, Object... args) { ... }
// 만약 일반 매개변수와 가변인자를 같이 사용해야 한다면 가변 인자는 가장 마지막에 정의한다.
// 그리고 하나의 매서드(매개변수)에서 가변 인자는 하나만 사용이 가능하다.
가변인자를 사용한 다는 것은
해당 메서드를 호출할 때마다 가변인자로 구성된 배열이 생성되어 사용할 수 있게 되다.
다만 해당 방법은 편리하지만 비효율적이므로
꼭 필요한 경우가 아니면 최대한 가변인자를 사용하지 않는 편이 좋다.
매개변수에 배열과 가변인자의 차이
두 방법 모두 내부적으로 배열로 처리된다는 점에서 유사하지만,
사용 편의성과 호출 방식에 있어 차이가 있다.
배열 선언 방식
public class Main {
public static void printNumbers(int[] numbers) {
for (int num : numbers) {
System.out.println(num);
}
}
public static void main(String[] args) {
int[] nums = {1, 2, 3}; // 배열을 미리 생성
printNumbers(nums); // 배열을 전달
}
}
메서드를 호출하기 전에 인자로 삽입할 배열을 미리 생성해 주고 넣어줘야 한다.
즉, 생성된 배열을 인자로 넣어줘야 한다.
가변 인자 방식
public class Main {
public static void printNumbers(int... numbers) {
for (int num : numbers) {
System.out.println(num);
}
}
public static void main(String[] args) {
printNumbers(1, 2, 3); // 배열을 생성하지 않고 여러 개의 인수를 나열
printNumbers(); // 인수 없이도 호출 가능
}
}
배열 생성 없이 인자들을 ,콤마로 구분하여 나열하여 넣어주면, 자동으로 배열로 변환되어 처리된다.
그리고 가변 인자는 빈 인자를 사용해도 되지만 배열 방식은 꼭 배열을 넣어줘야 한다.
--
오버라이딩 (Overriding)
--
오버라이딩은
상속 관계인 클래스에서 사용하는 것으로
부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하는 것을 의미한다.
오버라이딩 조건(특징)
- 부모 클래스의 메서드 형식과 동일해야 한다. (메서드 이름, 매개변수, 반환 타입)
- 오버라이딩을 수행한 메서드임을 명시하기 위해 @Override라는 어노테이션을 붙이는 것을 권장
- 접근 제어자는 변경할 수 있지만 기존 접근 제어자보다 더 좁은 범위로는 변경이 불가능하다.
@Override를 붙이는 것이 필수는 아니지만
붙이면 자바가 해당 메서드는 오버라이딩을 수행한 것을 파악할 수 있으며,
오버라이딩에 대해 잘못된 부분이 있으면 바로 알려주어 오류를 방지할 수 있다.
class Parent {
void display() {
System.out.println("Parent class display method");
}
}
class Child extends Parent {
@Override
void display() { // 부모의 display 메서드를 오버라이딩
System.out.println("Child class display method");
}
}
public class Main {
public static void main(String[] args) {
Childe obj = new Child();
obj.display(); // "Child class display method" 출력 (오버라이딩된 메서드 호출)
}
}
--
'Language > Java' 카테고리의 다른 글
[클래스] 변수와 메서드 (+ 초기화 블록) (0) | 2024.10.18 |
---|---|
상속 (+ super, super(), 포함 관계) (0) | 2024.10.17 |
생성자 (+ new, this, this() 키워드) (0) | 2024.10.13 |
클래스, 객체, 인스턴스 (+ 객체 생성 방법) (2) | 2024.10.12 |
배열(Arrays 클래스) 관련 메서드 정리 (0) | 2024.10.11 |