logo

Java의 메소드 오버로딩

  1. 메서드를 오버로드하는 다양한 방법
  2. 번호를 변경하여. 인수의
  3. 데이터 유형을 변경하여
  4. 반환 유형을 변경하여 메서드 오버로드가 불가능한 이유
  5. 메인 메소드를 오버로드할 수 있나요?
  6. 유형 승격을 통한 메소드 오버로딩

만약 수업 이름은 같지만 매개변수가 다른 여러 메서드가 있는 경우 메소드 오버로딩 .

하나의 작업만 수행해야 하는 경우 메서드 이름이 같으면 가독성이 높아집니다. 프로그램 .

C++ 쌍

주어진 숫자의 덧셈을 수행해야 하지만 인수의 개수에는 제한이 없다고 가정합니다. 두 개의 매개변수에 대해 a(int,int), 세 개의 매개변수에 대해 b(int,int,int)와 같은 메서드를 작성하면 메소드의 이름이 다르기 때문에 귀하와 다른 프로그래머가 메소드의 동작을 이해하기 어려울 수 있습니다.

그래서 프로그램을 빠르게 파악하기 위해 메소드 오버로딩을 수행합니다.

자바 메소드 오버로딩

메소드 오버로딩의 장점

메소드 오버로딩 프로그램의 가독성을 높인다 .

메서드를 오버로드하는 다양한 방법

Java에서 메소드를 오버로드하는 방법에는 두 가지가 있습니다.

  1. 인수 수를 변경하여
  2. 데이터 유형을 변경하여

Java에서는 메소드의 반환 유형만 변경하면 메소드 오버로딩이 불가능합니다.


1) 메소드 오버로딩: 번호 변경 인수의

이 예에서는 두 가지 메서드를 만들었습니다. 첫 번째 add() 메서드는 두 개의 숫자를 더하는 작업을 수행하고 두 번째 add 메서드는 세 개의 숫자를 더하는 작업을 수행합니다.

이 예에서는 정적 메소드 메소드를 호출하기 위해 인스턴스를 생성할 필요가 없습니다.

 class Adder{ static int add(int a,int b){return a+b;} static int add(int a,int b,int c){return a+b+c;} } class TestOverloading1{ public static void main(String[] args){ System.out.println(Adder.add(11,11)); System.out.println(Adder.add(11,11,11)); }} 
지금 테스트해보세요

산출:

 22 33 


2) 메소드 오버로딩: 인수의 데이터 유형 변경

이 예에서는 다음과 같은 두 가지 방법을 만들었습니다. 지금 테스트해보세요

산출:

 22 24.9 

Q) 메소드의 반환타입만 변경하면 메소드 오버로딩이 불가능한 이유는 무엇인가요?

자바에서는 모호성 때문에 메소드의 반환타입만 변경하는 방식으로는 메소드 오버로딩이 불가능하다. 모호성이 어떻게 발생할 수 있는지 살펴보겠습니다.

 class Adder{ static int add(int a,int b){return a+b;} static double add(int a,int b){return a+b;} } class TestOverloading3{ public static void main(String[] args){ System.out.println(Adder.add(11,11));//ambiguity }} 
지금 테스트해보세요

산출:

 Compile Time Error: method add(int,int) is already defined in class Adder 

System.out.println(Adder.add(11,11)); //여기서 Java는 호출해야 할 sum() 메소드를 어떻게 결정할 수 있습니까?

참고: 컴파일 시간 오류는 런타임 오류보다 낫습니다. 따라서 동일한 매개변수를 갖는 동일한 메소드를 선언하면 Java 컴파일러는 컴파일러 시간 오류를 렌더링합니다.

Java main() 메소드를 오버로드할 수 있나요?

예, 메서드 오버로딩을 통해 가능합니다. 메소드 오버로딩을 통해 클래스에 기본 메소드를 원하는 수만큼 가질 수 있습니다. 하지만 JVM 문자열 배열을 인수로만 받는 main() 메서드를 호출합니다. 간단한 예를 살펴보겠습니다.

 class TestOverloading4{ public static void main(String[] args){System.out.println('main with String[]');} public static void main(String args){System.out.println('main with String');} public static void main(){System.out.println('main without args');} } 
지금 테스트해보세요

산출:

 main with String[] 

메소드 오버로딩 및 유형 승격

일치하는 데이터 유형이 없으면 한 유형이 암시적으로 다른 유형으로 승격됩니다. 아래 그림을 통해 개념을 이해해 봅시다.

유형 승격을 통한 Java 메소드 오버로딩

위 다이어그램에 표시된 대로 바이트는 short, int, long, float 또는 double로 승격될 수 있습니다. short 데이터 유형은 int, long, float 또는 double로 승격될 수 있습니다. char 데이터 유형은 int, long, float 또는 double 등으로 승격될 수 있습니다.

TypePromotion을 사용한 메서드 오버로딩의 예

 class OverloadingCalculation1{ void sum(int a,long b){System.out.println(a+b);} void sum(int a,int b,int c){System.out.println(a+b+c);} public static void main(String args[]){ OverloadingCalculation1 obj=new OverloadingCalculation1(); obj.sum(20,20);//now second int literal will be promoted to long obj.sum(20,20,20); } } 
지금 테스트해보세요
 Output:40 60 

일치하는 항목이 발견된 경우 유형 승격을 통한 메서드 오버로딩의 예

메서드에 일치하는 형식 인수가 있으면 형식 승격이 수행되지 않습니다.

 class OverloadingCalculation2{ void sum(int a,int b){System.out.println('int arg method invoked');} void sum(long a,long b){System.out.println('long arg method invoked');} public static void main(String args[]){ OverloadingCalculation2 obj=new OverloadingCalculation2(); obj.sum(20,20);//now int arg sum() method gets invoked } } 
지금 테스트해보세요
 Output:int arg method invoked 

모호한 경우 유형 승격을 통한 메서드 오버로딩의 예

메서드에 일치하는 형식 인수가 없고 각 메서드가 비슷한 수의 인수를 승격하는 경우 모호성이 발생합니다.

 class OverloadingCalculation3{ void sum(int a,long b){System.out.println('a method invoked');} void sum(long a,int b){System.out.println('b method invoked');} public static void main(String args[]){ OverloadingCalculation3 obj=new OverloadingCalculation3(); obj.sum(20,20);//now ambiguity } } 
지금 테스트해보세요
 Output:Compile Time Error 

한 유형은 암시적으로 승격 취소되지 않습니다. 예를 들어 double은 암시적으로 어떤 유형으로도 승격 취소될 수 없습니다.