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의 역할이 바뀌지 않는다.