가변인자(varargs)

2022. 2. 27. 00:44·개발/Java
반응형

기존에는 메서드의 매개변수 개수가 고정적이었으나,

JDK1.5부터 동적으로 지정해 줄 수 있게 되었으며,

이 기능을 가변 인자라고 한다.

가변 인자는 '타입... 변수명'과 같은 형식으로 선언하며.

 

PrintStream 클래스의 printf()가 대표적인 예다.

public PrintStream printf(String format, Object... args) { ... }

 

위와 같이 가변 인자 외에도 매개변수가 더 있다면, 가변 인자를 매개변수 중에서 제일 마지막에 선언해야 한다.

그렇지 않다면, 컴파일 에러가 발생한다.

가변 인자인지 아닌지를 구별할 방법이 없기 때문에 허용하지 않는 것이다.

 

이제 아래 코드를 살펴보자.

String concatenate(String s1, String s2){ ... }
String concatenate(String s1, String s2, String s3){ ... }
String concatenate(String s1, String s2, String s3, String s4){ ... }


// 위의 여러가지 메서드를 가변인자를 사용하면 아래와 같이 수정할 수 있다.

String concatenate(String... str) { ... } 

//위 메서드를 사용하면 아래와 같이 인자의 개수를 가변적으로 할 수 있다.

System.out.println(concatenate()); //인자가 없음
System.out.println(concatenate("a")); //인자가 1개
System.out.println(concatenate("a","b")); //인자가 2개
System.out.println(concatenate(new String[]{"A", "B"})); //배열

 

가변인자는 내부적으로 배열을 이용한다.

그래서 가변 인자가 선언된 메서드를 호출할 대마다 배열이 새로 생성된다.

가변 인자 대신 매개변수의 타입을 배열로 사용하면 반드시 인자를 지정해줘야 한다.

그래서 null이나 0인 배열을 인자로 지정해줘야 한다.

 

결국 아래와 같이 배열처럼 사용한다.

class T{
    public void func(String... args){
        System.out.println("args = " + args[0]); //1이 출력된다.
    }
}

public class Main {
    public static void main(String[] args) {
        T m=new T();
        m.func("1","2");
    }
}

 

가변 인자를 오버 로딩할 때 한 가지 주의해야 할 점이 있다.

String concatentate(String delim, String... args) { ... }
String concatentate(String... args) { ... }

 

위 두 메서드는 오버 로딩한 메서드로 별 문제가 없어 보인다.

그러나 실행하면 컴파일 오류가 발생한다.

에러의 내용은 두 오버로딩된 메서드가 구분되지 않아서 발생하는 것이다.

가변 인자를 선언한 메서드를 오버 로딩하면,

메서드를 호출했을 때 이와 같이 구별되지 못하는 경우가 발생하기 쉽기 때문에 주의해야 한다.

가능하면 가변인자를 사용한 메서드는 오버 로딩하지 않는 것이 좋다.

 

참고자료

자바의 정석

반응형
'개발/Java' 카테고리의 다른 글
  • final 제어자
  • package(패키지)
  • 오버로딩과 오버라이딩
  • 클래스 메서드(static 메서드)와 인스턴스 메서드
Debin
Debin
공부 기록을 남기며 게시글 리팩토링을 진행하는 블로그입니다.
  • Debin
    리팩토링하는 블로그
    Debin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • DB
        • DB 기초
        • MySQL
        • SQL 튜닝
      • OS
      • Network
      • Git
      • 디지털콘텐츠기획
      • 소프트웨어공학
      • 코딩테스트
        • 프로그래머스
        • 백준
        • 인프런
      • 공부 일지
      • 독서
        • 클린코드
        • 일상 속 사물이 알려주는 웹 API 디자인
        • 토비의 스프링
        • 객체지향의 사실과 오해
        • 자바 잘 읽는 법
      • 기록 및 회고
      • Cloud
        • AWS
      • 개발
        • Java
        • Spring Core
        • Spring MVC
        • Spring DB
        • Spring Boot
        • Spring Security
        • Spring Batch
        • JPA
        • Test
        • Android
      • 대외활동
        • UMC SERVER
        • 카엔프 SW 아카데미
      • 프로젝트
      • Docker
      • Gradle
      • ELK
      • 실무 이야기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

    • 본인 깃허브입니다!
  • 인기 글

  • 태그

    인덱스
    innodb
    spring boot
    docker
    spring
    프록시
    mysql
    데이터베이스
    리눅스
    코딩 #개발자 #노마드북클럽 #노개북
    ORM
    도커
    스프링
    객체지향
    스프링 부트
    객체
    트랜잭션
    Java
    JPA
    container
    AOP
    컨테이너
    AWS
    토비의 스프링
    spring mvc
    redis
    운영체제
    test
    자바
    SQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Debin
가변인자(varargs)
상단으로

티스토리툴바