Java|Spring

[JAVA] 가변 인자

솝제로 2025. 5. 16. 11:38

 

가변 인자는 매개변수 개수를 유동적으로 받을 수 있는 기능이다.

메서드나 생성자를 호출할 때 인자의 개수를 정하지 않고 넘길 수 있게 해준다.

 

public void printNames(String... names) {
    for (String name : names) {
        System.out.println(name);
    }
}

 

이와 같이 타입 뒤에 ... 을 붙여 사용한다.

 

가변 인자 규칙
  • 가변 인자는 내부적으로 배열로 처리된다.
  • 하나의 메서드에 가변 인자는 하나만 사용 가능하다.
  • 가변 인자는 마지막 매개변수여야 한다.

 

데이터가 외부에서 바뀌면 안될 때나 멀티스레드 환경에서는

일관성과 불변성을 위해서 가변 인자를 받아서 불변 리스트(List.of)로 만든다. 

 

//불변 리스트 아닌 경우
BasicInfo(Role... roles) {
    this.roles = roles; //외부 배열 참조 그대로 저장
}

Role[] roles = { Role.TANK, Role.MAGE };

//1. 생성자 호출
BasicInfo galio = new BasicInfo(roles);

//2. 외부 배열 변경
roles[0] = Role.DEALER;

//3. galio 내부의 역할도 바뀜

 

위와 같이 불변 리스트가 아닌 경우에는 외부 배열 참조를 그대로 저장하여

roles 배열이 변경되면 그대로 galio의 역할도 바뀌게 된다.

→ 캡슐화가 깨진다.

 

//불변 리스트로 변경
BasicInfo(Role... roles) {
    this.roles = List.of(roles); //배열을 복사해서 불변 리스트 생성
}

Role[] roles = { Role.TANK, Role.MAGE };

//1. 생성자 호출
BasicInfo galio = new BasicInfo(roles);

//2. 외부 배열 변경
roles[0] = Role.DEALER;

//3. galio의 역할 바뀌지 않음

 

위와 같이 배열을 복사해서 불변 리스트로 사용하게 하면

외부 배열이 변경되어도 galio의 역할이 바뀌지 않는다.