티스토리 뷰
메서드의 매개변수 개수를 동적으로 지정해주는 방법이다.
‘타입… 변수명’ 형식으로 선언할 수 있고, 사용된 예를 찾자면 PrintStream Class의 printf()가 대표적인 예라고 할 수 있다.
public PrintStream printf(String format, Object ...args) { ... }
여러 다른 예를 들어보자.
이런 식으로 만들어 사용할 수 있다. 가변인자라는 것 자체가 몇 개의 인자가 들어올지 정해두는 것이 아니기 때문에 개수를 랜덤으로 넣어도 상관없다.
근데 이러한 예들을 보면 한 가지 궁금점이 생길 이다. “매개변수로 배열을 넘겨주는 것과 뭐가 다른가?”
가변인자가 사용되는 것을 설명하자면 사실 가변인자가 사용된 메서드를 선언하면 배열이 새로 생기면서 사용되는 것이다.
그래서 단순히 보게 되면 차이는 없어 보인다.
단순하지만 기본적인 차이가 존재하는데 그건 바로 ‘매개변수를 생략할 수 있는가’이다.
매개변수로 배열을 넘겨주는 경우에는 매개변수를 생략할 수 없기 때문에 배열의 크기가 0인 변수를 매개변수를 넣어주거나, null 값을 넘겨주어야 한다.
하지만 가변인자를 사용하면 매개변수를 생략해야 하는 경우 생략이 가능하다. 이 차이점으로 인해 가변인자가 사용되는 것 같다.
사용법
가변인자의 사용은 매개변수를 배열로 넘겨주는 경우와 비슷하게 사용하면 된다. 하지만 조심해야할 것이 2가지가 존재한다.
1. 가변인자를 매개변수 중 제일 마지막에 사용해야 한다
가변인자 외에도 매개변수가 더 있을 때, 가변인자가 앞에 있다면 가변인자가 아닌 매개변수와 구별을 할 수 있는 방법이 없기 때문에 허용하지 않는다
사진으로 예를 들자면 가변인자 str을 앞에 두게 되면 메서드에서 매개변수를 가지고 올 때 어디까지가 가변인자인지 구분을 할 수 없게 되므로 에러를 발생한다.
고로 사진에서 아래처럼 작성하여야 한다. 가변인자 이외에 매개 변수가 존재한다면 가변인자를 제일 나중에 받아와야 한다(작성해야 한다).
2. 같은 형식의 매개변수가 존재하는 오버로딩
만약 다음과 같은 메서드(오버로딩) 2개가 존재한다면, String 변수를 2개 이상 넘겨주었을 때 무엇을 실행하여야 하는가?
이게 문제가 된다. 매우 모호하다. 고로 ambiguous 하다는 이유로 허용하지 않는다.
그렇기 때문에 이렇듯 구별 못하는 오류를 피하기 위해서, 가변인자를 사용하는 경우 오버로딩을 하지 않는 것이 좋다.
(참고: Java의 정석)
'Development > Java, Kotlin, Frameworks' 카테고리의 다른 글
Spock Test (Mock, Stub) (0) | 2021.04.06 |
---|---|
Optional (0) | 2021.03.16 |
Stream 원리 (0) | 2021.03.16 |
클래스 출력 (0) | 2021.01.21 |
JDK, JRE, JVM (0) | 2021.01.21 |
- Total
- Today
- Yesterday
- boj
- python
- tag
- HTTP
- 하루
- Istio
- k8s
- 클린 아키텍처
- Spring
- java
- container
- 백준
- 쿠버네티스
- gradle
- Kubernetes
- Algorithm
- 로그
- 비동기
- Spring boot
- 알고리즘
- docker
- 일상
- WebFlux
- Log
- Intellij
- MySQL
- c++
- Clean Architecture
- hexagonal architecture
- jasync
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |