ν¨μν νλ‘κ·Έλλ°μ μ₯μ ?
κ΄μ¬μ¬μ λΆλ¦¬
κ΄μ¬μ¬μ λΆλ¦¬λ 무μμΌκΉ? μμ λ₯Ό λ€μ΄λ³΄μ.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
리μ€νΈμ μλ μμλ§λ€ μ½λ‘ μ μΆκ°νλ € νλ€.
μ΄λ forEach()
λ₯Ό μ¬μ©νλ€λ©΄ ?
@Test
public void ForEachλ₯Ό_νμ©νμ¬_μ½λ‘ μ_μΆκ°νλ_λ¬Έμμ΄_μμ±() {
StringBuilder stringBuilder = new StringBuilder();
for (Integer number : numbers) {
stringBuilder.append(number).append(" : ");
}
if (stringBuilder.length() > 0) {
stringBuilder.delete(stringBuilder.length() - 3, stringBuilder.length());
}
}
λλ μμλ§λ€ μ½λ‘ μΆκ°νλ κ²μ μνλλ°, forEachλ¬Έμ μμ±νλ μ΄λ₯Ό μ΄λ»κ²(How) ꡬνν μ§μ μ§μ€νκ³ μλ κ² κ°λ€.
κ·Έλ λ€λ©΄ ν¨μν νλ‘κ·Έλλ°μ μΌμ’ μΈ Streamμ μ¬μ©νλ€λ©΄ ?
@Test
public void Streamμ_νμ©νμ¬_μ½λ‘ μ_μΆκ°νλ_λ¬Έμμ΄_μμ±() {
final String result = numbers.stream()
.map(String::valueOf)
.collect(joining(COLON_DELIMITER));
}
μμλ§λ€ μ½λ‘ μ κ²°ν©νλ κ²μ λ©μλλ₯Ό μ¬μ©ν¨μΌλ‘μ κ°λ°μμΈ λ΄κ° 무μμ(What)μ μνν κ²μΈμ§μ μ§μ€ν μ μλ€.
Side Effectκ° λ°μνμ§ μλλ€.
- Side Effectλ ? ν¨μ λ΄μ μ€νμΌλ‘ μΈν΄ ν¨μ μΈλΆκ° μν₯μ λ°λ κ²
ν¨μν νλ‘κ·Έλλ°μ νΉμ§μ μ§μ λ³μλ§μ λ³κ²½ν μ μκ³ , 맀κ°λ³μλ₯Ό λ³κ²½νμ§ μλλ€.
μ¦, ν¨μλ κ°μ μΈμκ°μΌλ‘ ν¨μλ₯Ό νΈμΆνμ λ νμ κ°μ κ°μ λ°ννλ€. (μ΄ λ λ€λ₯Έ κ°μ λ°ννλ Random, Scanner λ±μ ν¨μκ° μλλ€).
λ§μ½ ν¨μμ μ°Έμ‘°νλ κ°μ²΄κ° μλ€λ©΄ κ·Έ κ°μ²΄λ λΆλ³μ΄μ΄μΌ νλ©°, ν΄λΉ κ°μ²΄μ λͺ¨λ μ°Έμ‘° νλλ λΆλ³ κ°μ²΄λ₯Ό μ§μ μ°Έμ‘°ν΄μΌ νλ€.
ν¨μ λ΄μμ μμ±ν κ°μ²΄μ νλλ κ°±μ ν μ μμ§λ§, μλ‘ μμ±ν νλμ κ°±μ μ μΈλΆμ λ
ΈμΆλλ©΄ μλλ€.
λν λ€μμ λ©μλλ₯Ό λ€μ νΈμΆν κ²°κ³Όμ μν₯μ λ―ΈμΉμ§ μμΌλ©°, μ΄λ ν μμΈλ μΌμΌν€μ§ μμμΌ νλ€.
κ°μ΄ λ³κ²½λλ κ²μ νμ©ν κ°μ²΄λ₯Ό λ©ν° μ€λ λ νλ‘κ·Έλ¨μμ μ κ·Όνλ€λ©΄, κ°μ΄ μΌμ νμ§ μμ κ²μ΄λ€.
νμ§λ§ λ¨μν ꡬ쑰λ§μΌλ‘ μμμ±μ΄ 보μ₯λμ§λ μκ³ , μ λ ₯μ μ°Έμ‘°κ°μ΄ μ€λ κ²½μ°λ Side-Effectκ° μκΈ΄λ€. μ΄μ λν λ΄μ©μ μ°Έμ‘° ν¬λͺ μ±μ μ΄ν΄λ³΄μ.
μ°Έμ‘° ν¬λͺ μ±
μ°Έμ‘° ν¬λͺ
μ±μ ν¨μκ° ν¨μ μΈλΆμ μν₯μ λ°μ§ μλ κ²μ μλ―Ένλ€.
λ, ν¨μμ κ²°κ³Όλ μ
λ ₯ νλΌλ―Έν°μλ§ μμ‘΄νκ³ , ν¨μ μΈλΆ μΈκ³(μ
λ ₯ μ½μ, νμΌ, λ°μ΄ν° λ² μ΄μ€ λ±)μμ λ°μ΄ν°λ₯Ό μ½μ§ μλλ€.
public static int add(int a, int b) {
if (b > 0) {
a++;
}
return a;
}
μ μμ μ κ²½μ° μμ νμ
μΈ aμ κ°μ λ°κΎΈμλλ°, μλ°μ μμνμ
μ 맀κ°λ³μλ call by value (λ©μλ νΈμΆ μ κΈ°λ³Έ μλ£νμ κ°μ μΈμλ‘ μ λ¬νλ λ°©μ) ννλ‘ μ λ¬μ΄ λμ΄, ν¨μλ₯Ό λ²μ΄λλ aμλ μν₯μ΄ μλ€.
μ¬κΈ°μ μΈμλ‘ μ°Έμ‘° λ³μλ₯Ό λ£μ΄μ£Όλ©΄ μ΄λ€ μΌμ΄ λ°μν μ μμκΉ?
public static int position(Position a, Position b) {
a.setX(b.getX())
return a;
}
μ΄λ κ² μ°Έμ‘° λ³μλ₯Ό λ겨주면 ν¨μ μμμ μ°Έμ‘° λ³μμ κ°μ λ°κΏ μλ μκΈ° λλ¬Έμ side effectκ° λ°μν μ μλ€.
ν¨μν νλ‘κ·Έλλ°μ μ΄λ° Side Effectκ° λ°μνμ§ μλ, μ°Έμ‘° ν¬λͺ
μ±μ΄μ΄μΌ νλ€.
μΌκΈ κ°μ²΄
ν¨μν νλ‘κ·Έλλ°μ ν¨μμΈ λ©μλκ° μΌκΈ κ°μ²΄μμ λ§νλλ°, μΌκΈ κ°μ²΄λ λ€μκ³Ό κ°μ νΉμ±μ κ°μ§λ€.
- λ³μλ λ°μ΄ν°μ ν λΉν μ μμ΄μΌ νλ€.
- κ°μ²΄μ 맀κ°λ³μλ‘ λκΈΈ μ μμ΄μΌ νλ€.
- κ°μ²΄μ λ°ν κ°μΌλ‘ 리ν΄ν μ μμ΄μΌ νλ€.
μλ°8 μ΄μ κΉμ§, λ©μλλ μΌκΈ κ°μ²΄κ° μλμμ§λ§, μλ°8μ μ΅λͺ
ν¨μμ λ±μ₯μΌλ‘ λ©μλλ μΌκΈ κ°μ²΄λ‘ λ€λ£° μ μκ² λμλ€.
λ μ΄ μ΅λͺ
ν¨μλ₯Ό μ’ λ λ¨μν ν κ²μ΄ λ°λ‘ λλ€ ννμ(lambda expression)μ΄λ€.
Boxingκ³Ό UnBoxing
μμ νμ
μ΄ λνΌ ν΄λμ€λ‘ λ³ννλ κ²μ Boxingμ΄λΌκ³ νλ©°,
λνΌ ν΄λμ€λ₯Ό μμ νμ
μΌλ‘ νλ³ν νλ κ²μ UnBoxingμ΄λΌκ³ νλ€.
JDK1.5λΆν°λ λνΌ ν΄λμ€μ κΈ°λ³Έ μλ£ν μ¬μ΄μ λ³νμ μλμΌλ‘ ν΄μ£Όλ Auto Boxingκ³Ό Auto UnBoxing κΈ°λ₯μ μ§μνλ€.
int i = 10
Integer integer = i; // Auto Boxing
Integer integer1 = new Integer(777); // λͺ
μμ Boxing
int primitive = integer; // Auto UnBoxing
#### Auto Boxingμ΄ μΌμ΄λλ μ
μλ°μμλ λνΌ ν΄λμ€μ λν μ°μ°μ΄ μλλ λ, μ°μ°μ νλ €λ λ κ°μ²΄λ₯Ό Auto Unboxingμ νμ¬ μμνμ
μΌλ‘ λ³ν ν,
μ°μ°μ μννκ² λλ€. λνΌ ν΄λμ€μ μμ νμ
κ° μ°μ°λ λμΌνλ€.
final Integer integer127 = 127;
System.out.println(
Stream.of(1, 2, 3, 4, 127)
.filter(i -> i == integer127)
.findFirst()
);
System.out.println(
Stream.of(1, 2, 3, 4, 128)
.filter(i -> i.equals(integer127))
.findFirst()
);
λ μ€νΈλ¦Ό μ°μ°μμ μμ νμ
int
μΈ κ°λ€μ Streamμ λ§λ€κ³ κ°κ° λνΌ ν΄λμ€ Integer
μ λΉκ΅λ₯Ό ν λ Auto Boxingμ΄ μΌμ΄λλ€.
μ΄λ, findFirst().get()
μ νκ² λλ€λ©΄ λνΌ ν΄λμ€κ° λ°νλλ€.
μ΄λ κ² λλ©΄ κ°κ° μμ νμ
μ Auto Boxingμ΄ μΌμ΄λλ,
μμ νμ
μ λν μ€νΈλ¦Όμ κΈ°λ³Έν νΉν μ€νΈλ¦Ό (IntStream, LongStream, DoubleStream)μ μ¬μ©νλ κ²μ΄ μ±λ₯μ μ’λ€.
β μμ
μμ μμ μ΄ λΆλΆμ΄ μ 127κ³Ό 128λ‘ λλμμκΉ ν¬λ£¨λ€μ΄λ μ΄μΌκΈ°λ₯Ό νλ€.
Integer λνΌ ν΄λμ€λ 127κΉμ§ μΈμ€ν΄μ€λ₯Ό 미리 μμ±ν΄ λκΈ° λλ¬Έμ ==
μ°μ°μλ‘λ λΉκ΅κ° κ°λ₯νμ§λ§ (μ£Όμκ°μ λΉκ΅νλ κ²μ΄λ€),
128λΆν°λ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό λ°ννκΈ° λλ¬Έμ λμΌμ± κ²μ¬μΈ equals()
λ₯Ό μ¬μ©ν΄ λ°ννλ€.