item 24 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
์์ดํ 24 ๋ฉค๋ฒ ํด๋์ค๋ ๋๋๋ก static์ผ๋ก ๋ง๋ค๋ผ
- ์ค์ฒฉ ํด๋์ค๋ ๋ค๋ฅธ ํด๋์ค ์์ ์ ์๋ ํด๋์ค
- ์ค์ฒฉ ํด๋์ค๋ ์์ ์ ๊ฐ์ผ ๋ฐ๊นฅ ํด๋์ค์์๋ง ์ฐ์ฌ์ผ ํ๋ฉฐ, ๊ทธ ์ธ์ ์ฐ์์๊ฐ ์๋ค๋ฉด ํฑ ๋ ๋ฒจ ํฌ๋์ค๋ก ๋ง๋ค์ด์ผ ํ๋ค.
- ์ค์ฒฉ ํด๋์ค์ ์ข ๋ฅ
- ์ ์ ๋ฉค๋ฒ ํด๋์ค
- (๋น์ ์ ) ๋ฉค๋ฒ ํด๋์ค
- ์ต๋ช ํด๋์ค
- ์ง์ญ ํด๋์ค
์ด ์ค ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ฅผ ์ ์ธํ ๋๋จธ์ง๋ ๋ด๋ถ ํด๋์ค์ ํด๋นํ๋ค.
๋ด๋ถํด๋์ค (Inner Class)
- ๋ด๋ถ ํด๋์ค๋ก์ ์ผ๋ฐํด๋์ค ๋ด๋ถ์ ์์ฑ๋๋ค. Non-Static Nested Class ๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
- ๋ฐ์ ์๋ ํด๋์ค๋ ๋ด๋ถํด๋์ค๋ฅผ ๋ฉค๋ฒ๋ณ์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค. ์ฌ์ฉํ๋ ค๋ฉด new๋ก ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ผํ๋ค.
- ๋ด๋ถ ํด๋์ค๋ ์์ ์ ๋ฐ์ ์๋ ํด๋์ค์ ์์์ ์ง์ ์ฌ์ฉํ ์ ์๋ค.
๋ชจ์์
class Outer {
๋ณ์;
๋ฉ์๋;
public class Inner {
}
}
๊ฐ์ฒด ์์ฑ
Outer ๊ฐ์ฒด1 = new Outer();
Outer.Inner ๊ฐ์ฒด2 = ๊ฐ์ฒด1.new Inner();
์ ์ ๋ฉค๋ฒ ํด๋์ค
- ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ ๋ค๋ฅธ ํด๋์ค ์์ ์ ์ธ๋๊ณ ๋ฐ๊นฅ ํด๋์ค์ private ๋ฉค๋ฒ์๋ ์ ๊ทผํ ์ ์๋ค๋ ์ ๋ง ์ ์ธํ๊ณ ๋ ์ผ๋ฐ ํด๋์ค์ ๋๊ฐ๋ค.
- ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ ํํ ๋ฐ๊นฅ ํด๋์ค์
ํจ๊ป
์ฐ์ผ ๋๋ง ์ ์ฉํ public ๋์ฐ๋ฏธ ํด๋์ค๋ก ์ฐ์ธ๋ค.
์ ์ ๋ฉค๋ฒ ํด๋์ค๋ ๋ฐ๊นฅ ํด๋์ค(private ๊น์ง๋)์ ๋ชจ๋ ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์๋ค.
๋ฐ๊นฅ ํด๋์ค ๊ฐ์ฒด์ ์ ๊ทผํ ํ์๊ฐ ์๋ ๋ฉค๋ฒ ํด๋์ค๋ฅผ ์ ์ํ ๋๋ ํญ์ ์ ์ธ๋ฌธ ์์ static์ ๋ถ์ฌ์ ๋น-์ ์ ๋ฉค๋ฒ ํด๋์ค ๋์ ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ก ๋ง๋ค์
๋ด๋ถ ํด๋์ค๋ฅผ static์ผ๋ก ์ ์ธํ๋ ๊ฒ์ '์ ์ ๋ฉค๋ฒ ํด๋์ค'๋ก ๋ฐ๊นฅ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ธ๋๋ง ๋ด๋ถ ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
- ๋ฐ๊นฅ ํด๋์ค๋ฅผ ํธ์ถํ ๋ค ๋ด๋ถ ํด๋์ค๋ฅผ ํธ์ถํ๋ ๊ตฌ์กฐ์์ ๊ตณ์ด ๋งค๋ฒ ๋ด๋ถ ํด๋์ค๋ฅผ ๋ง๋ค ํ์๊ฐ ์๋์ง static์ผ๋ก ๋ง๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ์์ผ ๊ณต๊ฐ๊ณผ ์๊ฐ์ ์ ์ฝํ์ ๋ผ๋ ์๋ฏธ
๋น์ ์ ๋ฉค๋ฒ ํด๋์ค
- ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค์ ์ธ์คํด์ค๋ ๋ฐ๊นฅ ํด๋์ค์ ์ธ์คํด์ค์
์๋ฌต์
์ผ๋ก ์ฐ๊ฒฐ๋๋ค. - ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋์์ ์ ๊ทํ๋
this
๋ฅผ ์ฌ์ฉํด ๋ฐ๊นฅ ์ธ์คํด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋๋ฐ๊นฅ ์ธ์คํด์ค์ ์ฐธ์กฐ
๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. - ์ ๊ทํ๋ this๋
ํด๋์ค๋ช .this
ํํ๋ก ๋ฐ๊นฅ ํด๋์ค์ ์ด๋ฆ์ ๋ช ์ํ๋ ์ฉ๋ฒ์ ๋งํ๋ค. - ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค์ ์ธ์คํด์ค์ ๋ฐ๊นฅ ์ธ์คํด์ค ์ฌ์ด์ ๊ด๊ณ๋ ๋ฉค๋ฒ ํด๋์ค๊ฐ
์ธ์คํด์คํ
๋ ๋ ํ๋ฆฝ ๋๋ฉฐ, ๋ ์ด์ ๋ณ๊ฒฝํ ์ ์๋ค. - ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค๋
์ด๋ํฐ
๋ฅผ ์ ์ํ ๋ ์์ฃผ ์ฐ์ธ๋ค. ์ฆ, ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ธ ๋ง์น ๋ค๋ฅธ ํด๋์ค์ ์ธ์คํด์ค์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ ๋ทฐ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. - ๋น์ทํ๊ฒ,
Set
๊ณผList
๊ฐ์ ๋ค๋ฅธ ์ปฌ๋ ์ ์ธํฐํ์ด์ค ๊ตฌํ ๋ค๋ ์์ ์ ๋ฐ๋ณต์๋ฅผ ๊ตฌํํ ๋ ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
public class MySet<E> extends AbstractSet<E> {
... // ์๋ต
@Override
public Iterator<E> iterator() {
return new MyIterator();
}
private class MyIterator implements Iterator<E> {
...
}
}
static
์ ๋ถ์ฌ์ ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ก ๋ง๋ค์.
๋ฉค๋ฒ ํด๋์ค์์ ๋ฐ๊นฅ ์ธ์คํด์ค์ ์ ๊ทผํ ์ผ์ด ์๋ค๋ฉด ๋ฌด์กฐ๊ฑด static
์ ์๋ตํ๋ฉด ๋ฐ๊นฅ ์ธ์คํด์ค๋ก์ ์จ์ ์ธ๋ถ ์ฐธ์กฐ
๋ฅผ ๊ฐ๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ์
์ด ๋ฐ๊นฅ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์๊ฑฐํ์ง ๋ชปํ๋ ๋ฉ๋ชจ๋ฆฌ ๋์
๊ฐ ์๊ธธ ์ ์๋ค๋ ์ ์ด๋ค.
์ต๋ช ํด๋์ค
์ต๋ช ํด๋์ค
๋ ๋ฐ๊นฅ ํด๋์ค์ ๋ฉค๋ฒ๋ ์๋๋ค. ๋ฉค๋ฒ์ ๋ฌ๋ฆฌ, ์ฐ์ด๋ ์์ ์์ ์ธ
๊ณผ ๋์์์ธ์คํด์ค
๊ฐ ๋ง๋ค์ด์ง๋ค.- ์ค์ง
๋น์ ์ ์ธ ๋ฌธ๋งฅ
์์ ์ฌ์ฉ๋ ๋๋ง ๋ฐ๊นฅ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.์ ์ ๋ฌธ๋งฅ
์์๋ผ๋ ์์ ๋ณ์ ์ด์ธ์ ์ ์ ๋ฉค๋ฒ๋ ๊ฐ์ง ์ ์๋ค. - ์ฆ,
์์ ํํ
์ ์ํด ์ด๊ธฐํ ๋final
๊ธฐ๋ณธ ํ์ ๊ณผ ๋ฌธ์์ด ํ๋๋ง ๊ฐ์ง ์ ์๋ค.
๋ชจ์์
Class Inner {
๋ณ์;
๋ฉ์๋;
}
class Outer {
๋ณ์;
๋ฉ์๋1;
๋ฉ์๋2() {
์ง์ญ๋ณ์;
new Inner() {
override๋ ๋ด์ฉ๋ค..
}
}
}
์ง์ญ ํด๋์ค
- ๋ค๊ฐ์ง ์ค์ฒฉ ํด๋์ค ์ค ๊ฐ์ฅ ๋๋ฌผ๊ฒ ์ฌ์ฉ๋๋ค.
- ์ง์ญ ํด๋์ค๋ ์ง์ญ ๋ณ์๋ฅผ ์ ์ธํ ์ ์๋ ๊ณณ์ด๋ฉด ์ค์ง์ ์ผ๋ก ์ด๋์๋ ์ ์ธ ๊ฐ๋ฅ
- ์ ํจ ๋ฒ์๋ ์ง์ญ ๋ณ์์ ๊ฐ๋ค.
- ์ธ ์ค์ฒฉ ํด๋์ค์์ ๊ณตํต์ ๋ ํ๋์ฉ ๊ฐ์ง๊ณ ์๋ค.
- ๋ฉค๋ฒ ํด๋์ค์ฒ๋ผ ์ด๋ฆ์ด ์๊ณ ๋ฐ๋ณตํด์ ์ฌ์ฉํ ์ ์๋ค.
๋ฉ์๋ ๋ด๋ถ์ ํด๋์ค๋ฅผ ์ ์ํ๋ ๊ฒฝ์ฐ์ด๋ค. ๋ง์น ๋ฉ์๋ ๋ด์ ์ง์ญ๋ณ์์ฒ๋ผ ์ฐ์ธ๋ค.
๋ฉ์๋ ๋ด๋ถ์์ new ํ ๋ค ์ฌ์ฉํด์ผ ํ๋ค. ๋ฉ์๋ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค(์ง์ญ๋ณ์ ๋ฃฐ)
๋ชจ์์
class Outer {
๋ณ์;
๋ฉ์๋1;
๋ฉ์๋2() {
์ง์ญ๋ณ์;
class Inner {
}
}
}
[ํต์ฌ ์ ๋ฆฌ]
-
๋ฉ์๋ ๋ฐ์์๋ ์ฌ์ฉํด์ผ ํ๊ฑฐ๋ ๋ฉ์๋ ์์ ์ ์ํ๊ธฐ์ ๋๋ฌด ๊ธธ๋ค๋ฉด ๋ฉค๋ฒ ํด๋์ค๋ก ๋ง๋ ๋ค.
-
๋ฉค๋ฒ ํด๋์ค์ ์ธ์คํด์ค ๊ฐ๊ฐ์ด ๋ฐ๊นฅ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ค๋ฉด ๋น์ ์ ์ผ๋ก ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ ์ผ๋ก ๋ง๋ค์.
-
์ค์ฒฉ ํด๋์ค๊ฐ ํ ๋ฉ์๋ ์์์๋ง ์ฐ์ด๋ฉด์ ๊ทธ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์ง์ ์ด ๋จ ํ ๊ณณ์ด๊ณ ํด๋น ํ์ ์ผ๋ก ์ฐ๊ธฐ์ ์ ํฉํ ํด๋์ค๋ ์ธ์คํด์ค๊ฐ ์ด๋ฏธ ์๋ค๋ฉด ์ต๋ช ํด๋์ค๋ก ๋ง๋ค๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์ง์ญ ํด๋์ค๋ก ๋ง๋ค์.
- Reference ๋นจ๊ฐ์ ์ฝ๋ฉ