β μλ° κ°λ³ μΈμ(VarArgs) - λ§€κ°λ³μλ₯Ό λμ μΌλ‘
κ°λ³ μΈμ (Variable Arguments)
κ°λ³ μΈμ(varargs)λ, λ§€κ°λ³μλ‘ λ€μ΄μ€λ κ°μ κ°μμ μκ΄ μμ΄ λμ μΌλ‘ μΈμλ₯Ό λ°μ κΈ°λ₯νλλ‘ ν΄μ£Όλ λ¬Έλ²μ μ§μΉνλ€.
μλ₯Όλ€μ΄ λ€μκ³Ό κ°μ΄ λ§€κ°λ³μ κ°―μκ° μΌμ μΉ μμ print() λ©μλκ° μλ€κ³ κ°μ νμ.
print("νκΈΈλ");
print("νκΈΈλ", "μ΄μμ ");
print("νκΈΈλ", "μ΄μμ ", "μ μ±λ£‘");
print("νκΈΈλ", "μ΄μμ ", "μ μ±λ£‘", "κ°κ°μ°¬");
print("νκΈΈλ", "μ΄μμ ", "μ μ±λ£‘", "κ°κ°μ°¬", "μ΄λ");
μ¬λ¬κ°μ νλΌλ―Έν°κ° λ€μ΄μ¬ μ μλ λ©μλλ₯Ό ꡬμ±νλ λ°©λ²μ λνμ μΌλ‘ λ©μλ μ€λ²λ‘λ©(overloading)μΌλ‘ μ²λ¦¬κ° κ°λ₯νλ€.
νμ§λ§ μ λ¬ν λ§€κ°λ³μκ° λͺκ°μΈμ§ μΌμ μΉ μμλ μΌμΌν λ©μλλ₯Ό μ€λ²λ‘λ©νμ¬ κ΅¬ννλ κ²μ λ³κ±°λ‘μ°λ©° λ³λ‘ ν¨μ¨μ μ΄μ§ λͺ»νλ€λΌκ³ ν μ μλλ°, μ¬κΈ°μ κ°λ³ μΈμ(varargs)κ° νμ λ°νλ€.
κ°λ³ μΈμλ νλΌλ―Έν°λ€μ ν΅μ§Έλ‘ λ°°μ΄λ‘ λ°μλ€μ¬ μ²λ¦¬νκΈ° λλ¬Έμ λμ μΌλ‘ λ§€κ°λ³μλ₯Ό λ°μ μ μκ² λλ€. λλΆμ λ©μλλ₯Ό nλ² μ€λ²λ‘λ© νμ§μκ³ νλ²μ μ²λ¦¬κ° κ°λ₯νλ€.
κ°λ³ μΈμλ JDK 1.5λΆν° μΆκ°λμμΌλ©°, μλ°μμλ System.out.printf() λ©μλκ° κ°λ³ μΈμλ₯Ό μ¬μ©ν λνμ μΈ λ©μλλΌκ³ ν μ μλ€.
κ°λ³ μΈμ μ¬μ©λ²
λ©μλ νλΌλ―Έν° λΆλΆμ νμ
... λ§€κ°λ³μλͺ
μΌλ‘ μ²λ¦¬νλ©΄ μ¬μ©μ΄ κ°λ₯νλ€.
κ°λ³ μΈμλ μ λ¬ μΈμλ₯Ό 0κ°λΆν° nκ°κΉμ§ λ£μμ μλ€. κ·Έλ¦¬κ³ νλΌλ―Έν°λ‘ λ겨μ§λ κ°λ€μ λͺ¨μμ μ»΄νμΌμ λ°°μ΄λ‘ μ²λ¦¬λλ€. μ£Όμν μ μ μΈμλ€μ κ°―μμλ μ νμ΄ μμ§λ§, λ°°μ΄ μλ£νμ λ§€κ°λ³μ νμ μΌλ‘ λͺ μλ κ²μ λ°λΌκ°λ€λ μ μ΄λ€.
public static void main(String[] args) {
print("νκΈΈλ");
print("νκΈΈλ", "μ΄μμ ");
print("νκΈΈλ", "μ΄μμ ", "μ μ±λ£‘");
print("νκΈΈλ", "μ΄μμ ", "μ μ±λ£‘", "κ°κ°μ°¬");
print("νκΈΈλ", "μ΄μμ ", "μ μ±λ£‘", "κ°κ°μ°¬", "μ΄λ");
}
public static void print(String... str) {
// κ°λ³ μΈμμΈ str λ§€κ°λ³μλ String[] λ°°μ΄ νμ
μΌλ‘ λ°μλ€μΈλ€.
for(String s : str) {
System.out.print(s + ", ");
}
System.out.println();
}
λ§μΌ λ§€κ°λ³μκ° κ°λ³ μΈμ μΈμ λ€λ₯Έ λ§€κ° λ³μλ€λ λ°λλ€λ©΄, λ°λμ κ°λ³ μΈμλ₯Ό λ©μλ νλΌλ―Έν° κ°μ₯ λ§μ§λ§μ μμΉνλλ‘ μ μν΄μΌ νλ€.
κ·Έλ¦¬κ³ λ§€κ°λ³μκ° λ겨μ§λ μμλ, μΈμλ€μ΄ μμ μλ νλΌλ―Έν° λΆν° μ°¨λ‘λλ‘ λ겨μ§κ³ λ¨μ λλ¨Έμ§ μΈμλ€μ΄ κ°λ³ μΈμλ‘ λ겨μ§κ² λλ€.
public static void main(String[] args) {
print(1, true, "νκΈΈλ", "μ΄μμ ", "μ μ±λ£‘");
}
// λ§€κ°λ³μκ° μ¬λ¬κ° μμ κ²½μ°, κ°λ³ μΈμ(varargs)λ λ°λμ λ§μ§λ§μ μμΉ
public static void print(int num, boolean bool, String... str) {
System.out.println("number : " + num);
System.out.println("bool : " + bool);
System.out.println("rest parameters : " + Arrays.toString(str));
}
μλ°μ€ν¬λ¦½νΈμ κ°λ³ μΈμ
μλ°μ€ν¬λ¦½νΈ μ§μμλ κ°λ³ μΈμκ° μ‘΄μ¬νλ€.
μλ°μ€ν¬λ¦½νΈμμ κ°λ³ μΈμλ₯Ό spread μ°μ¬μ νΉμ λλ¨Έμ§ λ§€κ°λ³μ λΌκ³ μΉνλ€.
function print(...data) {
console.log(data);
}
print(1,2,3,4,5); // [1, 2, 3, 4, 5]
κ°λ³ μΈμ μ£Όμμ
1. κ°λ³ μΈμ μ체 μ±λ₯ λ¬Έμ μ
κ°λ³ μΈμλ μμμ 보λ€μνΌ λ겨μ§λ μΈμ κ°―μκ° μ ν΄μ§μ§ μμμλ μ μ©ν μ¬μ© ν μ μλ€.
νμ§λ§ κ°λ³ μΈμ λ©μλλ νΈμΆλ λ λ§λ€ λ°°μ΄μ μλ‘ νλ ν λΉνκ³ μ΄κΈ°ν νλ―λ‘, μ±λ₯μ λ―Όκ°ν μν©μμλ λ§μ΄λμ€μ μΈ μμκ° λ μ μλ€.
νμ§λ§ κΌ μμ μ νλ‘κ·Έλ¨ νΉμ±μ κ°λ³ μΈμλ₯Ό μ¨μΌν μν©μ΄λΌλ©΄, λ€μκ³Ό κ°μ΄ μ μ°μ μΈ μ€λ²λ‘λ©μΌλ‘ μ²λ¦¬νλ κ²μ κΆνλ€.
μλ₯Όλ€μ΄ λ§μ½ μ΄λ λ©μλλ₯Ό νΈμΆν λ λλΆλΆμ μν©μμ λ§€κ°λ³μλ₯Ό 3κ° μ΄νλ‘ λ°μ μ¬μ©νλ€λ©΄, κ·Έλ¦¬κ³ μμ£Ό κ°λ 4κ° μ΄μμ λ§€κ°λ³μλ₯Ό λ°μμΌν λκ° μλ€λ©΄, λ€μκ³Ό κ°μ΄ ꡬμ±νλ©΄ λλ€.
class Printer {
public void print(int a1) { }
public void print(int a1, int a2) { }
public void print(int a1, int a2, int a3) { }
public void print(int a1, int a2, int a3, int... rest) { }
}
μ€μ λ‘ EnumSetμ μ μ ν©ν°λ¦¬λ μ κΈ°λ²μ μ¬μ©ν΄ μ΄κ±° νμ μ μ§ν© μμ± λΉμ©μ μ΅μ ννκ³ μλ€.
2. κ°λ³ μΈμ μ체λ₯Ό μ€λ²λ‘λ© X
νλμ ν΄λμ€ λ΄μ κ°λ³μΈμλ₯Ό μ¬μ©ν λ©μλλ₯Ό μ€λ²λ‘λ©νλ κ²μ κΆνμ§ μλλ€.
μ»΄νμΌλ¬κ° μ΄λ€ λ©μλλ₯Ό μ¬μ©ν΄μΌ νλμ§ κ΅¬λΆνμ§ λͺ»νκΈ° λλ¬Έμ μ»΄νμΌ μλ¬κ° λ°μνκΈ° λλ¬Έμ΄λ€.
class Printer {
public void print(String c, String... str) {
System.out.println("첫λ²μ§Έ λ©μλ");
System.out.println("rest parameters : " + Arrays.toString(str));
}
public void print(String... str) {
System.out.println("λλ²μ§Έ λ©μλ");
}
}
public class Main2 {
public static void main(String[] args) {
Printer p = new Printer();
// μ΄ λ©μλλ 첫λ²μ§Έ λ©μλμλ λλ²μ§Έ λ©μλμμλ μ€νμ΄ κ°λ₯νκΈ° λλ¬Έμ μ»΄νμΌλ¬κ° νκΉλ € μ€λ₯λ₯Ό λ°μνκ² λλ€.
p.print("-", "1", "2", "3");
}
}
3. λ°°μ΄ νμ λ§€κ°λ³μμ νΌμ© X
κ°λ³ μΈμλ λ΄λΆμ μΌλ‘ λ°°μ΄μ μμ±ν΄μ μ¬μ©νλ κ² κ°λ€.
λ°λΌμ λ€μκ³Ό κ°μ΄ λ°°μ΄ νμ μ λ§€κ°λ³μμ λμμ μ μν΄ μ¬μ©μ΄ λΆκ°λ₯νλ€.
4. μ λ€λ¦ νμ κ³Ό ν¨κ» μΈλμλ μ μ€ν΄λΌ
μ΄ λΆλΆμ Effective Javaμ λμ€λ κ³ κΈ λ΄μ©μ΄λ€.
κ°λ³ μΈμλ νλΌλ―Έν°μ κ°μλ₯Ό ν΄λΌμ΄μΈνΈκ° μ‘°μ ν μ μλλ‘ ν΄μ£Όμ§λ§ ꡬν λ°©μμ νμ μ΄ μ‘΄μ¬νλ€.
μμμ λ§νλ―μ΄, κ°λ³ μΈμ λ©μλλ₯Ό νΈμΆνκ² λλ©΄ κ°λ³ μΈμλ₯Ό λ΄κΈ° μν λ°°μ΄μ΄ μλμΌλ‘ νλ λ§λ€μ΄μ§λλ°, μ΄λ μ λ€λ¦ νμ
νλΌλ―Έν°μ κ°μ μ€μ²΄ν λΆκ° νμ
μ λ°νμ μ νμ
μ λ³΄κ° μκ±°λκΈ° λλ¬Έμ, κ°λ³ μΈμμ μ λ€λ¦μ΄λ λ§€κ°λ³μν νμ
(List<String>)μ΄ ν¬ν¨λκ³ μ΄λ₯Ό λ
ΈμΆν κ²½μ° λ¬Έμ κ° μΌμΌν¬μ μλ€.
μλ₯Όλ€μ΄ λ€μ toArray() λ©μλλ μ λ€λ¦ νμ
μΌλ‘ κ°λ³ μΈμ λ°°μ΄μ λ°κ³ μ΄λ₯Ό κ·Έλλ‘ λ°ννλ€.
μ΄λ νμ
μ λ¨μΈν μ μκΈ° λλ¬Έμ λͺ¨λ νμ
μ λ°μ μ μλ Object[] νμ
λ°°μ΄λ‘ λ§λ€μ΄ λ°ννκ² λλλ°, κ²°κ΅ λ©μΈ λ©μλμμ μ³μ§ μμ λ€μ΄μΊμ€ν
μ΄ μΌμ΄λμ ClassCastException μμΈκ° λ°μνκ² λλ€.
class Printer {
// μ λ€λ¦ νμ
μΌλ‘ λ°λ κ°λ³ μΈμ
public <T> T[] toArray(T... args) {
return args; // κ°λ³ μΈμλ€μ λ¬Έμ μμ΄ λ΄κΈ° μν΄ μ΄λ€ νμ
λ λ΄μ μ μλ κ°μ₯ μμ νμ
μΈ Object λ°°μ΄μ λ§λ€μ΄ λ°ν
}
public <T> T[] pick(T a, T b, T c) {
T[] arr = toArray(a, b, c); // Object[] νμ
λ°°μ΄λ‘ 리ν΄λλ€.
return arr;
}
}
public class Main {
public static void main(String[] args) {
Printer p =new Printer();
// μ λ€λ¦ λ©μλμ String νμ
μΌλ‘ μ λ¬
String[] s = p.pick("1","2","3"); // ! ERROR - Object[] νμ
μ String[] νμ
μΌλ‘ λ€μ΄μΊμ€ν
μ΄ λΆκ°λ₯νλ€.
}
}
λ°λΌμ μ λ€λ¦κ³Ό κ°λ³ μΈμλ₯Ό κ°μ΄ μ¬μ©ν μΌμ΄ μμ κ²½μ°, λ°°μ΄ λμ 리μ€νΈ μ λ€λ¦μΌλ‘ νμ μ μ ν(extends / super)νλ μμΌλ‘ λ©μλλ₯Ό μ€κ³νκ±°λ, μ λ€λ¦ κ°λ³ μΈμ λ°°μ΄μ λ€λ₯Έ λ©μλκ° μ κ·Όνλλ‘ νμ§ μκ² νλ κ²μ΄ μ’λ€.