๐น chap13. ๋ํดํธ ๋ฉ์๋
์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝ(์๋ก์ด ๋ฉ์๋ ์ถ๊ฐ ๋ฑ)ํ๊ณ ์ ํ ๋ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์์ํ ๋ชจ๋ ํด๋์ค๋ฅผ ๊ณ ์ณ์ผ ํ๋ค๋ฉด ๋งค์ฐ ๋นํฉ์ค๋ฌ์ธ ๊ฒ์ด๋ค.
์๋ฐ 8์์๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์๋ฐ 8์์๋ ๊ธฐ๋ณธ ๊ตฌํ์ ํฌํจํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
- ์ธํฐํ์ด์ค ๋ด๋ถ์ ์ ์ ๋ฉ์๋ ์ฌ์ฉ
- ์ธํฐํ์ด์ค์ ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตํ ์ ์๋๋ก ๋ํดํธ ๋ฉ์๋ ๊ธฐ๋ฅ ์ฌ์ฉ
๋ฉ์๋ ๊ตฌํ์ ํฌํจํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ ์ ์๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ธฐ์กด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ ์๋์ผ๋ก ์ธํฐํ์ด์ค์ ์ถ๊ฐ๋ ์๋ก์ด ๋ฉ์๋์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์์๋ฐ๊ฒ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ์กด์ ์ฝ๋ ๊ตฌํ์ ๋ฐ๊พธ๋๋ก ๊ฐ์ํ์ง ์์ผ๋ฉด์๋ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋๊ฐ์ง ์๋ก List ์ธํฐํ์ด์ค์ sort์ Collection ์ธํฐํ์ด์ค์ stream ๋ฉ์๋๊ฐ ์๋ค.
List ์ธํฐํ์ด์ค์ sort ๋ฉ์๋๋ ์๋ฐ 8์์ ์๋ก ์ถ๊ฐ๋ ๋ฉ์๋๋ค. ๋ค์์ sort์ ๊ตฌํ ์ฝ๋๋ค.
1
2
3
default void sort(Comparator<? super E> c) {
Collections.sort(this, c);
}
๋ฐํ ํ์ void ์์ default๋ผ๋ ์๋ก์ด ํค์๋๊ฐ ๋ฑ์ฅํ๋ค.
default ํค์๋๋ ํด๋น ๋ฉ์๋๊ฐ ๋ํดํธ ๋ฉ์๋์์ ๊ฐ๋ฆฌํจ๋ค. ์ฌ๊ธฐ์ sort ๋ฉ์๋๋ Collections.sort ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ์ด ๋ฉ์๋ ๋๋ถ์ ๋ฆฌ์คํธ์์ ์ง์ sort๋ฅผ ํธ์ถํ ์ ์๊ฒ ๋์๋ค.
1
2
List<Integer> numbers = Arrays.asList(3, 5, 1, 2, 6);
numbers.sort(Comparator.naturalOrder()); //sort๋ List ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ค
naturalOrder โ ์์ฐ์์(ํ์ค ์ํ๋ฒณ ์์)๋ก ์์๋ฅผ ์ ๋ ฌํ ์ ์๋๋ก Comparator ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ Comparator ์ธํฐํ์ด์ค์ ์ถ๊ฐ๋ ์๋ก์ด ์ ์ ๋ฉ์๋๋ค.
๋ค์์ Collection์ stream ๋ฉ์๋ ์ ์ ์ฝ๋๋ค.
1
2
3
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
stream ๋ฉ์๋๋ ๋ด๋ถ์ ์ผ๋ก StreamSupport.stream์ด๋ผ๋ ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์คํธ๋ฆผ์ ๋ฐํํ๋ค. stream ๋ฉ์๋์ ๋ด๋ถ์์๋ Collection ์ธํฐํ์ด์ค์ ๋ค๋ฅธ ๋ํดํธ ๋ฉ์๋ spliterator๋ ํธ์ถํ๋ค.
๋ํดํธ ๋ฉ์๋๋ ์ฃผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค๊ณ์๋ค์ด ์ฌ์ฉํ๋ค. ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ์๋ฐ API์ ํธํ์ฑ์ ์ ์งํ๋ฉฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ฉด ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค.
โ ์ธํฐํ์ด์ค์ ์๋ก ์ถ๊ฐ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋๋ก ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ธฐ์กด ํด๋์ค๋ฅผ ๊ณ ์ณ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ณธ์ธ์ด ์ง์ ์ธํฐํ์ด์ค์ ์ด๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ์ํฉ์ด๋ผ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ด๋ ต์ง ์๊ฒ ํด๊ฒฐํ ์ ์์ง๋ง ์ธํฐํ์ด์ค๋ฅผ ๋์ค์ ๊ณต๊ฐํ์ ๋๋ ์ํฉ์ด ๋ค๋ฅด๋ค.
๊ทธ๋์ ๋ํดํธ ๋ฉ์๋๊ฐ ํ์ํ์๋ค.
๋ํดํธ ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ์ธํฐํ์ด์ค์ ๊ธฐ๋ณธ ๊ตฌํ์ ๊ทธ๋๋ก ์์ํ๋ฏ๋ก ์ธํฐํ์ด์ค์ ์์ ๋กญ๊ฒ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ๋๋ค.
๋ํดํธ ๋ฉ์๋๋ ๋ค์ค ์์์ด๋ผ ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ฉด์ ํ๋ก๊ทธ๋จ ๊ตฌ์ฑ์๋ ๋์์ ์ค๋ค(์ด์ ํด๋์ค๋ ์ฌ๋ฌ ๋ํดํธ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ ์๊ฒ ๋์๋ค)
13.1 ๋ณํํ๋ API
ex) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค๊ณ
- ๋ชจ์์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ๋ฐ ํ์ํ setHeight, setWeight, getHeight, getWidth, setAbsoluteSize ๋ฑ์ ๋ฉ์๋๋ฅผ ์ ์ํ๋ Resizable ์ธํฐํ์ด์ค
- Rectangle์ด๋ Square์ฒ๋ผ Resizable์ ๊ตฌํํ๋ ํด๋์ค ์ ๊ณต
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ธ๊ธฐ๋ฅผ ์ป์ผ๋ฉฐ ์ผ๋ถ ์ฌ์ฉ์๋ ์ง์ Resizable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ Ellipse๋ผ๋ ํด๋์ค ๊ตฌํ
API๋ฅผ ๋ฆด๋ฆฌ์ฆ ํ ํ Resizable์ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ด ๋ถ์กฑํ๋ค๋ ์ฌ์ค์ ์๊ฒ๋์๋ค. ์๋ฅผ ๋ค์ด Resizable ์ธํฐํ์ด์ค์ ํฌ๊ธฐ ์กฐ์ ์ธ์๋ก ๋ชจ์์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ setRelativeSize๋ผ๋ ๋ฉ์๋๊ฐ ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ Resizable์ setRelativeSize๋ฅผ ์ถ๊ฐํ ๋ค์์ Square๊ณผ Rectangle ๊ตฌํ๋ ๊ณ ์ณค๋ค.
์ด๋ ๊ฒ ๋๋ฉด Resizable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ฌ์ฉ์๋ ์ด๋ป๊ฒ ๋๋ ๊ฑธ๊น?
์ํ๊น๊ฒ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์๊ฐ ๋ง๋ ํด๋์ค๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ํ ์๋ ์๋ค.
์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค๊ณ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐ๊พธ๊ณ ์ถ์ ๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
13.1.1 API ๋ฒ์ 1
Resizable ์ธํฐํ์ด์ค ์ด๊ธฐ ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์๋๋ฅผ ํฌํจํ๋ค.
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);
}
์ฌ์ฉ์ ๊ตฌํ
์ฐ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฆ๊ฒจ ์ฌ์ฉํ๋ ์ฌ์ฉ์ ์ค ํ ๋ช ์ ์ง์ Resizable์ ๊ตฌํํ๋ Ellipse ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
1
2
3
public class Ellipse implements Resizable {
...
}
์ด ์ฌ์ฉ์๋ ๋ค์ํ Resizable ๋ชจ์(์์ ์ด ๋ง๋ Ellipse๋ฅผ ํฌํจํ์ฌ)์ ์ฒ๋ฆฌํ๋ ๊ฒ์์ ๋ง๋ค์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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); //๊ฐ ๋ชจ์์ setAbsoluteSize ํธ์ถ
r.draw();
});
}
}
13.1.2 API ๋ฒ์ 2
๋ช ๊ฐ์์ด ์ง๋์ Resizable์ ๊ตฌํํ๋ Square์ Rectangle ๊ตฌํ์ ๊ฐ์ ํด๋ฌ๋ผ๋ ๋ง์ ์์ฒญ์ ๋ฐ์๋ค. ๊ทธ๋์ ๋ค์์ฒ๋ผ API ๋ฒ์ 2๋ฅผ ๋ง๋ค์๋ค.
1
2
3
4
5
6
7
8
9
public interface Resizable {
int getWidth();
int getHeight();
void setWidth(int width);
void setHeight(int height);
void setAbsoluteSize(int width, int height);
// API ๋ฒ์ 2์ ์ถ๊ฐ๋ ์๋ก์ด ๋ฉ์๋
void setRelativeSize(int wFactor, int hFactor);
}
์ฌ์ฉ์๊ฐ ๊ฒช๋ ๋ฌธ์
Resizable์ ๊ณ ์น๋ฉด ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
Resizable์ ๊ตฌํํ๋ ๋ชจ๋ ํด๋์ค๋ setRelativeSize ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค. (ํ์ง๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์๊ฐ ์ง์ ๊ตฌํํ Ellipse๋ serRelativeSize ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง ์๋๋ค.)
โ ์ธํฐํ์ด์ค์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฐ์ด๋๋ฆฌ ํธํ์ฑ์ ์ ์ง๋๋ค.
(๋ฐ์ด๋๋ฆฌ ํธํ์ฑ: ์๋ก ์ถ๊ฐ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง๋ง ์์ผ๋ฉด ์๋ก์ด ๋ฉ์๋ ๊ตฌํ์ด ์์ด๋ ๊ธฐ์กด ํด๋์ค ํ์ผ ๊ตฌํ์ด ์ ๋์ํ๋ค.)
ํ์ง๋ง ์ธ์ ๊ฐ ๋๊ตฐ๊ฐ๋ Resizable์ ์ธ์๋ก ๋ฐ๋ Utils.paint์์ setRelativeSize๋ฅผ ์ฌ์ฉํ๋๋ก ์ฝ๋๋ฅผ ๋ฐ๊ฟ ์ ์๋ค. ์ด๋ Ellipse ๊ฐ์ฒด๊ฐ ์ธ์๋ก ์ ๋ฌ๋๋ฉด Ellipse๋ setRelativeSize ๋ฉ์๋๋ฅผ ์ ์ํ์ง ์์์ผ๋ฏ๋ก ๋ฐํ์์ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
1 2
Exception in thread "main" java.lang.AbstractMethodError: lambdasinaction.chap9. Ellipse.setRelativeSize(II)V
์ฌ์ฉ์๊ฐ Ellipse๋ฅผ ํฌํจํ๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋น๋ํ ๋ ๋ค์๊ณผ ๊ฐ์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
1 2
lambdasinaction/chap9/Ellipse.java:6: error: Ellipse is not abstract and does not override abstract method setRelativeSize(int, int) in Resizable
๊ณต๊ฐ๋ API๋ฅผ ๊ณ ์น๋ฉด ๊ธฐ์กด ๋ฒ์ ๊ณผ ํธํ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฐ ์ด์ ๋๋ฌธ์ ๊ณต์ ์๋ฐ ์ปฌ๋ ์ API ๊ฐ์ ๊ธฐ์กด์ API๋ ๊ณ ์น๊ธฐ ์ด๋ ต๋ค. ๋ฌผ๋ก API๋ฅผ ๋ฐ๊ฟ ์ ์๋ ๋ช ๊ฐ์ง ๋์์ด ์์ง๋ง ์๋ฒฝํ ํด๊ฒฐ์ฑ ์ ๋ ์ ์๋ค.
์๋ฅผ ๋ค์ด ์์ ๋ง์ API๋ฅผ ๋ณ๋๋ก ๋ง๋ ๋ค์ ์์ ๋ฒ์ ๊ณผ ์๋ก์ด ๋ฒ์ ์ ์ง์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ ์๋ค. โ ์ฌ๋ฌ ๊ฐ์ง๋ก ๋ถํธํ ์
(1) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ฆฌ ๋ณต์ก
(2) ์ฌ์ฉ์๋ ๊ฐ์ ์ฝ๋์ ์์ ๋ฒ์ ๊ณผ ์๋ก์ด ๋ฒ์ ๋ ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ชจ๋ ์ฌ์ฉํด์ผ ํจ
๊ฒฐ๊ตญ ํ๋ก์ ํธ์์ ๋ก๋ฉํด์ผ ํ ํด๋์ค ํ์ผ์ด ๋ง์์ง๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๊ณผ ๋ก๋ฉ ์๊ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ํดํธ ๋ฉ์๋๋ก ์ด ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๋ํดํธ ๋ฉ์๋๋ฅผ ์ด์ฉํด์ API๋ฅผ ๋ฐ๊พธ๋ฉด ์๋กญ๊ฒ ๋ฐ๋ ์ธํฐํ์ด์ค์์ ์๋์ผ๋ก ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตํ๋ฏ๋ก ๊ธฐ์กด ์ฝ๋๋ฅผ ๊ณ ์น์ง ์์๋ ๋๋ค.
13.2 ๋ํดํธ ๋ฉ์๋๋ ๋ฌด์์ธ๊ฐ?
์๋ฐ 8์์๋ ํธํ์ฑ์ ์ ์งํ๋ฉด์ API๋ฅผ ๋ฐ๊ฟ ์ ์๋๋ก ์๋ก์ด ๊ธฐ๋ฅ์ธ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค. ์ด์ ์ธํฐํ์ด์ค๋ ์์ ์ ๊ตฌํํ๋ ํด๋์ค์์ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง ์์ ์ ์๋ ์๋ก์ด ๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ์ ๊ณตํ๋ค.
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค์์ ๊ตฌํํ์ง ์์ ๋ฉ์๋๋ ์ธํฐํ์ด์ค ์์ฒด์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ค.(๊ทธ๋์ ๊ตฌํ์ด ํ์๊ฐ ์๋)
๋ํดํธ ๋ฉ์๋
- default๋ผ๋ ํค์๋๋ก ์์
- ๋ค๋ฅธ ํด๋์ค์ ์ ์ธ๋ ๋ฉ์๋์ฒ๋ผ ๋ฉ์๋ ๋ฐ๋ ํฌํจ
ex) ์ปฌ๋ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Sized ์ธํฐํ์ด์ค ์ ์
1
2
3
4
5
6
public interface Sized {
int size();
default boolean isEmpty() { // ๋ํดํธ ๋ฉ์๋
return size() == 0;
}
}
์ด์ Sized ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ชจ๋ ํด๋์ค๋ isEmpty์ ๊ตฌํ๋ ์์๋ฐ๋๋ค. ์ฆ, ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ฉด ์์ค ํธํ์ฑ์ด ์ ์ง๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ๋ํดํธ ๋ฉ์๋๋ฅผ ์ด์ฉํด setRelativeSize์ ๋ํดํธ ๊ตฌํ์ ์ ๊ณตํ๋ฉด ํธํ์ฑ์ ์ ์งํ๋ฉฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณ ์น ์ ์๋ค.
1
2
default void setRelativeSize(int wFactor, int hFactor) {
setAbsoluteSize(getWidth() / wFactor, getHeight() / hFactor);
- ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค์ ์ฐจ์ด
- ํด๋์ค๋ ํ๋์ ์ถ์ ํด๋์ค๋ง ์์๋ฐ์ ์ ์์ง๋ง ์ธํฐํ์ด์ค๋ ์ฌ๋ฌ ๊ฐ ๊ตฌํํ ์ ์๋ค.
- ์ถ์ ํด๋์ค๋ ์ธ์คํด์ค ๋ณ์(ํ๋)๋ก ๊ณตํต ์ํ๋ฅผ ๊ฐ์ง ์ ์๋ค. ํ์ง๋ง ์ธํฐํ์ด์ค๋ ์ธ์คํด์ค ๋ณ์๋ฅผ ๊ฐ์ง ์ ์๋ค.
Quiz. removeIf
์ฌ๋ฌ๋ถ์ด ์๋ฐ ์ธ์ด์ API์ ๋ฌ์ธ์ด๋ผ๊ณ ๊ฐ์ ํ์. ์ด๋ ๋ ๋ค์์ ์ฌ์ฉ์๋ก๋ถํฐ ArrayList.TreeSet, LinkedList ๋ฐ ๋ค๋ฅธ ๋ชจ๋ ์ปฌ๋ ์ ์์ ์ฌ์ฉํ ์ ์๋ removeIf ๋ฉ์๋๋ฅผ ์ถ๊ฐํด๋ฌ๋ผ๋ ์์ฒญ์ ๋ฐ์๋ค. removeIf ๋ฉ์๋๋ ์ฃผ์ด์ง ํ๋ ๋์ผ์ดํธ์ ์ผ์นํ๋ ๋ชจ๋ ์์๋ฅผ ์ปฌ๋ ์ ์์ ์ ๊ฑฐํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค. ์๋ก์ด removeIf๋ฅผ ๊ธฐ์กด ์ปฌ๋ ์ API์ ๊ฐ์ฅ ์ ์ ํ๊ฒ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น?
์ ๋ต
์ฐ์ ๋ฐ๋๋ก ์ปฌ๋ ์ API๋ฅผ ๊ณ ์น๋ ๊ฐ์ฅ ์ข์ง ์์ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น? ์ปฌ๋ ์ API์ ๋ชจ๋ ๊ตฌํ ํด๋์ค์ removeIf๋ฅผ ๋ณต์ฌ&๋ถ์ฌ๋ฃ๊ธฐ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์๊น? ๋ชจ๋ ์ปฌ๋ ์ ํด๋์ค๋ java.util.Collection ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค. ๊ทธ๋ฌ๋ฉด Collection ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์๊น? ์ง๊ธ๊น์ง ํ์ธํ ๊ฒ์ฒ๋ผ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ธํฐํ์ด์ค์ ์ถ๊ฐํจ์ผ๋ก์จ ์์ค ํธํ์ฑ์ ์ ์งํ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด Collection์ ๊ตฌํํ๋ ๋ชจ๋ ํด๋์ค(๋ฌผ๋ก ์ปฌ๋ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํด๋์ค๋ฟ ์๋๋ผ Collection ์ธํฐํ์ด์ค๋ฅผ ์ง์ ๊ตฌํํ ์ฌ์ฉ์ ํด๋์ค๋ ํฌํจ)๋ ์๋์ผ๋ก removeIf๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
1 2 3 4 5 6 7 8 9 10 11
default boolean removeIf(Predicate<? super E> filter) { boolean removed = false; Iterator<E> each = iterator(); while(each.hasNext()) { if(filter.test(each.next())) { each.remove(); removed = true; } } return removed; }
13.3 ๋ํดํธ ๋ฉ์๋ ํ์ฉ ํจํด
13.3.1 ์ ํํ ๋ฉ์๋
์ ์ฌ์ฉํ์ง ์๋ ๊ธฐ๋ฅ(ex. remove)์๋ ๊ธฐ๋ฅ์ ๋ฌด์ํ๊ณ ๋น ๊ตฌํ์ ์ ๊ณตํ์๋ค.
๋ํดํธ ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด remove ๊ฐ์ ๋ฉ์๋์ ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตํ ์ ์์ผ๋ฏ๋ก ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค์์ ๋น ๊ตฌํ์ ์ ๊ณตํ ํ์๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด ์๋ฐ 8์ Iterator ์ธํฐํ์ด์ค๋ ๋ค์์ฒ๋ผ remove ๋ฉ์๋๋ฅผ ์ ์ํ๋ค.
1
2
3
4
5
6
7
interface Iterator<T> {
boolean hasNext();
T next();
**default void remove() {
throw new UnsupportedOperationException();
}**
}
๊ธฐ๋ณธ ๊ตฌํ์ด ์ ๊ณต๋๋ฏ๋ก Iterator ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ ๋น remove ๋ฉ์๋๋ฅผ ๊ตฌํํ ํ์๊ฐ ์์ด์ก๊ณ , ๋ถํ์ํ ์ฝ๋๋ฅผ ์ค์ผ ์ ์๋ค.
13.3.2 ๋์ ๋ค์ค ์์
๋ํดํธ ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๊ธฐ์กด์๋ ๋ถ๊ฐ๋ฅํ๋ ๋์ ๋ค์ค ์์ ๊ธฐ๋ฅ๋ ๊ตฌํํ ์ ์๋ค.
๋ค์์ฒ๋ผ ํด๋์ค๋ ๋ค์ค ์์์ ์ํด ๊ธฐ์กด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค.
์๋ฐ์์ ํด๋์ค๋ ํ ๊ฐ์ ๋ค๋ฅธ ํด๋์ค๋ง ์์ํ ์ ์์ง๋ง ์ธํฐํ์ด์ค๋ ์ฌ๋ฌ ๊ฐ ๊ตฌํํ ์ ์๋ค. ๋ค์์ ์๋ฐ API์ ์ ์๋ ArrayList ํด๋์ค๋ค.
1
2
3
4
// ํ ๊ฐ์ ํด๋์ค ์์, ๋ค ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable {
}
๋ค์ค ์์ ํ์
์ฌ๊ธฐ์ ArrayList๋ ํ ๊ฐ์ ํด๋์ค๋ฅผ ์์๋ฐ๊ณ , ์ฌ์ฏ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ArrayList๋ AbstractList, List, RandomAccess, Cloneable, Serializable, Iterable, Collection์ ์๋ธ ํ์์ด ๋๋ค. ๋ฐ๋ผ์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋ค์ค ์์์ ํ์ฉํ ์ ์๋ค.
์๋ฐ 8์์๋ ์ธํฐํ์ด์ค๊ฐ ๊ตฌํ์ ํฌํจํ ์ ์์ผ๋ฏ๋ก ํด๋์ค๋ ์ฌ๋ฌ ์ธํฐํ์ด์ค์์ ๋์(๊ตฌํ ์ฝ๋)์ ์์๋ฐ์ ์ ์๋ค.
๊ธฐ๋ฅ์ด ์ค๋ณต๋์ง ์๋ ์ต์์ ์ธํฐํ์ด์ค
ex) ํ์ X, ํฌ๊ธฐ ์กฐ์ O ๋ชจ์ / ํ์ O, ์์ง์O, ํฌ๊ธฐ ์กฐ์ X
์ด๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๋จผ์ setRotationAngle๊ณผ getRotationAngle ๋ ๊ฐ์ ์ถ์ ๋ฉ์๋๋ฅผ ํฌํจํ๋ Rotatable ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ค. ์ธํฐํ์ด์ค๋ ๋ค์ ์ฝ๋์์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ฒ๋ผ setRotationAngle๊ณผ getRotationAngle ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๋ํดํธ ๋ฉ์๋ rotateBy๋ ๊ตฌํํ๋ค.
1
2
3
4
5
6
7
8
public interface Rotatable {
void setRotationAngle(int angleInDegrees);
int getRotationAngle();
// rotateBy ๋ฉ์๋์ ๊ธฐ๋ณธ ๊ตฌํ
default void rotateBy(int angleInDegrees) {
setRotationAngle((getRotationAngle() + angleInDegrees) % 360);
}
}
Rotatable์ ๊ตฌํํ๋ ๋ชจ๋ ํด๋์ค๋ setRotationAngle๊ณผ getRotationAngle์ ๊ตฌํ์ ์ ๊ณตํด์ผ ํ๋ค. ํ์ง๋ง rotateBy๋ ๊ธฐ๋ณธ ๊ตฌํ์ด ์ ๊ณต๋๋ฏ๋ก ๋ฐ๋ก ๊ตฌํ์ ์ ๊ณตํ์ง ์์๋ ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ๋ ๊ฐ์ง ์ธํฐํ์ด์ค Moveable๊ณผ Resizable์ ์ ์ํด์ผ ํ๋ค. ๋ ์ธํฐํ์ด์ค ๋ชจ๋ ๋ํดํธ ๊ตฌํ์ ์ ๊ณตํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface Moveable {
int getX();
int getY();
void setX(int x);
void setY(int y);
default void moveHorizontally(int distance) {
setX(getX() + distance);
}
default void moveVertically(int distance) {
setY(getY() + distance);
}
}
1
2
3
4
5
6
7
8
9
10
11
public interface Resizable {
int getWidth();
int getHeight();
void setWidth(int width);
void setHeight(int height);
void setAbsoluteSize(int width, int height);
default void setRelativeSize(int wFactor, int hFactor) {
setAbsoluteSize(getWidth() / wFactor, getHeight() / hFactor);
}
}
์ธํฐํ์ด์ค ์กฐํฉ
์์ง์ผ ์ ์๊ณ , ํ์ ํ ์ ์์ผ๋ฉฐ, ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ ๊ดด๋ฌผ ํด๋์ค ๊ตฌํ
1
2
3
public class Monster implements Rotatable, Moveable, Resizable {
... // ๋ชจ๋ ์ถ์ ๋ฉ์๋์ ๊ตฌํ์ ์ ๊ณตํด์ผ ํ์ง๋ง ๋ํดํธ ๋ฉ์๋์ ๊ตฌํ์ ์ ๊ณตํ ํ์๊ฐ ์๋ค
}
Monster ํด๋์ค๋ Rotatable, Moveable, Resizable ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ์์๋ฐ๋๋ค(rotateBy, moveHorizontally, moveVertically, setRelativeSize)
์์๋ฐ์ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ ์ ์๋ค.
1
2
3
Monster m = new Monster(); // ์์ฑ์๋ ๋ด๋ถ์ ์ผ๋ก ์ขํ, ๋์ด, ๋๋น, ๊ธฐ๋ณธ ๊ฐ๋๋ฅผ ์ค์ ํ๋ค
m.rotateBy(180); // Rotataable์ rotateBy ํธ์ถ
m.moveVertically(10); // Moveable์ moveVertically ํธ์ถ
์ด๋ฒ์๋ ์์ง์ผ ์ ์์ผ๋ฉฐ ํ์ ํ ์ ์์ง๋ง, ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ Sun ํด๋์ค๋ฅผ ์ ์ํ๋ค.
1
2
3
public class Sun implements Moveable, Rotatable {
...
}
์ธํฐํ์ด์ค์ ๋ํดํธ ๊ตฌํ์ ํฌํจ์ํค๋ฉด ๋ ๋ค๋ฅธ ์ฅ์ ์ด ์๊ธด๋ค. ์๋ฅผ ๋ค์ด moveVertically์ ๊ตฌํ์ ๋ ํจ์จ์ ์ผ๋ก ๊ณ ์ณ์ผ ํ๋ค๊ณ ๊ฐ์ ํ์. ๋ํดํธ ๋ฉ์๋ ๋๋ถ์ Moveable ์ธํฐํ์ด์ค๋ฅผ ์ง์ ๊ณ ์น ์ ์๊ณ ๋ฐ๋ผ์ Moveable์ ๊ตฌํํ๋ ๋ชจ๋ ํด๋์ค๋ ์๋์ผ๋ก ๋ณ๊ฒฝํ ์ฝ๋๋ฅผ ์์๋ฐ๋๋ค(๋ฌผ๋ก ๊ตฌํ ํด๋์ค์์ ๋ฉ์๋๋ฅผ ์ ์ํ์ง ์์ ์ํฉ์ ํํด์๋ค)
13.4 ํด์ ๊ท์น
๊ฐ์ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ๋ค์ค ์์ ๋ฐ๋ ์ํฉ์์ ์ด๋ค ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ธ๊ฐ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public interface A {
default void hello() {
System.out.println("Hello from A");
}
}
public interface B extends A {
default void hello() {
System.out.println("Hello from B");
}
}
public class C implements B, A {
public static void main(String... args) {
new C().hello(); // ๋ฌด์์ด ์ถ๋ ฅ๋ ๊น?
}
}
13.4.1 ์์์ผ ํ ์ธ ๊ฐ์ง ํด๊ฒฐ ๊ท์น
๋ค๋ฅธ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ก๋ถํฐ ๊ฐ์ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ๋ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ๋๋ ์ธ ๊ฐ์ง ๊ท์น์ ๋ฐ๋ผ์ผ ํ๋ค.
- ํด๋์ค๊ฐ ํญ์ ์ด๊ธด๋ค. ํด๋์ค๋ ์ํผํด๋์ค์์ ์ ์ํ ๋ฉ์๋๊ฐ ๋ํดํธ ๋ฉ์๋๋ณด๋ค ์ฐ์ ๊ถ์ ๊ฐ๋๋ค.
1๋ฒ ๊ท์น ์ด์ธ์ ์ํฉ์์๋ ์๋ธ์ธํฐํ์ด์ค๊ฐ ์ด๊ธด๋ค. ์์๊ด๊ณ๋ฅผ ๊ฐ๋ ์ธํฐํ์ด์ค์์ ๊ฐ์ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ๋ ๋ฉ์๋๋ฅผ ์ ์ํ ๋๋ ์๋ธ์ธํฐํ์ด์ค๊ฐ ์ด๊ธด๋ค.
โ ์ฆ, B๊ฐ A๋ฅผ ์์๋ฐ๋๋ค๋ฉด B๊ฐ A๋ฅผ ์ด๊ธด๋ค.
- ์ฌ์ ํ ๋ํดํธ ๋ฉ์๋์ ์ฐ์ ์์๊ฐ ๊ฒฐ์ ๋์ง ์์๋ค๋ฉด ์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๊ฐ ๋ช ์์ ์ผ๋ก ๋ํดํธ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๊ณ ํธ์ถํด์ผ ํ๋ค.
13.4.2 ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ์๋ธ์ธํฐํ์ด์ค๊ฐ ์ด๊ธด๋ค
B์ A๋ hello๋ผ๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ์ํ๋ค. ๋ํ B๋ A๋ฅผ ์์๋ฐ๋๋ค.
2์ ๊ท์น์ ๋ฐ๋ผ B์ hello๋ฅผ ์ ํํ๋ค. ์ฆ, โHello from Bโ๋ฅผ ์ถ๋ ฅํ๋ค.
๋ค์์ฒ๋ผ C๊ฐ D๋ฅผ ์์๋ฐ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ์ง ๋ณด์
1
2
3
4
5
6
public class D implements A { }
public class C extends D implements B, A {
public static void main(String... args) {
new C().hello(); // ๋ฌด์์ด ์ถ๋ ฅ๋ ๊น?
}
}
1๋ฒ ๊ท์น์ ํด๋์ค์ ๋ฉ์๋ ๊ตฌํ์ด ๊ธด๋ค๊ณ ์ค๋ช ํ๋ค. D๋ hello๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ์ง ์์๊ณ ๋จ์ํ ์ธํฐํ์ด์ค A๋ฅผ ๊ตฌํํ๋ค. ๋ฐ๋ผ์ D๋ ์ธํฐํ์ด์ค A์ ๋ํดํธ ๋ฉ์๋ ๊ตฌํ์ ์์๋ฐ๋๋ค.
2๋ฒ ๊ท์น์์๋ ํด๋์ค๋ ์ํผํด๋์ค์ ๋ฉ์๋ ์ ์๊ฐ ์์ ๋๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ์ํ๋ ์๋ธ ์ธํฐํ์ด์ค๊ฐ ์ ํ๋๋ค. ๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ๋ ์ธํฐํ์ด์ค A์ hello๋ ์ธํฐํ์ด์ค B์ hello ๋ ์ค ํ๋๋ฅผ ์ ํํด์ผ ํ๋ค. ์ฌ๊ธฐ์ B๊ฐ A๋ฅผ ์์๋ฐ๋ ๊ด๊ณ์ด๋ฏ๋ก ์ด๋ฒ์๋ โHello from Bโ๊ฐ ์ถ๋ ฅ๋๋ค.
Quiz. ํด์ ๊ท์น์ ๊ธฐ์ตํ๋ผ
ํ๋ก๊ทธ๋จ์ ์คํ ๊ฒฐ๊ณผ๋ ๋ฌด์์ธ๊ฐ?
1 2 3 4 5 6 7 8 9 10 11
public class D implements A { void hello() { System.out.println("Hello from D"); } } public class C extends D implements B, A { public static void main(String... args) { new C().hello(); } }
์ ๋ต
์คํ ๊ฒฐ๊ณผ๋ โHello from Dโ์ด๋ค. ๊ท์น 1์ ์ํด ์ํผํด๋์ค์ ๋ฉ์๋ ์ ์๊ฐ ์ฐ์ ๊ถ์ ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
D๊ฐ ๋ค์์ฒ๋ผ ๊ตฌํ๋์๋ค๊ณ ๊ฐ์ ํ์.
1 2 3
public abstract class D implements A { public abstract void hello(); }
๊ทธ๋ฌ๋ฉด A์์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ๊ณตํจ์๋ ๋ถ๊ตฌํ๊ณ C๋ hello๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
13.4.3 ์ถฉ๋ ๊ทธ๋ฆฌ๊ณ ๋ช ์์ ์ธ ๋ฌธ์ ํด๊ฒฐ
์ด๋ฒ์๋ B๊ฐ A๋ฅผ ์์๋ฐ์ง ์๋ ์ํฉ์ด๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
public interface A {
default void hello() {
System.out.println("Hello from A");
}
}
public interface B {
default void hello() {
System.out.println("Hello from B");
}
}
public class C implements B, A { }
์ด๋ฒ์๋ ์ธํฐํ์ด์ค๊ฐ ์์ ๊ด๊ณ๊ฐ ์์ผ๋ฏ๋ก 2๋ฒ ๊ท์น์ ์ ์ฉํ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก A์ B์ hello ๋ฉ์๋๋ฅผ ๊ตฌ๋ณํ ๊ธฐ์ค์ด ์๋ค.
๋ฐ๋ผ์ ์๋ฐ ์ปดํ์ผ๋ฌ๋ ์ด๋ค ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ ์ง ์ ์ ์์ผ๋ฏ๋ก โError: class C inherits unrelated defaults for hello() from types B and Aโ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ถฉ๋ ํด๊ฒฐ
ํด๋์ค์ ๋ฉ์๋ ๊ด๊ณ๋ก ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ํํ ์ ์๋ ์ํฉ์์ ์ ํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค.
โ ํด๋์ค C์์ hello ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ ๋ค์์ ํธ์ถํ๋ ค๋ ๋ฉ์๋๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํด์ผ ํ๋ค.
์๋ฐ 8์์๋ X.super.m(โฆ) ํํ์ ์๋ก์ด ๋ฌธ๋ฒ์ ์ ๊ณตํ๋ค. ์ฌ๊ธฐ์ X๋ ํธ์ถํ๋ ค๋ ๋ฉ์๋ m์ ์ํผ ์ธํฐํ์ด์ค๋ค. ์๋ฅผ ๋ค์ด ๋ค์์ฒ๋ผ C์์ B์ ์ธํฐํ์ด์ค๋ฅผ ํธ์ถํ ์ ์๋ค.
1
2
3
4
5
public class C implements B, A {
void hello() {
B.super.hello(); // ๋ช
์์ ์ผ๋ก ์ธํฐํ์ด์ค B์ ๋ฉ์๋ ์ ํ
}
}
Quiz. ๊ฑฐ์ ๋น์ทํ ์๊ทธ๋์ฒ
์ธํฐํ์ด์ค A์ B๊ฐ ๋ค์์ฒ๋ผ ์ ์๋์ด ์๋ค๊ณ ๊ฐ์ ํ์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
public interface A { default Number getNumber() { return 10; } } public interface B { default Integer getNumber() { return 42; } } public class C implements B, A { public static void main(String... args) { System.out.println(new C().getNumber())); } }
ํ๋ก๊ทธ๋จ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋?
์ ๋ต
C๋ A์ B ๋ฉ์๋๋ฅผ ๊ตฌ๋ถํ ์ ์๋ค. ๋ฐ๋ผ์ ํด๋์ค C์์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
13.4.4 ๋ค์ด์๋ชฌ๋ ๋ฌธ์
1
2
3
4
5
6
7
8
9
10
11
12
public interface A {
default void hello() {
System.out.println("Hello from A");
}
}
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(); // ๋ฌด์์ด ์ถ๋ ฅ๋ ๊น?
}
}
ํด๋น ์๋๋ฆฌ์ค๋ ๋ค์ด์๋ชฌ๋ ๋ฌธ์ ๋ผ๊ณ ๋ถ๋ฅธ๋ค. D๋ B์ C ์ค ๋๊ตฌ์ ๋ํดํธ ๋ฉ์๋ ์ ์๋ฅผ ์์๋ฐ์๊น? ์ค์ ๋ก ์ ํํ ์ ์๋ ๋ฉ์๋ ์ ์ธ์ ํ๋๋ฟ์ด๋ค. A๋ง ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ์๋ค. ๊ฒฐ๊ตญ ํ๋ก๊ทธ๋จ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ โHello from Aโ๊ฐ ๋๋ค.
B์ C ๋ชจ๋ ๋ํดํธ ๋ฉ์๋ hello ๋ฉ์๋๋ฅผ ์ ์ํ๋ค๋ฉด ์ถฉ๋์ด ๋ฐ์ํ๋ฏ๋ก ๋ ์ค ํ๋์ ๋ฉ์๋๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํด์ผ ํ๋ค.
๋ค์์ฒ๋ผ ์ธํฐํ์ด์ค C์ ์ถ์ ๋ฉ์๋ hello(๋ํดํธ ๋ฉ์๋ ์๋!)๋ฅผ ์ถ๊ฐํ๋ฉด ์ด๋ค์ผ์ด ๋ฐ์ํ ๊น(A์ B์๋ ์๋ฌด ๋ฉ์๋๋ ์ ์ํ์ง ์๋๋ค)?
1
2
3
public interface C extends A {
void hello();
}
C๋ A๋ฅผ ์์๋ฐ์ผ๋ฏ๋ก C์ ์ถ์ ๋ฉ์๋ hello๊ฐ A์ ๋ํดํธ ๋ฉ์๋ hello๋ณด๋ค ์ฐ์ ๊ถ์ ๊ฐ๋๋ค. ๋ฐ๋ผ์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉฐ, ํด๋์ค D๊ฐ ์ด๋ค hello๋ฅผ ์ฌ์ฉํ ์ง ๋ช ์์ ์ผ๋ก ์ ํํ์ฌ ์๋ฌ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ค.