1. ์ถ์ ํด๋์ค๋ณด๋ค๋ ์ธํฐํ์ด์ค๋ฅผ ์ฐ์ ํ๋ผ
์ค๋ช
- ์๋ฐ๊ฐ ์ ๊ณตํ๋ ๋ค์ค ๊ตฌํ ๋ฉ์ปค๋์ฆ
์ถ์ ํด๋์ค ์ธํฐํ์ด์ค ์ถ์ ํด๋์ค๊ฐ ์ ์ํ ํ์ ์ ๊ตฌํํ๋ ํด๋์ค๋ ๋ฐ๋์ ์ถ์ ํด๋์ค์ ํ์ ํด๋์ค๊ฐ ๋์ด์ผ ํ๋ค.
์๋ฐ๋ ๋จ์ผ ์์๋ง ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ถ์ ํด๋์ค ๋ฐฉ์์ ์๋ก์ด ํ์ ์ ์ ์ํ๋๋ฐ ํฐ ์ ์ฝ์ด ๋๋ค.์ธํฐํ์ด์ค๊ฐ ์ ์ธํ ๋ฉ์๋๋ฅผ ๋ชจ๋ ์ ์ํ๊ณ ๊ทธ ์ผ๋ฐ ๊ท์ฝ์ ์ ์งํจ ํด๋์ค๋ ๋ค๋ฅธ ์ด๋ค ํด๋์ค๋ฅผ ์์ํ๋ ๊ฐ์ ํ์ ์ผ๋ก ์ทจ๊ธ๋๋ค. ๊ธฐ์กด ํด๋์ค ์์ ์๋ก์ด ์ถ์ ํด๋์ค๋ฅผ ๋ผ์๋ฃ๊ธฐ๋ ์ด๋ ต๋ค.
(ํ์ ํด๋์ค๋ค์ด ๊ณต๋ ์์์ ํด์ผํ๊ธฐ ๋๋ฌธ์)๊ธฐ์กด ํด๋์ค์๋ ์์ฝ๊ฒ ์๋ก์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์๋ค. Mixin ์ ์์ ๋ง์ง์๋ค
ํด๋์ค๋ ๋ ๋ถ๋ชจ๋ฅผ ์ฌ๊ธธ ์ ์๊ณ , ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ์๋ ๋ฏน์ค์ธ์ ์ฝ์ ํ๊ธฐ์ ํฉ๋ฆฌ์ ์ธ ์์น๊ฐ ์๋ค.Mixin ์ ์์ ์๋ง๋ค
(Mixin : ํด๋์ค๊ฐ ๊ตฌํํ ์ ์๋ ํ์ ์ผ๋ก ์ด๋ฅผ ๊ตฌํํ ํด๋์ค์ ์๋์ ์ฃผ๋ ๊ธฐ๋ฅ ์ธ์๋ ํน์ ์ ํ์ ํ์๋ฅผ ์ ๊ณตํ๋ค๊ณ ์ ์ธํ๋ ํจ๊ณผ๋ฅผ ์ ๊ณต)
Ex) Comparable์ ์์ ์ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ผ๋ฆฌ๋ ์์๋ฅผ ์ ํ ์ ์๋ค๊ณ ์ ์ธํ๋ ๋ฏน์ค์ธ ์ธํฐํ์ด์ค๊ฐ๋ฅํ ์กฐํฉ ์ ๋ถ๋ฅผ ๊ฐ๊ฐ์ ํด๋์ค๋ก ์ ์ํ ๊ณ ๋๋น๋ง ๊ณ์ธต๊ตฌ์กฐ๊ฐ ๋ง๋ค์ด์ง๋ค.
์์ฑ์ด N๊ฐ๋ผ๋ฉด, ์ง์ํด์ผํ ์กฐํฉ์ ์๋ 2^n๊ฐ๋ ๋๋ค. (combinational explosion | ์กฐํฉ ํญ๋ฐ)
๊ฑฐ๋ํ ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ์๋ ๊ณตํต ๊ธฐ๋ฅ์ ์ ์ํด๋์ ํ์ ์ด ์์ผ๋, ๋งค๊ฐ๋ณ์ ํ์ ๋ง ๋ค๋ฅธ ๋ฉ์๋๋ค์ ์์์ด ๋ง์ด ๊ฐ์ง ๊ฑฐ๋ํ ํด๋์ค๊ฐ ์์ฑ๋ ์ ์๋ค.๊ณ์ธต๊ตฌ์กฐ๊ฐ ์๋ ํ์ ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค ์ ์๋ค.
Ex) ์๊ณก๋ํ๋ ๊ฐ์๋ฅผ ํํํ ๋, ๊ฐ๋จํ๊ฒ ์ธํฐํ์ด์ค ๋๊ฐ๋ฅผ implements ํ๊ฑฐ๋ SingerSongwriter์ด๋ผ๋ ์๋ก์ด ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ์๋ ์๋ค.public interface Singer {
AudioClip sing(Song s);
}
public interface Songwriter {
Song compose(int chartPosition);
}
public interface SingerSongwriter extends Singer, Songwriter {
AudioClip strumO;
void actSensitiveO;
}ํ์ ์ ์ถ์ํด๋์ค๋ก ์ ์ํ๋ฉด, ๊ทธ ํ์ ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ฟ์ด๋ค.
์์์ผ๋ก ๋ง๋ ํด๋์ค๋ ๋ํผ ํด๋์ค๋ณด๋ค ํ์ฉ๋๊ฐ ๋จ์ด์ง๊ณ ๊นจ์ง๊ธฐ๋ ๋ ์ฝ๋ค.๋ํผ ํด๋์ค ๊ด์ฉ๊ตฌ์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ธํฐํ์ด์ค๋ ๊ธฐ๋ฅ์ ํฅ์์ํค๋ ์์ ํ๊ณ ๊ฐ๋ ฅํ ์๋จ์ด ๋๋ค. - ์๋ฐ 8๋ถํฐ ์ธํฐํ์ด์ค๋ default method๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ๋์ด ๋ ๋ฉ์ปค๋์ฆ ๋ชจ๋ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ๊ตฌํํํ๋ก ์ ๊ณตํ ์ ์๋ค.
- ์ธํฐํ์ด์ค์ ๋ฉ์๋์ค ๊ตฌํ ๋ฐฉ๋ฒ์ด ๋ช ๋ฐฑํ ๊ฒ์ด ์๋ค๋ฉด, ๊ทธ ๊ตฌํ์ ๋ํดํธ ๋ฉ์๋๋ก ์ ๊ณตํด ์ผ์ ๋์ด์ค ์ ์๋ค.
default boolean removelf(Predicate<? super E> filter) { Objects. requireNonNulK filter); boolean result = false; for (Iterator<E> it = iteratorO; it.hasNext();) { if (filter.test(it.next())) { it.removeO; result = true; } } return result; }
- ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ๊ณตํ ๋๋ ์์ํ๋ ค๋ ์ฌ๋์ ์ํ ์ค๋ช ์ @implSpec JavaDoc ํ๊ทธ๋ฅผ ๋ถ์ฌ ๋ฌธ์ํํด์ผํ๋ค.
- ๋ํดํธ ๋ฉ์๋์ ์ ์ฝ :
- equals, hashCode ๊ฐ์ Object์ ๋ฉ์๋๋ฅผ ๋ํดํธ ๋ฉ์๋๋ก ์ ๊ณตํด์๋ ์๋๋ค.
- ์ธ์คํด์ค ํ๋๋ฅผ ๊ฐ์ง ์ ์๋ค
- public์ด ์๋ ์ ์ ๋งด๋ฒ๋ ๊ฐ์ง ์ ์๋ค. (๋จ private ์ ์ ๋ฉ์๋๋ ์์ธ)
- ์์ ์ด ๋ง๋ค์ง ์์ ์ธํฐํ์ด์ค์๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด
:์ธํฐํ์ด์ค
์์ถ์ ๊ณจ๊ฒฉ ๊ตฌํ(Skeletal implementation) ํด๋์ค
๋ฅผ ํจ๊ป ์ ๊ณตํ๋ ์์ผ๋ก ์ธํฐํ์ด์ค์ ์ถ์ ํด๋์ค์ ์ฅ์ ์ ๋ชจ๋ ์ทจํ๋ ๋ฐฉ๋ฒ- ์ธํฐํ์ด์ค :
- ํ์ ์ ์
- (ํ์ํ๋ฉด)๋ํดํธ ๋ฉ์๋ ๋ช ๊ฐ๋ ํจ๊ป ์ ๊ณต
- ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค :
- ๋๋จธ์ง ๋ฉ์๋๋ค๊น์ง ๊ตฌํ
- ์ด๋ ๊ฒ ๊ตฌ์ฑํ๋ฉด, ๊ณจ๊ฒฉ ๊ตฌํ์ ํ์ฅํ๋ ๊ฒ ๋ง์ผ๋ก ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ฐ ํ์ํ ์ผ์ด ์๋ฃ๋๋ค. (ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด)
- ๊ด๋ก์ ์ธํฐํ์ด์ค ์ด๋ฆ์ด Interface๋ผ๋ฉด ๊ทธ ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค์ ์ด๋ฆ์ AbstractInterface๋ก ์ง๋๋ค.
- Ex) AbstractCollection, AbstractSet, AbstractList, AbstractMap์ด ํต์ฌ ์ปฌ๋ ์ ์ธํฐํ์ด์ค์ ๊ณจ๊ฒฉ ๊ตฌํ์ด๋ค.
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { protected AbstractList(){ } }
/* AbstractList์์ List ์ธํฐํ์ด์ค๋ฅผ ๋๋ถ๋ถ ๊ตฌํํ๊ณ ๊ตฌํํ์ง ์์ ๋ฉ์๋๋ ์ถ์ ๋ฉ์๋๋ก ๋จ๊ฒจ๋จ๋ค. set(int index , E element) ๋ฉ์๋๋ ๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์๊ณ ๊ตฌํ ๋ด์ฉ์ ๋ Exception์ด ๋์ ธ์ง๋๋ก ๋ง๋ค์๋ค. ์ด๋ฅผ ํตํด list์ addAll() ์ ํ๋ฉฐ ํด๋ผ์ด์ธํธ๊ฐ set์ ๊ตฌํํด์ผํ๋ ์๊ณ ๋ฅผ ๋์ ์๋ค. AbstractList ๊ณจ๊ฒฉ ๊ตฌํ์ผ๋ก ํ์ฉ */ static List<Integer> intArrayAsList(int[] a) { Objects.requireNonNulK a); // ๋ค์ด์๋ชฌ๋ ์ฐ์ฐ์๋ฃ ์ด๋ ๊ฒ ์ฌ์ฉํ๋ ๊ฑด ์๋ฐ 9๋ถํฐ ๊ฐ๋ฅํ๋ค. // ๋ ๋ฎ์ ๋ฒ์ ์ ์ฌ์ฉํ๋ค๋ฉด <Integer>๋ก ์์ ํ์. return new AbstractList() { @Override public Integer get(int i) { return a[i]; // ์คํ ๋ฐ์ฑ(์์ดํ 6) } @Override public Integer set(int i, Integer val) { int oldVal = a[i]; a[i] = val; // ์คํ ์ธ๋ฐ์ฑ return oldVal; // ์คํ ๋ฐ์ } @Override public int sizeO { return a.length; } }; }
- ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค์ ์ฅ์ :
- ์ถ์ ํด๋์ค์ฒ๋ผ ๊ตฌํ์ ๋์์ค๋ค
- ์ถ์ ํด๋์ค๋ก ํ์ ์ ์ ์ํ ๋ ๋ฐ๋ผ์ค๋ ์ ์ฝ์์๋ ์์ ๋กญ๋ค
- ๊ตฌ์กฐ์ ๊ณจ๊ฒฉ ๊ตฌํ์ ํ์ฅํ์ง ๋ชปํ๋ค๋ฉด, ์ธํฐํ์ด์ค๋ฅผ ์ง์ ๊ตฌํํด์ผํ๋ค.
- ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค๋ฅผ ์ฐํ์ ์ผ๋ก ์ด์ฉํ ์ ์๋ค
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์์ ํด๋น ๊ณจ๊ฒฉ ๊ตฌํ์ ํ์ฅํ private ๋ด๋ถ ํด๋์ค๋ฅผ ์ ์ํ๊ณ , ๊ฐ ๋ฉ์๋ ํธ์ถ์ ๋ด๋ถ ํด๋์ค์ ์ธ์คํด์ค์ ์ ๋ฌํ๋ ๊ฒ (Simulated multiple inheritance | ์๋ฎฌ๋ ์ดํธํ ๋ค์ค ์์)
- ๊ณจ๊ฒฉ ๊ตฌํ ์์ฑ ๋ฐฉ๋ฒ :
- ์ธํฐํ์ด์ค๋ฅผ ์ ์ดํด ๋ค๋ฅธ ๋ฉ์๋๋ค์ ๊ตฌํ์ ์ฌ์ฉ๋๋ ๊ธฐ๋ฐ ๋ฉ์๋๋ค์ ์ ์
- ์ด ๊ธฐ๋ฐ ๋ฉ์๋๋ค์ ๊ณจ๊ฒฉ ๊ตฌํ์์๋ ์ถ์ ๋ฉ์๋๊ฐ ๋๋ค.
- ๊ธฐ๋ฐ ๋ฉ์๋๋ค์ ์ฌ์ฉํด ์ง์ ๊ตฌํํ ์ ์๋ ๋ฉ์๋๋ฅผ ๋ชจ๋ ๋ํดํธ ๋ฉ์๋๋ก ์ ๊ณต
- ๋จ, equals์ hashCode ๊ฐ์ Object์ ๋ฉ์๋๋ ๋ํดํธ ๋ฉ์๋๋ก ์ ๊ณตํ๋ฉด ์๋๋ค.
- ๋ง์ฝ, ์ธํฐํ์ด์ค์ ๋ฉ์๋ ๋ชจ๋๊ฐ ๊ธฐ๋ฐ ๋ฉ์๋์ ๋ํดํธ ๋ฉ์๋๊ฐ ๋๋ค๋ฉด, ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค๋ฅผ ๋ณ๋๋ก ๋ง๋ค ์ด์ ๋ ์๋ค.
- ๊ธฐ๋ฐ ๋ฉ์๋๋ ๋ํดํธ ๋ฉ์๋๋ก ๋ง๋ค์ง ๋ชปํ ๋ฉ์๋๊ฐ ๋จ์์๋ค๋ฉด, ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค์ด ๋จ์ ๋ฉ์๋๋ค์ ์์ฑํด ๋ฃ๋๋ค.
- ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค์๋ ํ์ํ๋ฉด public ์ด ์๋ ํ๋์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด๋ ๋๋ค.
/* Map.Entry ์ธํฐํ์ด์ค getKey, getValue๋ ํ์คํ ๊ธฐ๋ฐ ๋ฉ์๋์ด๋ฉฐ, ์ ํ์ ์ผ๋ก setvalue๋ ํฌํจํ ์ ์๋ค. ์ด ์ธํฐํ์ด์ค๋ equals์ hashCode์ ๋์ ๋ฐฉ์๋ ์ ์ํด๋จ๋ค. Object ๋ฉ์๋๋ค์ ๋ํดํธ ๋ฉ์๋๋ก ์ ๊ณตํด์๋ ์ ๋๋ฏ๋ก, ํด๋น ๋ฉ์๋๋ค์ ๋ชจ๋ ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค์ ๊ตฌํํ๋ค. toString๋ ๊ธฐ๋ฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๊ตฌํํด๋จ๋ค. Map.Entry ์ธํฐํ์ด์ค๋ ๊ทธ ํ์ ์ธํฐํ์ด์ค๋ก๋ ์ด ๊ณจ๊ฒฉ ๊ตฌํ์ ์ ๊ณตํ ์ ์๋ค. ๋ํดํธ ๋ฉ์๋๋ equals, hashCode, toString ๊ฐ์ Object ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ์ ์๊ธฐ ๋ */ public abstract class AbstractMapEntry<K,V> implements Map.Entry<K,V> { // ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ํธ๋ฆฌ๋ ์ด ๋ฉ์๋๋ฅผ ๋ฐ๋์ ์ฌ์ ์ํด์ผ ํ๋ค. @Override public V setValue(V value) { throw new UnsupportedOperationException(); } // Map.Entry.equals์ ์ผ๋ฐ ๊ท์ฝ์ ๊ตฌํํ๋ค. @Override public boolean equals(Object o) { if (o = this) return true; if (!(o instanceof Map.Entry)) return false; Map.Entry<?,?> e = (Map.Entry) o; return Obj ects. equa Is (e. getKey (), getKeyO) && Objects.equals(e.getValue(), getValue()); } // Map.Entry.hashCode์ ์ผ๋ฐ ๊ท์ฝ์ ๊ตฌํํ๋ค. @Override public int hashCodeO { return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue()); } @0verride public String toStringO { return getKey() + "=" + getValueO; } }
- ๊ณจ๊ฒฉ ๊ตฌํ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ํด์ ์ฌ์ฉํ๋ ๊ฑธ ๊ฐ์ ํ๋ฏ๋ก ์ค๊ณ ๋ฐ ๋ฌธ์ํ ์ง์นจ์ ๋ชจ๋ ๋ฐ๋ผ์ผ ํ๋ค.
- ์ธํฐํ์ด์ค์ ์ ์ํ ๋ํดํธ ๋ฉ์๋๋ ๋ณ๋์ ์ถ์ ํด๋์ค๋ , ๊ณจ๊ฒฉ ๊ตฌํ์ ๋ฐ๋์ ๊ทธ ๋์ ๋ฐฉ์์ ์ ์ ์ํด ๋ฌธ์ํ ์ฃผ์์ผ๋ก ๋จ๊ฒจ์ผํ๋ค
- ํต์ฌ ์ ๋ฆฌ :
- ์ผ๋ฐ์ ์ผ๋ก ๋ค์ค ๊ตฌํ์ฉ ํ์ ์ผ๋ก๋ ์ธํฐํ์ด์ค๊ฐ ๊ฐ์ฅ ์ ํฉํ๋ค.
- ๋ณต์กํ ์ธํฐํ์ด์ค๋ผ๋ฉด ๊ตฌํํ๋ ์๊ณ ๋ฅผ ๋์ด์ฃผ๋ ๊ณจ๊ฒฉ ๊ตฌํ์ ํจ๊ป ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๊ผญ ๊ณ ๋ คํด๋ณด์.
- ๊ณจ๊ฒฉ ๊ตฌํ์ โ๊ฐ๋ฅํ ํโ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ก ์ ๊ณตํ์ฌ ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ชจ๋ ๊ณณ์์ ํ์ฉํ๋๋ก ํ๋ ๊ฒ์ด ์ข๋ค.
- โ๊ฐ๋ฅํ ํโ์ด๋ผ๊ณ ํ ์ด์ ๋, ์ธํฐํ์ด์ค์ ๊ฑธ๋ ค ์๋ ๊ตฌํ์์ ์ ์ฝ ๋๋ฌธ์ ๊ณจ๊ฒฉ ๊ตฌํ์ ์ถ์ ํด๋์ค๋ก ์ ๊ณตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ ํํ๊ธฐ ๋๋ฌธ์ด๋ค.
// ์ธํฐํ์ด์ค ์ ์ interface MyInterface { void myMethod(); } // ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค public abstract class MyAbstractClass implements MyInterface { // ๊ธฐ๋ณธ ๋์์ ์ ๊ณตํ๋ ๋ฉ์๋ public void myMethod() { System.out.println("Default implementation of myMethod"); } // ๋ค๋ฅธ ๋ฉ์๋๋ ์ถ๊ฐ์ ์ธ ๋์์ ์ ๊ณตํ ์ ์์ public void anotherMethod() { System.out.println("Some additional method"); } } // ์ค์ ์ฌ์ฉํ ํด๋์ค public class MyClass extends MyAbstractClass { // ํ์์ ๋ฐ๋ผ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์์ ๋๋ ํ์ฅ ๊ฐ๋ฅ public void myMethod() { System.out.println("Custom implementation of myMethod"); } public static void main(String[] args) { MyClass myObject = new MyClass(); myObject.myMethod(); // ์ปค์คํ ๊ตฌํ์ด ํธ์ถ๋จ myObject.anotherMethod(); // ๊ธฐ๋ณธ ๊ตฌํ์์ ์์๋ ๋ฉ์๋ ํธ์ถ } }
- ์ธํฐํ์ด์ค๋ฅผ ์ ์ดํด ๋ค๋ฅธ ๋ฉ์๋๋ค์ ๊ตฌํ์ ์ฌ์ฉ๋๋ ๊ธฐ๋ฐ ๋ฉ์๋๋ค์ ์ ์
- ์ธํฐํ์ด์ค :
2. ์ธํฐํ์ด์ค๋ ๊ตฌํํ๋ ์ชฝ์ ์๊ฐํด ์ค๊ณํ๋ผ
์ค๋ช
- ์๋ฐ 8 ์ : ๊ธฐ์กด ๊ตฌํ์ฒด๋ฅผ ๊นจ์ง ์๊ณ ๋ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ๋ฐฉ๋ฒ์ด X
- ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋ณดํต์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋๋๋ฐ, ์ถ๊ฐ๋ ๋ฉ์๋๊ฐ ์ฐ์ฐํ ๊ธฐ์กด ๊ตฌํ์ฒด์ ์ด๋ฏธ ์กด์ฌํ ๊ฐ๋ฅ์ฑ์ ์์ฃผ ๋ฎ๊ธฐ ๋๋ฌธ
- ์๋ฐ 8 : ๋ํดํธ ๋ฉ์๋๊ฐ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉด, ๊ตฌํํ ํ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ง ์์ ๋ชจ๋ ํด๋์ค์ ๋ํดํธ ๊ตฌํ์ด ์ฐ์ธ๋ค.
- ๊ธฐ์กด ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์๋๋ก ๋ํดํธ ๋ฉ์๋๋ฅผ ์๊ฐํ์ง๋ง, ๋ชจ๋ ๊ธฐ์กด ๊ตฌํ์ฒด๋ค๊ณผ ๋งค๋๋ฝ๊ฒ ์ฐ๋๋๋ฆฌ๋ผ๋ ๋ณด์ฅ์ ์๋ค.
- ์๋ฐ 7 ๊น์ง๋ ๋ชจ๋ ํด๋์ค๊ฐ ํ์ฌ์ ์ธํฐํ์ด์ค์ ์๋ก์ด ๋ฉ์๋๊ฐ ์ถ๊ฐ๋ ์ผ์ ์์์ด ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์์ฑ๋์๊ธฐ ๋๋ฌธ
- ๊ธฐ์กด ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์๋๋ก ๋ํดํธ ๋ฉ์๋๋ฅผ ์๊ฐํ์ง๋ง, ๋ชจ๋ ๊ธฐ์กด ๊ตฌํ์ฒด๋ค๊ณผ ๋งค๋๋ฝ๊ฒ ์ฐ๋๋๋ฆฌ๋ผ๋ ๋ณด์ฅ์ ์๋ค.
- ์๊ฐํ ์ ์๋ ๋ชจ๋ ์ํฉ์์ ๋ถ๋ณ์์ ํด์น์ง ์๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ์์ฑํ๊ธฐ๋ ์ด๋ ต๋ค
- ์๋ฐ 8์ Collection ์ธํฐํ์ด์ค์ ์ถ๊ฐ๋ removeIf ๋ฉ์๋
/* ์ฃผ์ด์ง ๋ถ๋ฆฌ์ธ ํจ์๏ผpredicate๏ผ๏ผ๊ฐ true๋ฅผ ๋ฐํํ๋ ๋ชจ๋ ์์๋ฅผ ์ ๊ฑฐ. ๋ํดํธ ๊ตฌํ์ ๋ฐ๋ณต์๋ฅผ ์ด์ฉํด ์ํํ๋ฉด์ ๊ฐ ์์๋ฅผ ์ธ์๋ก ๋ฃ์ด predicate๋ฅผ ํธ์ถํ๊ณ , predicate๊ฐ true๋ฅผ ๋ฐํํ๋ฉด ๋ฐ๋ณต์์ remove ๋ฉ์๋๋ฅผ ํธ์ถํด ๊ทธ ์์๋ฅผ ์ ๊ฑฐํ๋ค. */ default boolean removelf(Predicate<? super E> filter) { Objects. requireNonNulK filter); boolean result = false; for (Iterator<E> it = iteratorO; it.hasNext(); ) { if (filter.test(it.next())) { it. removeO; result = true; } } return result; }
- ์ด ์ฝ๋๋ ๋ฒ์ฉ์ ์ผ๋ก ๊ตฌ์ฑ๋์์ง๋ง, ํ์กดํ๋ ๋ชจ๋ Collection ๊ตฌํ์ฒด์ ์ ์ด์ฐ๋ฌ์ง๋ ๊ฒ์ ์๋๋ค
- Ex) org.apache.commons.collections4.collection.SynchronizedCollection
- java.util์ Collections.synchronizedCollection ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๊ฐ ๋ฐํํ๋ ํด๋์ค์ ๋น์ทํ๋ค.
- ํ์ง๋ง ์ํ์น ๋ฒ์ ์ removeIf ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ง ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฉ์๋ ํธ์ถ์ ์์์ ๋๊ธฐํํด์ฃผ์ง ๋ชปํ๋ค.
- ์ด๋ฐ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ๊ธฐ์ํด ์๋ฐ ํ๋ซํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ทจํ ์กฐ์น
- ๊ตฌํํ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๊ณ , ๋ค๋ฅธ ๋ฉ์๋์์๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ํ์ํ ์์
์ ์ํํ๋๋ก ํ๋ค
- Collections.synchronizedCollection์ด ๋ฐํํ๋ package-private ํด๋์ค๋ค์ removeIf๋ฅผ ์ฌ์ ์ํ๊ณ , ์ด๋ฅผ ํธ์ถํ๋ ๋ค๋ฅธ ๋ฉ์๋๋ค์ ๋ํดํธ ๊ตฌํ์ ํธ์ถํ๊ธฐ ์ ์ ๋๊ธฐํ๋ฅผ ํ๋๋ก ํ๋ค
- ๊ตฌํํ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๊ณ , ๋ค๋ฅธ ๋ฉ์๋์์๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ํ์ํ ์์
์ ์ํํ๋๋ก ํ๋ค
- ํ์ง๋ง, ์๋ฐ ํ๋ซํผ์ ์ํ์ง ์์ ์ 3์ ๊ธฐ์กด ์ปฌ๋ ์ ๊ตฌํ์ฒด๋ค์ ์ด๋ฐ ์ธ์ด ์ฐจ์์ ์ธํฐํ์ด์ค ๋ณํ์ ๋ฐ๋ง์ถฐ ์์ ๋ ๊ธฐํ๊ฐ ์์๊ณ , ์ผ๋ถ๋ ์ฌ์ ํ ์์ ๋์ง ์์ ์ํ
- ๋ํดํธ ๋ฉ์๋๋ (์ปดํ์ผ์ ์ฑ๊ณตํ๋๋ผ๋) ๊ธฐ์กด ๊ตฌํ์ฒด์ ๋ฐํ์ ์ค๋ฅ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
- ๋ฐ๋ผ์
๊ธฐ์กด ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ก ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ์ผ์ ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ํผํด์ผ ํ๋ค.
- ์ถ๊ฐํ๋ ค๋ ๋ํดํธ ๋ฉ์๋๊ฐ ๊ธฐ์กด ๊ตฌํ์ฒด๋ค๊ณผ ์ถฉ๋ํ์ง ์์์ง ์ฌ์ฌ์๊ณ ํด์ผํ๋ค.
- ๋ฐ๋ผ์
- ๋ฐ๋ฉด,
์๋ก์ด ์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด ํ์ค์ ์ธ ๋ฉ์๋ ๊ตฌํ์ ์ ๊ณตํ๋ ๋ฐ ์์ฃผ ์ ์ฉํ ์๋จ์ด๋ฉฐ, ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๋ ์ฝ๊ฒ ๊ตฌํํด ํ์ฉํ ์ ์๊ฒ๋ ํด์ค๋ค.
- ๋ํดํธ ๋ฉ์๋๋ ์ธํฐํ์ด์ค๋ก๋ถํฐ ๋ฉ์๋๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ๊ธฐ์กด ๋ฉ์๋์ ์๊ทธ๋์ฒ๋ฅผ ์์ ํ๋ ์ฉ๋๊ฐ ์๋์ ๋ช
์ฌํด์ผํ๋ค
- ์ด๋ฐ ํํ๋ก ์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ฐ๋์ ๊ธฐ์กด ํด๋ผ์ด์ธํธ๋ฅผ ๋ง๊ฐ๋จ๋ฆฌ๊ฒ ๋๋ค
๋ํดํธ ๋ฉ์๋๋ผ๋ ๋๊ตฌ๊ฐ ์๊ฒผ๋๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ค๊ณํ ๋๋ ์ฌ์ ํ ์ธ์ฌํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ค.
- ์๋ก์ด ์ธํฐํ์ด์ค๋ผ๋ฉด ๋ฆด๋ฆฌ์ค ์ ์ ๋ฐ๋์ ํ ์คํธ๋ฅผ ๊ฑฐ์ณ์ผํ๋ค.
- ๊ฐ ์ธํฐํ์ด์ค์ ์ธ์คํด์ค๋ฅผ ๋ค์ํ ์์ ์ ํ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ ์ฌ๋ฌ๊ฐ ๋ง๋ค์ด๋ด์ผํ๋ค.
- ์ธํฐํ์ด์ค๋ฅผ ๋ฆด๋ฆฌ์ค ํ ํ๋ผ๋ ๊ฒฐํจ์ ์์ ํ๋๊ฒ ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ ์๊ฒ ์ง๋ง, ์ ๋ ๊ทธ ๊ฐ๋ฅ์ฑ์ ๊ธฐ๋์๋ ์๋๋ค.
- ์๋ฐ 8์ Collection ์ธํฐํ์ด์ค์ ์ถ๊ฐ๋ removeIf ๋ฉ์๋
- ์๋ฐ 8 ์ : ๊ธฐ์กด ๊ตฌํ์ฒด๋ฅผ ๊นจ์ง ์๊ณ ๋ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ๋ฐฉ๋ฒ์ด X
3. ์ธํฐํ์ด์ค๋ ํ์ ์ ์ ์ํ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๋ผ
์ค๋ช
- ์ธํฐํ์ด์ค : ์์ ์ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋ ํ์
์ญํ
- ํด๋์ค๊ฐ ์ด๋ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค == ์์ ์ ์ธ์คํด์ค๋ก ๋ฌด์์ ํ ์ ์๋์ง๋ฅผ ํด๋ผ์ด์ธํธ์ ์๊ธฐํด์ฃผ๋๊ฒ (
์ค์ง ์ด ์ฉ๋๋ก๋ง ์ฌ์ฉํด์ผ ํ๋ค
)
- ํด๋์ค๊ฐ ์ด๋ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค == ์์ ์ ์ธ์คํด์ค๋ก ๋ฌด์์ ํ ์ ์๋์ง๋ฅผ ํด๋ผ์ด์ธํธ์ ์๊ธฐํด์ฃผ๋๊ฒ (
- ์ง์นจ์ ๋ง์ง์๋ Ex) ์์ ์ธํฐํ์ด์ค
- ๋ฉ์๋ ์์ด, static final ํ๋๋ก๋ง ๊ฐ๋ ์ฐฌ ์ธํฐํ์ด์ค
- ์ด ์์๋ค์ ์ฌ์ฉํ๋ ค๋ ํด๋์ค์์๋ ์ ๊ทํ๋ ์ด๋ฆ(qualified name)์ ์ฐ๋ ๊ฑธ ํผํ๊ณ ์ ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณคํ๋ค.
// ์์ ์ธํฐํ์ด์ค ์ํฐํจํด - ์ฌ์ฉ๊ธ์ง! public interface PhysicalConstants { // ์๋ณด๊ฐ๋๋ก ์ (1/๋ชฐ) static final double AVOGADROS.NUMBER = 6.022_140_857e23; // ๋ณผ์ธ ๋ง ์์ (J/K) static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; // ์ ์ ์ง๋ (kg) static final double ELECTRON_MASS = 9.109_383_56e-31; }
- ํด๋์ค ๋ด๋ถ์์ ์ฌ์ฉํ๋ ์์๋ ์ธ๋ถ ์ธํฐํ์ด์ค๊ฐ ์๋๋ผ ๋ด๋ถ ๊ตฌํ์ ํด๋นํ๋ค.
- ๋ฐ๋ผ์ ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์ด ๋ด๋ถ ๊ตฌํ์ ํด๋์ค์ API๋ก ๋ ธ์ถํ๋ ํ์์ด๋ค.
- ํด๋์ค๊ฐ ์ด๋ค ์์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ๋ ์๋ฌด๋ฐ ์๋ฏธ๊ฐ ์์ผ๋ฉฐ ์คํ๋ ค ์ฌ์ฉ์์๊ฒ ํผ๋์ ์ค๋ค
- ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ๋ด๋ถ ๊ตฌํ์ ํด๋น๋๋ ์ด ์์๋ค์ ์ข ์๋๊ฒ ํด์ ๋ค์ ๋ฆด๋ฆฌ์ค์ ์ด ์์๋ค์ ์ฌ์ฉํ์ง ์๊ฒ๋๋๋ผ๋, ๋ฐ์ด๋๋ฆฌ ํธํ์ฑ์ ์ํด ์ฌ์ ํ ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์์ด์ผํ๋ค.
- final์ด ์๋ ํด๋์ค๊ฐ ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค๋ฉด ๋ชจ๋ ํ์ ํด๋์ค์ ์ด๋ฆ ๊ณต๊ฐ์ด ๊ทธ ์ธํฐํ์ด์ค๊ฐ ์ ์ํ ์์๋ค๋ก ์ค์ผ๋์ด ๋ฒ๋ฆฐ๋ค.
- ์์๋ฅผ ๊ณต๊ฐํ๋ ํฉ๋นํ ๋ฐฉ๋ฒ๋ค
- ํน์ ํด๋์ค๋ ์ธํฐํ์ด์ค์ ๊ฐํ๊ฒ ์ฐ๊ด๋ ์์๋ฅผ ๊ทธ ํด๋์ค๋ ์ธํฐํ์ด์ค ์์ฒด์ ์ถ๊ฐ
- Ex) ๋ชจ๋ ์ซ์ ๊ธฐ๋ณธ ํ์ ์ ๋ฐ์ฑ ํด๋์ค (Integer๊ณผ Double์ ์ ์ธ๋ MIN_VALUE์ MAX_VALUE)
- ์ด๊ฑฐ ํ์
์ผ๋ก ๋ํ๋ด๊ธฐ ์ ํฉํ ์์๋ผ๋ฉด ์ด๊ฑฐ ํ์
์ผ๋ก ๋ง๋ค์ด ๊ณต๊ฐ
public enum Day{ MON, TUE, WED, THU, FRI, SAT, SUN};
- ๋๋ค ์๋๋ผ๋ฉด, ์ธ์คํด์คํ ํ ์ ์๋ ์ ํธ๋ฆฌํฐ ํด๋์ค์ ๋ด์ ๊ณต๊ฐ
// ์์ ์ ํธ๋ฆฌํฐ ํด๋์ค /* ์ซ์ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ ๋ฐ์ค(_)์ ์ฃผ๋ชฉํด๋ณด์. ์๋ฐ 7๋ถํฐ ํ์ฉ๋๋ ์ด ๋ฐ์ค์ ์ซ์ ๋ฆฌํฐ ๋ด์ ๊ฐ์๋ ์๋ฌด๋ฐ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์, ์ฝ๊ธฐ๋ ํจ์ฌ ํธํ๊ฒ ํด์ค๋ค. ๊ณ ์ ์์์ ์ ๋ ๋ถ๋์์์ ์๋ 5์๋ฆฌ ์ด์์ด๋ผ๋ฉด ๋ฐ์ค์ ์ฌ์ฉํ๋ ๊ฑธ ๊ณ ๋ คํด๋ณด์. ์ญ์ง์ ๋ฆฌํฐ๋ด๋ (์ ์๋ ๋ถ๋์์์ ์๋ ) ๋ฐ์ค์ ์ฌ์ฉํด ์ธ ์๋ฆฟ์ฉ ๋ฌถ์ด์ฃผ๋ ๊ฒ์ด ์ข๋ค. */ package effectivejava.chapter4.item22.constantutilityclass; public class PhysicalConstants { private PhysicalConstants() { } // ์ธ์คํด์คํ ๋ฐฉ์ง // ์๋ณด๊ฐ๋๋ก ์ (1/๋ชฐ) public static final double AVOGADROS_NUMBER = 6.022_140_857e23; // ๋ณผ์ธ ๋ง ์์ (J/K) public static final double BOLTZMANN_CONST = 1.380_648_52e-23; // ์ ์ ์ง๋ (kg) public static final double ELECTRON_MASS = 9.109_383_56e-31; }
- ์ ํธ๋ฆฌํฐ ํด๋์ค์ ์ ์๋ ์์๋ฅผ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉํ๋ ค๋ฉด ํด๋์ค ์ด๋ฆ๊น์ง ํจ๊ป ๋ช ์ํด์ผ ํ๋ค. (PhysicalConstants.AVOGADROS_NUMBER)
- ์ ํธ๋ฆฌํฐ ํด๋์ค์ ์์๋ฅผ ๋น๋ฒํ ์ฌ์ฉํ๋ค๋ฉด ์ ์ ์ํฌํธ(static import)ํ์ฌ ํด๋์ค ์ด๋ฆ์ ์๋ตํ ์ ์๋ค.
import static effectivejava.chapter4.item22.constantutilityclass.Physical Constants. *; public class Test { double atoms(double mols) { return AVOGADROS_NUMBER * mols; } // PhysicalConstants๋ฅผ ๋น๋ฒํ ์ฌ์ฉํ๋ค๋ฉด ์ ์ ์ํฌํธ๊ฐ ๊ฐ์ด์น๋ฅผ ํ๋ค. }
- ํน์ ํด๋์ค๋ ์ธํฐํ์ด์ค์ ๊ฐํ๊ฒ ์ฐ๊ด๋ ์์๋ฅผ ๊ทธ ํด๋์ค๋ ์ธํฐํ์ด์ค ์์ฒด์ ์ถ๊ฐ
- ์ธํฐํ์ด์ค : ์์ ์ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋ ํ์
์ญํ
4. ์ฐธ์กฐ
- ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค : https://xonmin.tistory.com/18
- ์ดํํฐ๋ธ ์๋ฐ : ์์ดํ 20,21,22
'Dev > ESTsoft ์ค๋ฅด๋ฏธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ค๋ ๋(Thread) (0) | 2024.02.23 |
---|---|
์คํธ๋ฆผ (0) | 2024.02.23 |
๋๋ค์ (0) | 2024.02.23 |
์ปฌ๋ ์ (0) | 2024.02.23 |
๋ฆฌ์คํธ (0) | 2024.02.23 |