[TIL] 2일차 가변 인자

김지수·2024년 4월 22일

TIL

목록 보기
2/53

가변인자란?

인자의 개수가 변하는 인자를 말한다. 이 가변인자는 타입과 개수가 정해지지 않는다.

가변인자로 받는 오버로딩에 대해서 궁금해서 코드로 작성해 봤다.

import java.util.Arrays;

class Main {

  public static void main(String[] args) {
    System.out.println(abs(1,2));
    System.out.println(abs(1,2,3));
    System.out.println(abs(1,2,3,4));
    System.out.println(abs(1,2));
    System.out.println(abs(1));

  }

  public static int abs(int a, int b, int c) {
    return a*b*c;
  }

  public static int abs(int... abc) {
    System.out.print("가변 인자 ");
    return Arrays.stream(Arrays.stream(abc).toArray()).sum();
  }


  public static int abs(int a, int b) {
    return a*b;
  }
}

출력
2
6
가변 인자 10
2
가변 인자 1

왜 이렇게 되는지 찾아 보았는데 메소드가 호출되는 이유는 메소드 호출 시의 규칙 때문이라는 것을 알았다.

메소드 호출 시 메소드의 선택은 다음과 같은 규칙

  1. 정확한 일치
    호출 시 전달된 인자의 수와 자료형이 메소드의 매개변수와 정확히 일치하는 메소드가 있는 경우, 해당 메소드가 호출됩니다.
  2. 자동 형변환
    전달된 인자의 자료형이 메소드의 매개변수의 자료형과 일치하지 않지만, 자동으로 형변환할 수 있는 경우 해당 메소드가 호출됩니다. 이때는 보다 구체적인 자료형이 우선합니다.
  3. 가변 인자와 배열
    가변 인자를 사용하는 메소드와 배열을 인자로 받는 메소드가 있을 경우, 배열을 인자로 받는 메소드가 호출됩니다. 이는 가변 인자가 내부적으로 배열로 처리되기 때문입니다.

그리고 가변 인자로 받은 메소드는 매개변수 중에서 제일 마지막에 선언해야 한다.
마지막에 선언이 되지 않으면 에러가 뜬다.


오늘의 회고

가변인자를 다뤄보면서 많은 것을 배웠다.
먼저 가변인자를 사용하면 메소드 호출 시 다양한 개수의 인자를 전달할 수 있다는 점이 정말 편리하다는 것을 깨달았다. 이렇게 하면 메소드를 호출하는 쪽에서 인자의 개수를 미리 알 필요가 없으며 유연하게 코드를 작성할 수 있을 것 같다.
가변인자는 배열로 처리되기 때문에 배열을 다루는 방법과 유사하게 사용 할 수 있다는 것도 새로 알게 되었다.
가변인자와 오버로딩이 함께 사용될 때 주의할 점도 알게 되었고 가변인자는 마지막 매개변수로 선언되어야 한다는 것도 알게 되었다.

profile
서툴고 부족한 점이 많지만, 배우고 발전하며 성장하기 위해 노력하겠습니다.

0개의 댓글