Menu
Coddy logo textTech

메서드 오버로딩 기초

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 28번째.

다형성(Polymorphism)은 "여러 가지 형태"를 의미합니다. Java에서 다형성은 객체가 문맥에 따라 다르게 동작할 수 있도록 합니다. 다형성의 한 형태는 메서드 오버로딩(method overloading)으로, Java가 컴파일 중에 어떤 메서드를 호출할지 결정하기 때문에 컴파일 타임 다형성이라고도 불립니다.

메서드 오버로딩을 사용하면 이름은 같지만 매개변수가 다른 여러 메서드를 정의할 수 있습니다. 컴파일러는 매개변수의 개수, 타입 또는 순서에 따라 이들을 구분합니다:

public 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;
    }
}

add(5, 3)를 호출하면, Java는 첫 번째 메서드를 사용합니다. add(5, 3, 2)를 호출하면 두 번째 메서드가 실행되고, add(5.0, 3.0)을 호출하면 세 번째 메서드가 호출됩니다. 컴파일러는 제공된 인수를 바탕으로 올바른 버전을 선택합니다.

반환 타입만 변경하는 것은 유효한 오버로딩이 아님에 주의하세요. 매개변수 목록이 반드시 달라야 합니다:

// 유효한 오버로딩이 아님 - 컴파일되지 않음
public int getValue() { return 1; }
public double getValue() { return 1.0; }  // 에러!

여러분은 이미 생성자 오버로딩을 통해 오버로딩을 접해본 적이 있습니다. 메서드 오버로딩은 동일한 규칙을 따르며, 하나의 메서드 이름이 다양한 입력 시나리오를 처리할 수 있도록 하여 유연성을 제공합니다.

challenge icon

챌린지

쉬움

메시지를 포맷하는 여러 가지 방법을 제공하여 메서드 오버로딩을 보여주는 메시지 포맷터를 만들어 보겠습니다. 다양한 입력 시나리오를 처리하는 여러 개의 오버로드된 format 메서드를 가진 유틸리티 클래스를 만들 것입니다.

코드는 두 개의 파일로 구성됩니다:

  • MessageFormatter.java: 오버로드된 메서드를 통해 유연한 메시지 포맷팅을 제공하는 클래스를 만듭니다. 포맷터는 다음을 포함해야 합니다:
    • 메시지를 대괄호로 감싸서 반환하는 메서드 format(String message): [message]
    • 메시지를 지정된 횟수만큼 반복하고 공백으로 구분하여 반환하는 메서드 format(String message, int repeatCount)
    • 접두사가 붙은 메시지를 반환하는 메서드 format(String message, String prefix): prefix: message
    • 다음을 반환하는 메서드 format(String message, String prefix, String suffix): prefix: message (suffix)
    컴파일러는 전달하는 인수에 따라 올바른 메서드를 선택합니다. 이것이 바로 컴파일 타임 다형성(compile-time polymorphism)이 작동하는 방식입니다!
  • Main.java: 네 가지 오버로드된 메서드가 함께 작동하는 것을 보여줍니다. 메시지(String), 반복 횟수(int), 접두사(String), 접미사(String)의 네 가지 입력을 받습니다. MessageFormatter를 생성하고 format 메서드의 각 버전을 호출하여 각 결과를 별도의 줄에 출력합니다:
    • 첫째, 메시지만 사용하여 포맷
    • 둘째, 메시지와 반복 횟수를 사용하여 포맷
    • 셋째, 메시지와 접두사를 사용하여 포맷
    • 넷째, 메시지, 접두사, 접미사를 사용하여 포맷

메시지 텍스트, 반복 횟수, 접두사 문자열, 접미사 문자열의 네 가지 입력을 받게 됩니다.

예를 들어, 메시지가 "Hello"이고, 반복 횟수가 3, 접두사가 "INFO", 접미사가 "done"인 경우, 출력은 각각 다른 오버로드된 메서드를 사용하여 동일한 메시지를 네 가지 다른 포맷 버전으로 보여주어야 합니다!

치트 시트

메서드 오버로딩을 사용하면 이름은 같지만 매개변수가 다른 여러 메서드를 정의할 수 있습니다. 자바는 컴파일 중에 호출할 메서드를 결정하기 때문에 이를 컴파일 타임 다형성이라고도 합니다.

컴파일러는 매개변수의 개수, 타입 또는 순서에 따라 오버로딩된 메서드를 구분합니다:

public 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;
    }
}

add(5, 3)를 호출하면 자바는 첫 번째 메서드를 사용합니다. add(5, 3, 2)를 호출하면 두 번째 메서드가 실행되고, add(5.0, 3.0)을 호출하면 세 번째 메서드가 호출됩니다.

중요: 반환 타입만 변경하는 것은 유효한 오버로딩이 아닙니다. 매개변수 목록이 달라야 합니다:

// 유효하지 않은 오버로딩
public int getValue() { return 1; }
public double getValue() { return 1.0; }  // 오류!

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 입력 읽기
        String message = scanner.nextLine();
        int repeatCount = Integer.parseInt(scanner.nextLine());
        String prefix = scanner.nextLine();
        String suffix = scanner.nextLine();
        
        // TODO: MessageFormatter 객체 생성
        
        // TODO: 메시지만 사용하여 format을 호출하고 결과 출력
        
        // TODO: 메시지와 repeatCount를 사용하여 format을 호출하고 결과 출력
        
        // TODO: 메시지와 prefix를 사용하여 format을 호출하고 결과 출력
        
        // TODO: 메시지, prefix, suffix를 사용하여 format을 호출하고 결과 출력
        
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨