π¦ chap13. λν΄νΈ λ©μλ
chap13. λν΄νΈ λ©μλ
13.1 λ³ννλ API
μλ° 8μμλ κΈ°λ³Έ ꡬνμ ν¬ν¨νλ μΈν°νμ΄μ€λ₯Ό μ μν μ μλ€.
- μ μ λ©μλ μ¬μ©
- λν΄νΈ λ©μλ μ¬μ©
κ²°κ³Όμ μΌλ‘ κΈ°μ‘΄ μΈν°νμ΄μ€λ₯Ό ꡬννλ ν΄λμ€λ μλμΌλ‘ μΈν°νμ΄μ€μ μΆκ°λ μλ‘μ΄ λ©μλμ λν΄νΈ λ©μλλ₯Ό μμ, κΈ°μ‘΄μ μ½λ ꡬνμ λ°κΎΈλλ‘ κ°μνμ§ μμΌλ©΄μ μΈν°νμ΄μ€λ₯Ό λ³κ²½ν μ μλ€.
λν΄νΈ λ©μλκ° μλ μμ μλ μΈν°νμ΄μ€μ λ©μλλ₯Ό μΆκ°νλ©΄μ μ¬λ¬ λ¬Έμ κ° λ°μνλ€.
μλ‘ μΆκ°λ λ©μλλ₯Ό ꡬννλλ‘ μΈν°νμ΄μ€λ₯Ό ꡬννλ κΈ°μ‘΄ ν΄λμ€λ₯Ό κ³ μ³μΌνκΈ° λλ¬Έ
13.1.1 API λ²μ 1
1
2
3
4
5
6
7
public interface Resizable extends Drawable {
int getWidth();
int getHeight();
void setWidth(int width);
void setHeight(int height);
void setAbsoluteSize(int width, int height);
}
μ¬μ©μ ꡬν
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Ellipse implements Resizable {
...
}
public class Game {
public static void main(String ...args) {
List<Resizable> resizableShapes = Arrays.asList(new Square(), new Rectangle(), new Ellipse());
Utils.paint(resizableShapes);
}
}
public class Utils {
public static void paint(List<Resizable> l) {
l.forEach(r -> {
r.setAbsoluteSize(42, 42);
r.draw();
});
}
}
13.1.2 API λ²μ 2
Resizable μ ꡬννλ Square, Rentangle ꡬνμ κ°μ ν΄λ¬λΌλ μμ²μΌλ‘ λ²μ 2λ₯Ό μ μ
1
2
3
4
5
6
7
8
public interface Resizable extends Drawable {
int getWidth();
int getHeight();
void setWidth(int width);
void setHeight(int height);
void setAbsoluteSize(int width, int height);
**void setRelativeSize(int wFactor, int hFactor);**
}
μ¬μ©μκ° κ²ͺλ λ¬Έμ
λΌμ΄λΈλ¬λ¦¬ μ¬μ©μκ° μ§μ ꡬνν Ellipse λ μλ‘μ΄ λ©μλλ₯Ό ꡬννμ§ μλλ€.
μΈν°νμ΄μ€μ μλ‘μ΄ λ©μλλ₯Ό μΆκ°νλ©΄ λ°μ΄λ리 νΈνμ±μ μ μ§λλ€.
νμ§λ§ μ΄νμ μλ‘μ΄ λ©μλλ₯Ό νΈμΆνλ©΄ λ°νμ μλ¬κ° λ°μνκ² λ κ²μ΄λ€.
λν μ 체 μ΄ν리μΌμ΄μ μ μ¬λΉλν λ μ»΄νμΌ μλ¬κ° λ°μνλ€.
- λ°μ΄λ리 νΈνμ± : μλ¬μμ΄ κΈ°μ‘΄ λ°μ΄λλ¦¬κ° μ€νλ μ μλ μν© (νΈμΆνμ§ μλ ν)
- μμ€ νΈνμ± : μ½λλ₯Ό κ³ μ³λ κΈ°μ‘΄ νλ‘κ·Έλ¨μ μ±κ³΅μ μΌλ‘ μ¬μ»΄νμΌν μ μμ
- λμ νΈνμ± : μ½λλ₯Ό λ°κΎΌ λ€μμλ κ°μ μ λ ₯κ°μ΄ μ£Όμ΄μ§λ©΄ κ°μ λμμ μν
13.2 λν΄νΈ λ©μλλ 무μμΈκ°?
μμ μ ꡬννλ ν΄λμ€μμ λ©μλλ₯Ό ꡬννμ§ μμ μ μλ μλ‘μ΄ λ©μλ μκ·Έλμ²λ₯Ό μ 곡
1
2
3
4
5
6
public interface Sized {
int size();
default boolean isEmptry() {
return size() == 0;
}
}
μ΄μ Sized μΈν°νμ΄μ€λ₯Ό ꡬννλ λͺ¨λ ν΄λμ€λ isEmpty μ ꡬνλ μμλ°λλ€.
μλ° 8 API μμλ λν΄νΈ λ©μλκ° μλΉν λ§μ΄ νμ©λμμ κ²μμ μΆμΈ‘ν μ μλ€.
- Collection β stream
- List β sort
- ν¨μν μΈν°νμ΄μ€ (λν΄νΈ λ©μλλ μΆμ λ©μλκ° μλ)
μΆμ ν΄λμ€μ μλ° 8μ μΈν°νμ΄μ€ μ°¨μ΄
- μμ : μΆμ ν΄λμ€λ 1κ°λ§ μμ, μΈν°νμ΄μ€λ μ¬λ¬ κ° κ΅¬ν κ°λ₯
- λ³μ : μΆμ ν΄λμ€λ μΈμ€ν΄μ€ λ³μλ‘ κ³΅ν΅ μνλ₯Ό κ°μ§ μμμ, μΈν°νμ΄μ€λ μΈμ€ν΄μ€ λ³μκ° μλ€
13.3 λν΄νΈ λ©μλ νμ© ν¨ν΄
13.3.1 μ νν λ©μλ
μλ° 8 μ΄μ μ Iterator λ remove κΈ°λ₯μ μ μ¬μ©νμ§ μμ μ΄ κΈ°λ₯μ 무μνκ³ , λ§μ Iterator λ₯Ό ꡬννλ ν΄λμ€μμ λΉ κ΅¬νμ μ 곡νλ€.
λ°λ©΄ λν΄νΈ λ©μλλ₯Ό μ΄μ©νλ©΄ λΉ κ΅¬νμ μ 곡νμ§ μμ λΆνμν μ½λλ₯Ό μ€μΌ μ μλ€.
1
2
3
4
5
6
7
interface Iterator<T> {
boolean hasNext();
T next();
default void remove() {
throw new UnsupportedOperationException();
}
}
13.3.2 λμ λ€μ€ μμ
μλ°μμ ν΄λμ€λ 1κ°μ λ€λ₯Έ ν΄λμ€λ§ μμλ°μ μ μμ§λ§
μΈν°νμ΄μ€λ μ¬λ¬ κ°λ₯Ό ꡬνν μ μλ€.
1
2
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable {}
λ€μ€ μμ νμ
ArrayList λ κ²°κ³Όμ μΌλ‘ AbstractList, List, RandomAccess, Cloneable, Serializable, Iterable, Collection μ μλΈ νμμ΄ λμ΄ λν΄νΈ λ©μλλ₯Ό μ¬μ©νμ§ μκ³ λ λ€μ€ μμμ νμ©ν μ μλ€.
κΈ°λ₯μ΄ μ€λ³΅λμ§ μλ μ΅μμ μΈν°νμ΄μ€
1
2
3
4
5
public interface Rotatable {}
public interface Movable {}
public interface Resizable {}
μΈν°νμ΄μ€ μ‘°ν©
μ΄λ€ μΈν°νμ΄μ€λ₯Ό μ‘°ν©ν΄ λ€μν ν΄λμ€λ₯Ό ꡬνν μ μλ€.
1
2
3
public class Monster implements Rotatable, Moveable, Resizable {}
public class Sun implements Moveable, Rotatable {}
13.4 ν΄μ κ·μΉ
μλ° 8μ λν΄νΈ λ©μλκ° μΆκ°λλ©΄μ κ°μ μκ·Έλμ²λ₯Ό κ°λ λν΄νΈ λ©μλλ₯Ό μμλ°λ μν©μ΄ μκΈΈ μ μλ€.
13.4.1 μμμΌ ν μΈ κ°μ§ ν΄κ²° κ·μΉ
- ν΄λμ€λ μνΌν΄λμ€μμ μ μν λ©μλκ° λν΄νΈ λ©μλλ³΄λ€ μ°μ
- κ·Έ μΈμ μμκ΄κ³λ₯Ό κ°λ μΈν°νμ΄μ€μμλ μλΈ μΈν°νμ΄μ€κ° μ°μ
- κ·ΈλΌμλ μ ν΄μ§μ§ μλλ€λ©΄ λͺ μμ μΌλ‘ μ€λ²λΌμ΄λ ν΄μΌνλ€.
13.4.2 λν΄νΈ λ©μλλ₯Ό μ 곡νλ μλΈμΈν°νμ΄μ€κ° μ΄κΈ΄λ€
1
2
3
4
5
6
7
public class D implements A {}
public class C extends D implements B, A {
public static void main(String ...args) {
new C().hello();
}
}
13.4.3 μΆ©λκ·Έλ¦¬κ³ λͺ μμ μΈ ν΄κ²°
λ€μμ μΈν°νμ΄μ€κ° μμκ΄κ³κ° μμ΄ hello λ©μλλ₯Ό ꡬλ³ν κΈ°μ€μ΄ μκ³ , μλ¬κ° λ°μνλ€.
1
2
3
4
5
6
7
8
9
public interface A {
default void hello() {}
}
public interface B {
default void hello() {}
}
public class C implements B, A {}
μΆ©λ ν΄κ²°
ν΄λμ€μ λ©μλ κ΄κ³λ‘ λν΄νΈ λ©μλλ₯Ό μ νν μ μλ€λ©΄ λͺ μμ μΌλ‘ μ νν΄μ£Όμ΄μΌ νλ€.
μλ° 8μμλ μνΌ μΈν°νμ΄μ€μ λ©μλλ₯Ό νΈμΆν μ μλ λ¬Έλ²μ μ 곡νλ€.
1
2
3
4
5
public class C implements B, A {
void hello() {
B.super.hello(); // λͺ
μμ μΌλ‘ Bμ λ©μλλ₯Ό μ ν
}
}
13.4.4 λ€μ΄μλͺ¬λ λ¬Έμ
1
2
3
4
5
6
7
8
9
10
11
12
public interface A {
default void hello() {}
}
public interface B extends A {}
public interface C extends A {}
public class D implements B, C {
public static void main(String ..args) {
new D().hello();
}
}
μ΄λ Aλ§ λν΄νΈ λ©μλλ₯Ό μ μνκ³ μμ΄ Aμ λ©μλκ° νΈμΆλλ€.
λ§μ½ Bμλ κ°μ μκ·Έλμ²μ λν΄νΈ λ©μλκ° μλ€λ©΄?
μ΄ λλ μΆ©λμ΄ λ°μνκΈ° λλ¬Έμ λͺ μμ νΈμΆμ΄ νμνλ€
λ§μ½ Cμ λν΄νΈ λ©μλκ° μλ μΆμ λ©μλ hello λ₯Ό μΆκ°νλ©΄?
1
2
3
public interface C extends A {
void hello();
}
Cλ Aλ₯Ό μμλ°κΈ° λλ¬Έμ Cμ λ©μλκ° νΈμΆλλ€
μ¦ μ»΄νμΌ μλ¬κ° λ°μνλ©°, ν΄λμ€ Dλ μ΄λ€ hello λ₯Ό μ¬μ©ν μ§ λͺ μμ μΌλ‘ μ€μ ν΄μΌ νλ€.