15 ~ 25
ํด๋์ค์ ์ธํฐํ์ด์ค๋ ์ถ์ํ์ ๊ธฐ๋ณธ ๋จ์๋ก, ์๋ฐ ์ธ์ด์๋ ํด๋์ค์ ์ธํฐํ์ด์ค ์ค๊ณ์ ์ฌ์ฉํ๋ ๊ฐ๋ ฅํ ์์๊ฐ ๋ง๋ค.
ยท ์ด๋ฐ ์์๋ฅผ ์ ์ ํ ํ์ฉํ์ฌ ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ์ฐ๊ธฐ ํธํ๊ณ , ๊ฒฌ๊ณ ํ๋ฉฐ, ์ ์ฐํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
์์ดํ
15. ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผ ๊ถํ์ ์ต์ํํ๋ผ
ยท ์ ์ค๊ณ๋ ์ปดํฌ๋ํธ๋ ํด๋์ค ๋ด๋ถ ๋ฐ์ดํฐ ๊ตฌํ ์ ๋ณด๋ฅผ ์ธ๋ถ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ์จ๊ธด๋ค.
- ๊ตฌํ๊ณผ API๋ฅผ ๊น๋ํ๊ฒ ๋ถ๋ฆฌํ๊ณ , ์ค์ง API๋ฅผ ํตํด์๋ง ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํตํ๋ฉฐ ์๋ก์ ๋ด๋ถ ๋์ ๋ฐฉ์์๋ ์ ํ ๊ฐ์์น ์๋๋ค.
- ์ ๋ณด ์๋ ๋๋ ์บก์ํ๋ผ๊ณ ํ๋ ์ด ๊ฐ๋ ์ ์ํํธ์จ์ด ์ค๊ณ์ ๊ทผ๊ฐ์ด ๋๋ ์๋ฆฌ๋ค.
ยท ์ ๋ณด ์๋์ ์ฅ์ :
1. ์์คํ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ธ๋ค.
- ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ณ๋ ฌ๋ก ๊ฐ๋ฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
2. ์์คํ ๊ด๋ฆฌ ๋น์ฉ์ ๋ฎ์ถ๋ค.
- ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋นจ๋ฆฌ ํ์ ํ๊ณ ๋๋ฒ๊น ํ ์ ์๊ณ , ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ๊ต์ฒดํ๋ ๋ถ๋ด๋ ์ ๊ธฐ ๋๋ฌธ์ด๋ค.
3. ์ฑ๋ฅ ์ต์ ํ์ ๋์์ ์ค๋ค.
- ์์ฑ๋ ์์คํ ์ ํ๋กํ์ผ๋งํด ์ต์ ํํ ์ปดํฌ๋ํธ๋ฅผ ์ ํ ๋ค์(์์ดํ 67) ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์ต์ ํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
4. ์ํํธ์จ์ด ์ฌ์ฌ์ฉ์ฑ์ ๋์ธ๋ค.
- ์ธ๋ถ์ ๊ฑฐ์ ์์กดํ์ง ์๊ณ ๋ ์์ ์ผ๋ก ๋์ํ ์ ์๋ ์ปดํฌ๋ํธ๋ผ๋ฉด ๊ทธ ์ปดํฌ๋ํธ์ ํจ๊ป ๊ฐ๋ฐ๋์ง ์์ ๋ฏ์ ํ๊ฒฝ์์๋ ์ ์ฉํ๊ฒ ์ฐ์ผ ๊ฐ๋ฅ์ฑ์ด ํฌ๊ธฐ ๋๋ฌธ์ด๋ค.
5. ํฐ ์์คํ ์ ์ ์ํ๋ ๋์ด๋๋ฅผ ๋ฎ์ถ๋ค.
- ์์คํ ์ ์ฒด๊ฐ ์์ง ์์ฑ๋์ง ์์ ์ํ์์๋ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ๋์์ ๊ฒ์ฆํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฌํ ์ฅ์ ๋ค์ ๋๋ถ๋ถ ์์คํ ์ ๊ตฌ์ฑํ๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ก ๋ ๋ฆฝ์์ผ ๊ฐ๋ฐ, ํ ์คํธ, ์ต์ ํ, ์ ์ฉ, ๋ถ์, ์์ ์ ๊ฐ๋ณ์ ์ผ๋ก ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ๊ณผ ์ฐ๊ด๋์ด ์๋ค.
ยท ์๋ฐ๋ ์ ๋ณด ์๋์ ์ํ ๋ค์ํ ์ฅ์น๋ฅผ ์ ๊ณตํ๋ค. ๊ทธ์ค ์ ๊ทผ ์ ์ด ๋ฉ์ปค๋์ฆ์ ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉค๋ฒ์ ์ ๊ทผ ํ์ฉ ๋ฒ์๋ฅผ ๋ช ์ํ๋ค.
ยท ๊ฐ ์์์ ์ ๊ทผ ํ์ฉ ๋ฒ์๋ ์ ๊ทผ ์ ํ์(private, protected, public)๋ก ์ ํด์ง๋ค. ์ ๊ทผ ์ ํ์๋ฅผ ์ ๋๋ก ํ์ฉํ๋ ๊ฒ์ด ์ ๋ณด ์๋์ ํต์ฌ์ด๋ค. ๋ชจ๋ ํด๋์ค์ ๋ฉค๋ฒ๋ ์ํํธ์จ์ด๊ฐ ์ฌ๋ฐ๋ก ๋์ํ๋ ํ ๊ฐ์ฅ ๋ฎ์ ์ ๊ทผ ์์ค์ ๋ถ์ฌํด์ผํ๋ค.
ํฑ๋ ๋ฒจ ํด๋์ค์ ์ธํฐํ์ด์ค์ ์ ๊ทผ ์์ค
ยท ํฑ๋ ๋ฒจ(๊ฐ์ฅ ๋ฐ๊นฅ) ํด๋์ค์ ์ธํฐํ์ด์ค์ ๋ถ์ฌํ ์ ์๋ ์ ๊ทผ ์์ค: package-private๊ณผ public
ยท ํฑ๋ ๋ฒจ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ผํ ๋ ์ธ๋ถ์์ ์ธ ์ด์ ๊ฐ ์๋ค๋ฉด package-private๋ก ์ ์ธํ์. ๊ทธ๋ฌ๋ฉด ํด๋น ํจํค์ง ์์์๋ง ์ด์ฉํ ์ ์์ผ๋ฏ๋ก, API๊ฐ ์๋ ๋ด๋ถ ๊ตฌํ์ด ๋์ด ์ธ์ ๋ ์์ ํ ์ ์๋ค.
- ์ฆ, ํด๋ผ์ด์ธํธ์ ์๋ฌด๋ฐ ํผํด ์์ด ๋ค์ ๋ฆด๋ฆฌ์ค์์ ์์ , ๊ต์ฒด, ์ ๊ฑฐํ ์ ์๋ค.
- ๋ฐ๋ฉด, public์ผ๋ก ์ ์ธํ๋ฉด ๊ณต๊ฐ API๊ฐ ๋๋ฏ๋ก ํ์ ํธํ์ ์ํด ์์ํ ๊ด๋ฆฌํด์ผํ๋ค.
-
ยท ํ ํด๋์ค์์๋ง ์ฌ์ฉํ๋ package-private ํฑ๋ ๋ฒจ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค ์์ private static์ผ๋ก ์ค์ฒฉ์ํค์(์์ดํ 24).
- ํฑ ๋ ๋ฒจ๋ก ๋๋ฉด ๊ฐ์ ํจํค์ง์ ๋ชจ๋ ํด๋์ค๊ฐ ์ ๊ทผํ ์ ์์ง๋ง, private static์ผ๋ก ์ค์ฒฉ์ํค๋ฉด ๋ฐ๊นฅ ํด๋์ค ํ๋์์๋ง ์ ๊ทผํ ์ ์๋ค.
-
๋ฉค๋ฒ์ ์ ๊ทผ ์์ค
ยท ๋ฉค๋ฒ(ํ๋, ๋ฉ์๋, ์ ์ฒญ ํด๋์ค, ์ค์ฒฉ ์ธํฐํ์ด์ค)์ ๋ถ์ฌํ ์ ์๋ ์ ๊ทผ ์์ค:
1. private: ๋ฉค๋ฒ๋ฅผ ์ ์ธํ ํฑ๋ ๋ฒจ ํด๋์ค์์๋ง ์ ๊ทผํ ์ ์๋ค.
2. package-private: ๋ฉค๋ฒ๊ฐ ์์๋ ํจํค์ง ์์ ๋ชจ๋ ํด๋์ค์์ ์ ๊ทผํ ์ ์๋ค.
ํด๋์ค ๋ฉค๋ฒ์ ์ ๊ทผ ์ ํ์๋ฅผ ๋ช ์ํ์ง ์์ผ๋ฉด ์๋์ผ๋ก ์ ์ฉ๋๋ ์ ๊ทผ ์์ค์ด๋ค. ๋จ, ์ธํฐํ์ด์ค์ ๋ฉค๋ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก public์ด๋ค.
3. protected: package-private์ ์ ๊ทผ ๋ฒ์๋ฅผ ํฌํจํ๋ฉฐ, ์ถ๊ฐ์ ์ผ๋ก ํด๋น ํด๋์ค์ ํ์ ํด๋์ค์์๋ ์ ๊ทผํ ์ ์๋ค.
4. public: ๋ชจ๋ ๊ณณ์์ ์ ๊ทผํ ์ ์๋ค.
ยท ํด๋์ค์ ๊ณต๊ฐ API๋ฅผ ์ธ์ฌํ ์ค๊ณํ ํ, ๊ทธ ์ธ์ ๋ชจ๋ ๋ฉค๋ฒ๋ private๋ก ๋ง๋ค์. ๊ทธ๋ฐ ๋ค์ ์ค์ง ๊ฐ์ ํจํค์ง์ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ ๊ทผํด์ผ ํ๋ ๋ฉค๋ฒ์ ํํ์ฌ package-private๋ก ํ์ด์ฃผ์.
- ๊ถํ์ ํ์ด์ฃผ๋ ์ผ์ด ์์ฃผ ๋ฐ์ํ๋ฉด, ์์คํ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ถํดํด์ผ ํ๋๊ฒ ์๋์ง ๊ณ ๋ฏผํ์.
- private, package-private ๋ฉค๋ฒ๋ ๋ชจ๋ ํด๋น ํด๋์ค์ ๊ตฌํ์ ํด๋นํ๋ฏ๋ก, ๋ณดํต ๊ณต๊ฐ API์ ์ํฅ์ ์ฃผ์ง ์๋๋ค. ๋จ, Serializable์ ๊ตฌํํ ํด๋์ค์์๋ ํ๋๋ค์ด ์๋์น ์๊ฒ ๊ณต๊ฐ API๊ฐ ๋ ์๋ ์๋ค(์์ดํ 86, 87).
ยท public ํด๋์ค์ protected ๋ฉค๋ฒ๋ ๊ณต๊ฐ API์ด๋ฏ๋ก ์์ํ ์ง์๋ผ์ผ ํ๋ค. ๋ํ ๋ด๋ถ ๋์ ๋ฐฉ์์ API ๋ฌธ์์ ์ ์ด ์ฌ์ฉ์์๊ฒ ๊ณต๊ฐํด์ผ ํ ์๋ ์๋ค(์์ดํ 19). ๋ฐ๋ผ์ protected ๋ฉค๋ฒ์ ์๋ ์ ์์๋ก ์ข๋ค.
ยท ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ๋ ๊ทธ ์ ๊ทผ ์์ค์ ์์ ํด๋์ค์์๋ณด๋ค ์ข๊ฒ ์ค์ ํ ์ ์๋ค.
- ์ด๋ ๋ฉค๋ฒ ์ ๊ทธ์ฑ์ ์ขํ์ง ๋ชปํ๊ฒ ๋ฐฉํดํ๋ ์ ์ฝ์ด๋ค. ์ด ์ ์ฝ์ ์์ ํด๋์ค์ ์ธ์คํด์ค๋ ํ์ ํด๋์ค์ ์ธ์คํด์ค๋ก ๋์ฒดํด ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค๋ ๊ท์น(๋ฆฌ์ค์ฝํ ์นํ ์์น, ์์ดํ 10)์ ์งํค๊ธฐ ์ํด ํ์ํ๋ค. ์ด ๊ท์น์ ์ด๊ธฐ๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
ex) ํด๋์ค๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋, ์ธํฐํ์ด์ค๊ฐ ์ ์ํ ๋ชจ๋ ๋ฉ์๋๋ฅผ public์ผ๋ก ์ ์ธํด์ผ ํ๋ค.
ยท ์ฝ๋๋ฅผ ํ ์คํธํ๋ ค๋ ๋ชฉ์ ์ผ๋ก ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉค๋ฒ์ ์ ๊ทผ ๋ฒ์๋ฅผ ๋ํ๋ ๊ฒฝ์ฐ ์ ๋นํ ์์ค๊น์ง๋ง ํ์ฉ๋๋ค.
- public ํด๋์ค์ private ๋ฉค๋ฒ๋ฅผ package-private๊น์ง ํ์ด์ฃผ๋ ๊ฒ์ ํ์ฉํ ์ ์์ง๋ง, ๊ทธ ์ด์์ ์๋๋ค.
- ํ ์คํธ ์ฝ๋๋ฅผ ํ ์คํธ ๋์๊ณผ ๊ฐ์ ํจํค์ง์ ๋๋ฉด package-private ์์์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ยท public ํด๋์ค์ ์ธ์คํด์ค ํ๋๋ ๋๋๋ก public์ด ์๋์ด์ผ ํ๋ค(์์ดํ 16). ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ถ์์ฉ์ด ์๋ค.
1. ํ๋๊ฐ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ final์ด ์๋ ์ธ์คํด์ค ํ๋๋ฅผ public์ผ๋ก ์ ์ธํ๋ฉด, ๊ทธ ํ๋์ ๋ด์ ์ ์๋ ๊ฐ์ ์ ํํ ํ์ ์ฝ๋๋ค. ์ฆ, ํ๋์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ ๋ถ๋ณ์์ ๋ณด์ฅํ ์ ์๊ฒ ๋๋ค.
2. ์ผ๋ฐ์ ์ผ๋ก ์ค๋ ๋ ์์ ํ์ง ์๋ค. ํ๋๊ฐ ์์ ๋ ๋ (๋ฝ ํ๋ ๊ฐ์) ๋ค๋ฅธ ์์ ์ ํ ์ ์๊ฒ ๋๋ค.
3. final์ด๋ฉด์ ๋ถ๋ถ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋๋ผ๋ ๋ฌธ์ ๊ฐ ๋จ๋๋ค. ๋ด๋ถ ๊ตฌํ์ ๋ฐ๊พธ๊ณ ์ถ์ด๋ ํด๋น ํ๋๋ฅผ ์์ ๋ ๋ฐฉ์์ผ๋ก ๋ฆฌํฉํฐ๋งํ ์ ์๋ค.
ยท ์์ธ์ ์ผ๋ก, ํด๋น ํด๋์ค๊ฐ ํํํ๋ ์ถ์ ๊ฐ๋ ์ ์์ฑํ๋ ๋ฐ ๊ผญ ํ์ํ ๊ตฌ์ฑ์์๋ก์จ์ ์์๋ผ๋ฉด, public static final ํ๋๋ก ๊ณต๊ฐํด๋ ์ข๋ค.
- ๊ด๋ก์ ์ด๋ฐ ์์ ์ด๋ฆ์ ๋๋ฌธ์ ์ํ๋ฒณ์ผ๋ก ์ฐ๋ฉฐ, ๊ฐ ๋จ์ด ์ฌ์ด์ ๋ฐ์ค(_)์ ๋ฃ๋๋ค(์์ดํ 68).
- ์ด๋ฐ ํ๋๋ ๋ฐ๋์ ๊ธฐ๋ณธ ํ์ ๊ฐ์ด๋ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ค(์์ดํ 17). ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ฉด final์ด ์๋ ํ๋์ ์ ์ฉ๋๋ ๋ชจ๋ ๋ถ์ด์ต์ด ๊ทธ๋๋ก ์ ์ฉ๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ง๋ ๋ชปํ์ง๋ง, ์ฐธ์กฐ๋ ๊ฐ์ฒด ์์ฒด๋ ์์ ํ ์ ์๊ฒ ๋๋ค.
ยท ๊ธธ์ด๊ฐ 0์ด ์๋ ๋ฐฐ์ด์ ๋ชจ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ ์ฃผ์ํ์.
- ๋ฐ๋ผ์ ํด๋์ค์์ public static final ๋ฐฐ์ด ํ๋๋ฅผ ๋๊ฑฐ๋ ์ด ํ๋๋ฅผ ๋ฐํํ๋ ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์๋ ์ ๋๋ค.
- ์ด๋ฐ ํ๋๋ ์ ๊ทผ์๋ฅผ ์ ๊ณตํ๋ฉด, ํด๋ผ์ด์ธํธ์์ ๊ทธ ๋ฐฐ์ด์ ๋ด์ฉ์ ์์ ํ ์ ์๊ฒ ๋๋ค.
ex) public static final Thing[] VALUE = {...}; // ๋ณด์ ํ์ ์ด ์จ์ด ์๋ค.
ยท ์ด๋ค IDE๊ฐ ์์ฑํ๋ ์ ๊ทผ์๋ private ๋ฐฐ์ด ํ๋์ ์ฐธ์กฐ๋ฅผ ๋ฐํํ์ฌ ์ด ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋๊ฐ์ด ์ผ์ผํค๋ ์ฃผ์ํ์.
- ํด๊ฒฐ์ฑ 1: ์ ์ฝ๋์ public ๋ฐฐ์ด์ private์ผ๋ก ๋ง๋ค๊ณ public ๋ถ๋ณ ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐํ๋ค.
private static final Thing[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
- ํด๊ฒฐ์ฑ 2: ๋ฐฐ์ด์ private์ผ๋ก ๋ง๋ค๊ณ ๋ฐฉ์ด์ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ public ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค.
private static final Thing[] PRIVATE_VALUES = { ... };
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}- ์ด๋ ๋ฐํ ํ์ ์ด ๋ ์ฐ๊ธฐ ํธํ ์ง, ์ฑ๋ฅ์ ์ด๋ ์ชฝ์ด ๋์์ง ๊ณ ๋ฏผํด ์ ํ์.
๋ชจ๋ ์์คํ
ยท ์๋ฐ 9์์๋ ๋ชจ๋ ์์คํ ์ด๋ผ๋ ๊ฐ๋ ์ด ๋์ ๋๋ฉด์ ๋ ๊ฐ์ง ์๋ฌต์ ์ ๊ทผ ์์ค์ด ์ถ๊ฐ๋์๋ค.
- ํจํค์ง๊ฐ ํด๋์ค๋ค์ ๋ฌถ์์ด๋ฏ, ๋ชจ๋์ ํจํค์ง๋ค์ ๋ฌถ์์ด๋ค.
- ๋ชจ๋์ ์์ ์ ์ํ๋ ํจํค์ง ์ค ๊ณต๊ฐ(export)ํ ๊ฒ๋ค์ (๊ด๋ก์ module-info.java ํ์ผ์) ์ ์ธํ๋ค.protected ํน์ public ๋ฉค๋ฒ๋ผ๋ ํด๋น ํจํค์ง๋ฅผ ๊ณต๊ฐํ์ง ์์๋ค๋ฉด, ๋ชจ๋ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ค.
- ๋ชจ๋ ์์คํ ์ ํ์ฉํ๋ฉด ํด๋์ค๋ฅผ ์ธ๋ถ์ ๊ณต๊ฐํ์ง ์์ผ๋ฉด์ ๊ฐ์ ๋ชจ๋์ ์ด๋ผ๋ ํจํค์ง ์ฌ์ด์์๋ ์์ ๋กญ๊ฒ ๊ณต์ ํ ์ ์๋ค.
- ๋ ๊ฐ์ง ์๋ฌต์ ์ ๊ทผ ์์ค์ ์จ๊ฒจ์ง ํจํค์ง ์์ ์๋ public ํด๋์ค์ public ํน์ protected ๋ฉค๋ฒ์ ๊ด๋ จ์ด ์๋ค.
- ์ด ์๋ฌต์ ์ ๊ทผ ์์ค๋ค์ ๊ฐ๊ฐ public ์์ค๊ณผ protected ์์ค๊ณผ ๊ฐ์ผ๋, ๊ทธ ํจ๊ณผ๊ฐ ๋ชจ๋ ๋ด๋ถ๋ก ํ์ ๋๋ ๋ณ์ข ์ด๋ค.
- ์ด๋ฐ ํํ๋ก ๊ณต์ ํด์ผ ํ๋ ์ํฉ์ ํํ์ง ์ฐฎ๋ค. ๊ทธ๋์ผ ํ๋ ์ํฉ์ด ๋ฒ์ด์ ธ๋ ํจ์บ์ง๋ค ์ฌ์ด์์ ํด๋์ค๋ค์ ์ฌ๋ฐฐ์นํ๋ฉด ๋๋ถ๋ถ ํด๊ฒฐ๋๋ค.
TODO: ์ดํด ๋ถ์กฑ
ยท 4๊ฐ์ ๊ธฐ์กด ์ ๊ทผ ์์ค๊ณผ ๋ฌ๋ฆฌ, ๋ชจ๋์ ์ ์ฉ๋๋ ์๋ก์ด ๋ ์ ๊ทผ ์์ค์ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค.
- ๋ชจ๋์ JAR ํ์ผ์ ์์ ์ ๋ชจ๋ ๊ฒฝ๋ก๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋์คํจ์ค์ ๋๋ฉด ๊ทธ ๋ชจ๋ ์์ ๋ชจ๋ ํจํค์ง๋ ๋ง์น ๋ชจ๋์ด ์๋ ๊ฒ์ฒ๋ผ ํ๋ํ๋ค. ์ฆ, ๋ชจ๋์ด ๊ณต๊ฐํ๋์ง ์ฌ๋ถ์ ์๊ด์์ด public ํด๋์ค๊ฐ ์ ์ธํ ๋ชจ๋ public ํน์ protected ๋ฉค๋ฒ๋ฅผ ๋ชจ๋ ๋ฐ์์๋ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
ยท JDK๋ ์๋ก ๋ฑ์ฅํ ์ด ์ ๊ทผ ์์ค์ ์ ๊ทน ํ์ฉํ ๋ํ์ ์ธ ์๋ค.
- ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ณต๊ฐํ์ง ์์ ํจํค์ง๋ค์ ํด๋น ๋ชจ๋ ๋ฐ์์ ์ ๋๋ก ์ ๊ทผํ ์ ์๋ค.
ยท ์ ๊ทผ ๋ณดํธ ๋ฐฉ์์ด ์ถ๊ฐ๋ ๊ฒ ๋ง๊ณ ๋, ๋ชจ๋์ ์ฌ๋ฌ ๋ฉด์์ ์๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ์ํฅ์ ์ค๋ค.
- ๋ชจ๋์ ์ฅ์ ์ ์ ๋๋ก ๋๋ฆฌ๋ ค๋ฉด ํด์ผ ํ ์ผ์ด ๋ง๋ค. 1. ํจํค์ง๋ฅผ ๋ชจ๋ ๋จ์๋ก ๋ฌถ๊ณ , ๋ชจ๋ ์ ์ธ์ ํจํค์ง๋ค์ ๋ชจ๋ ์์กด์ฑ์ ๋ฉฐ์ํ๋ค. 2. ๊ทธ ํ ์์ค ํธ๋ฆฌ๋ฅผ ์ฌ๋ฐฐ์นํ๊ณ , ๋ชจ๋ ์์์๋ถํฐ (๋ชจ๋ ์์คํ ์ ์ ์ฉํ์ง ์์) ์ผ๋ฐ ํจํค์ง๋ก์ ๋ชจ๋ ์ ๊ทผ์ ํน๋ณํ ์กฐ์น๋ฅผ ์ทจํด์ผ ํ๋ค.
์์ดํ
16. public ํด๋์ค์์๋ public ํ๋๊ฐ ์๋ ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ผ
ยท ํด๋์ค์ ๋ฐ์ดํฐ ํ๋์ ์ง์ ์ ๊ทผํ ์ ์์ผ๋ฉด ์บก์ํ์ ์ด์ ์ ์ ๊ณตํ์ง ๋ชปํ๋ค(์์ดํ 15).
- API๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๋ด๋ถ ํํ์ ๋ฐ๊ฟ ์ ์๊ณ , ๋ถ๋ณ์์ ๋ณด์ฅํ ์ ์์ผ๋ฉฐ, ์ธ๋ถ์์ ํ๋์ ์ ๊ทผํ ๋ ๋ถ์ ์์ ์ ์ํํ ์๋ ์๋ค.
// ์บก์ํ์ ์ด์ ์ ์ ๊ณตํ์ง ๋ชปํ๋ ํด๋์ค
class Point{
public double x;
public double y;
}ยท ํด๋์ค์ ํ๋๋ ๋ชจ๋ private์ผ๋ก ๋ฐ๊พธ๊ณ public ์ ๊ทผ์(getter)๋ฅผ ์ถ๊ฐํ์.
- ํจํค์ง ๋ฐ๊นฅ์์ ์ ๊ทผํ ์ ์๋ ํด๋์ค๋ผ๋ฉด ์ ๊ทผ์๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ํด๋์ค ๋ด๋ถ ํํ ๋ฐฉ์์ ์ธ์ ๋ ๋ฐ๊ฟ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค.
- public ํด๋์ค๊ฐ ํ๋๋ฅผ ๊ณต๊ฐํ๋ฉด ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๊ฐ ์๊ฑฐ๋ ๊ฒ์ด๋ฏ๋ก ๋ด๋ถ ํํ ๋ฐฉ์์ ๋ง์๋๋ก ๋ฐ๊ฟ ์ ์๊ฒ ๋๋ค.
class Point{
private double x;
private double y;
public Point(double x, double y){
this.x = x;
this.y = y;
}
public double getX() { return x; }
public double getY() { return y; }
public void setX(double x){ this.x = x; }
public void setY(double y){ this.y = y; }
}ยท package-private ํด๋์ค ๋๋ private ์ค์ฒฉ ํด๋์ค๋ผ๋ฉด ๋ฐ์ดํฐ ํ๋๋ฅผ ๋ ธ์ถํ๋ค ํด๋ ํ๋ฑ ๋ฌธ์ ๊ฐ ์๋ค.
- ์ด ๋ฐฉ์์ ํด๋์ค ์ ์ธ ๋ฉด์์๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ์ฝ๋ ๋ฉด์์๋ ์ ๊ทผ์ ๋ฐฉ์๋ณด๋ค ํจ์ฌ ๊น๋ํ๋ค.
- ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ์ด ํด๋์ค ๋ด๋ถ ํํ์ ๋ฌถ์ด๊ธฐ๋ ํ๋, ํด๋ผ์ด์ธํธ๋ ์ด์ฐจํผ ์ด ํด๋์ค๋ฅผ ํฌํจํ๋ ํจํค์ง ์์์๋ง ๋์ํ๋ ์ฝ๋๋ค. ๋ฐ๋ผ์ ๋ฐ๊นฅ ์ฝ๋๋ ์ ํ ์๋์ง ์๊ณ ๋ ๋ฐ์ดํฐ ํํ ๋ฐฉ์์ ๋ฐ๊ฟ ์ ์๋ค.
- private ์ค์ฒฉ ํด๋์ค์ ๊ฒฝ์ฐ ์์ ๋ฒ์๊ฐ ๋ ์ข์์ ธ์ ์ด ํด๋์ค๋ฅผ ํฌํจํ๋ ์ธ๋ถ ํด๋์ค๊น์ง๋ก ์ ํ๋๋ค.
ยท ์๋ฐ ํ๋ซํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ public ํด๋์ค์ ํ๋๋ฅผ ์ง์ ๋ ธ์ถํ ์ฌ๋ก๊ฐ ์๋ค. java.aws.package ํจํค์ง์ Point์ Dimenssion ํด๋์ค๋ก, ๊ทธ ์ค Dimenssion ํด๋์ค๋ ํด๋น ๋ฌธ์ ๋ก ์ฌ๊ฐํ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์๋ค(์์ดํ 67).
ยท public ํด๋์ค์ ํ๋๊ฐ ๋ถ๋ณ์ด๋ผ๋ฉด ์ง์ ๋ ธ์ถํ ๋์ ๋จ์ ์ด ์กฐ๊ธ์ ์ค์ด๋ค์ง๋ง, ์ฌ์ ํ ์ข์ ์๊ฐ์ ์๋๋ค.
- API๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ํํ ๋ฐฉ์์ ๋ฐ๊ฟ ์ ์๋ค.
- ํ๋๋ฅผ ์ฝ์ ๋ ๋ถ์ ์์ ์ ์ํํ ์ ์๋ค.
- ๋จ, ๋ถ๋ณ์์ ๋ณด์ฅํ ์ ์๋ค. ๋ค์ ํด๋์ค๋ ๊ฐ ์ธ์คํด์ค๊ฐ ์ ํจํ ์๊ฐ์ ํํํจ์ ๋ณด์ฅํ๋ค.
public final class Time {
private static final int HOURS_PER_DAY = 24;
private static final int MINUTES_PER_HOUR = 60;
public final int hour;
public final int minute;
public Time(int hour, int minute) {
validateTime(hour, minute);
this.hour = hour;
this.minute = minute;
}
private void validateTime(int hour, int minute) {
// .. ์ ํจ์ฑ ๊ฒ์ฆ ๋ก์ง, ๋ถ๋ณ์ ๋ณด์ฅ
}
// ...
}์์ดํ
17. ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ต์ํํ๋ผ
ยท ๋ถ๋ณ ํด๋์ค๋ ๊ทธ ์ธ์คํด์ค์ ๋ด๋ถ ๊ฐ์ ์์ ํ ์ ์๋ ํด๋์ค๋ค.
- ๋ถ๋ณ ์ธ์คํด์ค์ ๊ฐ์ง๋ ์ ๋ณด๋ ๊ณ ์ ๋์ด ๊ฐ์ฒด๊ฐ ํ๊ดด๋๋ ์๊ฐ๊น์ง ๋ฌ๋ผ์ง์ง ์๋๋ค.
- ๋ถ๋ณ ํด๋์ค๋ ์ค๊ณํ๊ณ ๊ตฌํํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ์ค๋ฅ๊ฐ ์๊ธธ ์ฌ์ง๋ ์ ๊ณ ์์ ํ๋ค.
ยท ์๋ฐ ํ๋ซํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์ํ ๋ถ๋ณ ํด๋์ค๋ฅผ ์ ๊ณตํ๋ค. ex) String, ๊ธฐ๋ณธ ํ์ ๋ฐ์ฑ ํด๋์ค, BigInteger, BigDecimal
ํด๋์ค๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋๋ ๊ท์น 5๊ฐ์ง
1. ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
2. ํด๋์ค๋ฅผ ํ์ฅํ ์ ์๋๋ก ํ๋ค.
- ํ์ ํด๋์ค์์ ๋ถ์ฃผ์ํ๊ฒ ํน์ผ ๋์ ์๋๋ก ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณํ๊ฒ ๋ง๋๋ ์ฌํ๋ฅผ ๋ง์์ค๋ค.
- ์์์ ๋ง๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ ํด๋์ค๋ฅผ final๋ก ์ ์ธํ๋ ๊ฒ์ด๋ค. (๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ค์ ์ค๋ช )
3. ๋ชจ๋ ํ๋๋ฅผ final๋ก ์ ์ธํ๋ค.
- ์๋ก ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๋๊ธฐํ ์์ด ๋ค๋ฅธ ์ค๋ ๋๋ก ๊ฑด๋ค๋ ๋ฌธ์ ์์ด ๋์ํ๊ฒ ๋ณด์ฅํด์ค๋ค.
4. ๋ชจ๋ ํ๋๋ฅผ private์ผ๋ก ์ ์ธํ๋ค.
- ํ๋๊ฐ ์ฐธ์กฐํ๋ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ํด๋ผ์ด์ธํธ์์ ์ง์ ์ ๊ทผํด ์์ ํ๋ ์ผ์ ๋ง์์ค๋ค.
- public final๋ก๋ง ์ ์ธํด๋ ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ๋์ง๋ง, ์ด๋ฌ๊ฒ ํ๋ฉด ๋ค์ ๋ฆด๋ฆฌ์ค์์ ๋ด๋ถ ํํ์ ๋ฐ๊พธ์ง ๋ชปํ๋ฏ๋ก ๊ถ์ฅ x
5. ์์ ์ธ์๋ ๋ด๋ถ์ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
- ํด๋์ค์ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ํ๋๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด ํด๋ผ์ด์ธํธ์์ ๊ทธ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ์ป์ ์ ์๋๋ก ํด์ผ ํ๋ค.
- ์ด๋ฐ ํ๋๋ ์ ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ณตํ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํด์๋ ์ ๋๋ฉฐ, ์ ๊ทผ์ ๋ฉ์๋๊ฐ ๊ทธ ํ๋๋ฅผ ๊ทธ๋๋ก ๋ฐํํด์๋ ์ ๋๋ค.
- ์์ฑ์, ์ ๊ทผ์, readObject ๋ฉ์๋(์์ดํ 88) ๋ชจ๋์์ ๋ฐฉ์ด์ ๋ณต์ฌ๋ฅผ ์ํํ์.
๋ถ๋ณ ํด๋์ค ์์ - ๋ถ๋ณ ๋ณต์์ ํด๋์ค
public final class Complex {
private final double re;
private final double im;
public Complex(double re, double im) {
this.re = re;
this.im = im;
}
public double realPart() {
return re;
}
public double imaginaryPart() {
return im;
}
public Complex plus(Complex complex) {
return new Complex(re + complex.re, im + complex.im);
}
// ...
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Complex complex = (Complex) o;
return Double.compare(complex.re, re) == 0 && Double.compare(complex.im, im) == 0;
}
@Override
public int hashCode() {
return Objects.hash(re, im);
}
}ยท ์ ์ฝ๋์์ ์ฌ์น ์ฐ์ฐ ๋ฉ์๋๋ค์ ์ธ์คํด์ค ์์ ์ ์์ ํ์ง ์๊ณ , ์๋ก์ด Complex ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋ค. ์ด์ฒ๋ผ ํผ์ฐ์ฐ์์ ํจ์๋ฅผ ์ ์ฉํด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง๋ง, ํผ์ฐ์ฐ์ ์์ฒด๋ ๊ทธ๋๋ก์ธ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ ํ๋ค.
- ํด๋น ๋ฐฉ์์ผ๋ก ํ๋ก๊ทธ๋๋ฐํ๋ฉด, ์ฝ๋์์ ๋ถ๋ณ์ด ๋๋ ์์ญ์ ๋น์จ์ด ๋์์ง๋ ์ฅ์ ์ด ์๋ค.
- ์ด์ ๋ฌ๋ฆฌ, ์ ์ฐจ์ ํน์ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ฉ์๋์์ ํผ์ฐ์ฐ์์ธ ์์ ์ ์์ ํด ์์ ์ ์ํ๊ฐ ๋ณํ๊ฒ ๋๋ค.
ยท ์ ์ฝ๋์์ ๋ฉ์๋ ์ด๋ฆ์ (add ๊ฐ์) ๋์ฌ ๋์ (plus ๊ฐ์) ์ ์น์ฌ๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ํด๋น ๋ฉ์๋๊ฐ ๊ฐ์ฒด์ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์๋๋ค๋์ฌ์ค์ ๊ฐ์กฐํ๋ ค๋ ์๋๋ค.
- BigInteger, BigDecimal ํด๋์ค๋ ์ด ๋ช ๋ช ๊ท์น์ ๋ฐ๋ฅด์ง ์์ ์๋ชป ์ฌ์ฉํด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ผ์ด ์์ฃผ ์๋ค.
ยท ์ ์ฝ๋๋ ๋ถ๋ณ์ ์ค๋ช ํ๊ธฐ ์ํ ์์ผ ๋ฟ ์ค๋ฌด์์ ์ธ ๋งํ ์์ค์ด ๋ชป๋๋ค. ๋ณต์์ ๊ณฑ์ ๊ณผ ๋๋์ ์ ํ์ค ๊ณต์๋๋ก ๊ตฌํํ์ง๋ง, ๋ฐ์ฌ๋ฆผ์ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ์๊ณ ๋ณต์์ NaN๊ณผ ๋ฌดํ๋๋ ๋ค๋ฃจ์ง ๋ชปํ๋ค.
๋ถ๋ณ ๊ฐ์ฒด์ ์ฅ์
ยท ๋ถ๋ณ ๊ฐ์ฒด๋ ๋จ์ํ๋ค. ์์ฑ๋ ์์ ์ ์ํ๋ฅผ ํ๊ดด๋ ๋๊น์ง ๊ทธ๋๋ก ๊ฐ์งํ๋ค.
- ๋ชจ๋ ์์ฑ์๊ฐ ํด๋์ค ๋ถ๋ณ์(class invariant)์ ๋ณด์ฅํ๋ค๋ฉด, ๊ทธ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ค๋ฅธ ๋ ธ๋ ฅ์ ๋ค์ด์ง ์๋๋ผ๋ ์์ํ ๋ถ๋ณ์ผ๋ก ๋จ๋๋ค.
- ๋ฐ๋ฉด ๊ฐ๋ณ ๊ฐ์ฒด๋ ์์์ ๋ณต์กํ ์ํ์ ๋์ผ ์ ์๋ค. ๋ณ๊ฒฝ์ ๋ฉ์๋๊ฐ ์ผ์ผํค๋ ์ํ ์ ์ด๋ฅผ ์ ๋ฐํ๊ฒ ๋ฌธ์๋ก ๋จ๊ฒจ๋์ง ์๋ฅด๋ฉด ๋ฏฟ๊ณ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ธ ์๋ ์๋ค.
ยท ๋ถ๋ณ ๊ฐ์ฒด๋ ๊ทผ๋ณธ์ ์ผ๋ก ์ค๋ ๋ ์์ ํ์ฌ ๋ฐ๋ก ๋๊ธฐํํ ํ์ ์๋ค.
- ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ฌ์ฉํด๋ ์ ๋ ํผ์๋์ง ์๋๋ค.
- ๋ถ๋ณ ๊ฐ์ฒด์ ๋ํด์๋ ๊ทธ ์ด๋ค ์ค๋ ๋๋ ๋ค๋ฅธ ์ค๋ ๋์ ์ํฅ์ ์ค ์ ์์ผ๋ ์์ฌํ๊ณ ๊ณต์ ํ ์ ์๋ค.
- ๋ฐ๋ผ์ ๋ถ๋ณ ํด๋์ค๋ผ๋ฉด ํ ๋ฒ ๋ง๋ ์ธ์คํด์ค๋ฅผ ์ต๋ํ ์ฌํ์ฉํ๊ธฐ๋ฅผ ๊ถํ๋ค.
- ์ฌํ์ฉ ๋ฐฉ๋ฒ: ์์ฃผ ์ฐ์ด๋ ๊ฐ๋ค์ ์์(public static final)๋ก ์ ๊ณตํ๋ค.
public static final Complex ZERO = new Complex(0, 0);
public static final Complex ONE = new Complex(1, 0);
public static final Complex I = new Complex(0, 1);ยท ๋ถ๋ณ ํด๋์ค๋ ์์ฃผ ์ฌ์ฉ๋๋ ์ธ์คํด์ค๋ฅผ ์บ์ฑํ์ฌ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ค๋ณต ์์ฑํ์ง ์๊ฒ ํด์ฃผ๋ ์ ์ ํฉํฐ๋ฆฌ(์์ดํ 1)๋ฅผ ์ ๊ณตํ ์ ์๋ค.
ex) ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ํด๋์ค, BigInteger
- ์ด๋ฐ ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ GC ๋น์ฉ์ด ์ค์ด๋ ๋ค.
- ์๋ก์ด ํด๋์ค๋ฅผ ์ค๊ณํ ๋ public ์์ฑ์ ๋์ ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋๋ฉด, ํด๋ผ์ด์ธํธ๋ฅผ ์์ ํ์ง ์๊ณ ๋ ํ์์ ๋ฐ๋ผ ์บ์ ๊ธฐ๋ฅ์ ๋์ค์ ๋ง๋ถ์ผ ์ ์๋ค.
ยท ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ ์ ์๋ค๋ ์ ์ ๋ฐฉ์ด์ ๋ณต์ฌ(์์ดํ 50)๋ ํ์ ์๋ค๋ ๊ฒฐ๋ก ์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ์ด์ด์ง๋ค.
- ์๋ฌด๋ฆฌ ๋ณต์ฌํด๋ ์๋ณธ๊ณผ ๋๊ฐ์ผ๋ ๋ณต์ฌ ์์ฒด๊ฐ ์๋ฏธ ์๋ค.
- ๊ทธ๋ฌ๋ ๋ถ๋ณ ํด๋์ค๋ clone ๋ฉ์๋๋ ๋ณต์ฌ ์์ฑ์(์์ดํ 13)๋ฅผ ์ ๊ณตํ์ง ์๋ ๊ฒ ์ข๋ค.
ex) String ํด๋์ค์ ๋ณต์ฌ ์์ฑ์๋ ์ด ์ฌ์ค์ ์ ์ดํดํ์ง ๋ชปํ ์๋ฐ ์ด์ฐฝ๊ธฐ์ ๋ง๋ค์ด ์ก๋ค. ๋๋๋ก ์ฌ์ฉํ์ง ๋ง์.
ยท ๋ถ๋ณ ๊ฐ์ฒด๋ผ๋ฆฌ๋ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์๋ค.
ex) BigInteger ํด๋์ค๋ ๋ด๋ถ์์ ๊ฐ์ ๋ถํธ(sign)์ ํฌ๊ธฐ(magnititude)๋ฅผ ๋ฐ๋ก ํํํ๋ค. ๋ถํธ์๋ int ๋ณ์๋ฅผ , ํฌ๊ธฐ(์ ๋๊ฐ)์๋ int ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค. negate ๋ฉ์๋๋ ํฌ๊ธฐ๊ฐ ๊ฐ๊ณ ๋ถํธ๋ง ๋ฐ๋์ธ ์๋ก์ด BigInteger๋ฅผ ์์ฑํ๋๋ฐ, ์ด๋ ๋ฐฐ์ด์ ๊ฐ๋ณ์ด์ง๋ง ๋ณต์ฌํ์ง ์๊ณ ์๋ณธ ์ธ์คํด์ค์ ๊ณต์ ํด๋ ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์๋ก ๋ง๋ BigInteger ์ธ์คํด์ค๋ ์๋ณธ ์ธ์คํด์ค๊ฐ ๊ฐ๋ฆฌํค๋ ๋ด๋ถ ๋ฐฐ์ด์ ๊ทธ๋๋ก ๊ฐ๋ฆฌํจ๋ค.
(TODO: ๋ฌด์จ ๋ง์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค...)
ยท ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ๋ค๋ฅธ ๋ถ๋ณ ๊ฐ์ฒด๋ค์ ๊ตฌ์ฑ์์๋ก ์ฌ์ฉํ๋ฉด ์ด์ ์ด ๋ง๋ค.
- ๊ฐ์ด ๋ฐ๊ท์ง ์๋ ๊ตฌ์ฑ์์๋ค๋ก ์ด๋ค์ง ๊ฐ์ฒด๋ผ๋ฉด, ๊ตฌ์กฐ๊ฐ ๋ณต์กํด๋ ๋ถ๋ณ์์ ์ ์งํ๊ธฐ ์์ํ๋ค.
ex) ๋ถ๋ณ ๊ฐ์ฒด๋ ๋งต์ ํค์ ์งํฉ(Set)์ ์์๋ก ์ฐ๊ธฐ์ ์๋ง๋ค. ๋งต์ด๋ ์งํฉ์ ์์ ๋ด๊ธด ๊ฐ์ด ๋ฐ๋๋ฉด ๋ถ๋ณ์์ด ํ๋ฌผ์ด์ง๋๋ฐ, ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ฐ ๊ฑฑ์ ์ ํ์ง ์์๋ ๋๋ค.
ยท ๋ถ๋ณ ๊ฐ์ฒด๋ ๊ทธ ์์ฒด๋ก์คํจ ์์์ฑ์ ์ ๊ณตํ๋ค(์์ดํ 76).
- ์ํ๊ฐ ์ ๋ ๋ณํ์ง ์์ผ๋ ์ ๊น์ด๋ผ๋ ๋ถ์ผ์น ์ํ์ ๋น ์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค.
๋ถ๋ณ ๊ฐ์ฒด์ ๋จ์
ยท ๊ฐ์ด ๋ค๋ฅด๋ฉด ๋ ๋ฆฝ๋ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ผํ๋ค.
- ๊ฐ์ ๊ฐ์ง์๊ฐ ๋ง๋ค๋ฉด ํฐ ๋น์ฉ์ ์น๋ฌ์ผํ๋ค.
ex) ๋ฐฑ๋ง ๋นํธ์ง๋ฆฌ BigInteger์์ ๋นํธ ํ๋๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ค๊ณ ํด๋ณด์.
BigInteger moby = ...;
moby = moby.flipBIt(0);flipBit ๋ฉ์๋๋ ์๋ก์ด BigInteger ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. ๋ํ ์ด ์ฐ์ฐ์ BigInteger์ ํฌ๊ธฐ์ ๋น๋กํด ์๊ฐ๊ณผ ๊ณต๊ฐ์ ์ก์ ๋จน๋๋ค. BitSet๋ BiggInteger ์ฒ๋ผ ์์์ ๊ธธ์ด์ ๋นํธ ์์ด์ ํํํ์ง๋ง, BigInteger์ ๋ฌ๋ฆฌ ๊ฐ๋ณ์ด๋ค. BitSet ํด๋์ค๋ ์ํ๋ ๋นํธ ํ๋๋ง ์์ ์๊ฐ์ ๋ฐ๊ฟ์ฃผ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
BitSet moby = ...;
moby.flip(0);- ์ํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ๊น์ง ๋จ๊ณ๊ฐ ๋ง๊ณ , ๊ทธ ์ค๊ฐ ๋จ๊ณ์์ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ค์ด ๋ชจ๋ ๋ฒ๋ ค์ง๋ค๋ฉด ์ ์ ๋ฌธ์ ๊ฐ ๋ ๋ถ๊ฑฐ์ง๋ค.
ยท ์ฑ๋ฅ๋ฌธ์ ๋์ฒ ๋ฐฉ๋ฒ:
1. ํํ ์ฐ์ผ ๋ค๋จ๊ณ ์ฐ์ฐ(multistep operation)๋ค์ ์์ธกํ์ฌ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ผ๋ก ์ ๊ณตํ๋ค.
- ๊ฐ ๋จ๊ณ๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ค๋ค.
- BiggIntegerใด๋ ๋ชจ๋๋ฌ ์ง์ ๊ฐ์ ๋ค๋จ๊ณ ์ฐ์ฐ ์๋๋ฅผ ๋์ฌ์ฃผ๋ ๊ฐ๋ณ ๋๋ฐ ํด๋์ค(companion class)๋ฅผ packge-private์ผ๋ก ๋๊ณ ์๋ค.
2. ํด๋ผ์ด์ธํธ๋ค์ด ์ํ๋ ๋ณต์กํ ์ฐ์ฐ์ ์ ํํ ์์ธกํ ์ ์๋ค๋ฉด package-private์ ๊ฐ๋ณ ๋๋ฐ ํด๋์ค๋ง์ผ๋ก ์ถฉ๋ถํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, ์ด ํด๋์ค๋ฅผ public์ผ๋ก ์ ๊ณตํ๋ ๊ฒ ์ต์ ์ด๋ค.
- String์ StringBuilder์ ๊ตฌ๋ฅ๋ค๋ฆฌ StringBuffer๋ฅผ ๊ฐ๋ณ ๋๋ฐ ํด๋์ค๋ก ๋๊ณ ์๋ค.
๋ถ๋ณ ํด๋์ค๋ฅผ ๋ง๋๋ ๋ ๋ค๋ฅธ ์ค๊ณ ๋ฐฉ๋ฒ
ยท ๋ชจ๋ ์์ฑ์๋ฅผ private ํน์ package-private์ผ๋ก ๋ง๋ค๊ณ , public ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค.
// ์์ฑ์ ๋์ ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ถ๋ณ ํด๋์ค
public class Complex2 {
private final double re;
private final double im;
private Complex2(double re, double im) {
this.re = re;
this.im = im;
}
public static final Complex2 valueOf(double re, double im){
return new Complex2(re, im);
}
// ... ๋๋จธ์ง ์ฝ๋ ์๋ต
}ยท ์ด ๋ฐฉ์์ด ์ต์ ์ผ ๋๊ฐ ๋ง๋ค.
- ๋ฐ๊นฅ์์ ๋ณผ ์ ์๋ packge-private ๊ตฌํ ํด๋์ค๋ฅผ ์ํ๋ ๋งํผ ๋ง๋ค์ดํ์ฉํ ์ ์์ผ๋ ํจ์ฌ ์ ์ฐํ๋ค.
- public์ด๋ protected ์์ฑ์๊ฐ ์์ผ๋ ๋ค๋ฅธ ํจํค์ง์์ ์ด ํด๋์ค๋ฅผ ํ์ฅํ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ํจํค์ง ๋ฐ๊นฅ์ ํด๋์ค์์ ๋ฐ๋ผ๋ณธ ์ด ๋ถ๋ณ ๊ฐ์ฒด๋ ์ฌ์ค์ final์ด๋ค.
- ๋ค์์ ๊ตฌํ ํด๋์ค๋ฅผ ํ์ฉํ ์ ์ฐ์ฑ์ ์ ๊ณตํ๊ณ , ๋ค์ ๋ฆด๋ฆฌ์ค์์ ๊ฐ์ฒด ์บ์ฑ ๊ธฐ๋ฅ์ ์ถ๊ฐํด ์ฑ๋ฅ์ ๋์ด์ฌ๋ฆด ์๋ ์๋ค.
BigInteger์ BigDecimal์ ์ค๊ณ ์ค๋ฅ
ยท BigInteger์ BigDecimal์ ์ค๊ณํ ๋น์ ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ์ฌ์ค์ final์ด์ด์ผ ํ๋ค๋ ์๊ฐ์ด ๋๋ฆฌ ํผ์ง์ง ์์๋ค. ๊ทธ๋์ ์ด ๋ ํด๋์ค์ ๋ฉ์๋๋ค์ ๋ชจ๋ ์ฌ์ ์ํ ์ ์๊ฒ ์ค๊ณ๋์๊ณ , ํ์ ํธํ์ฑ ๋ฌธ์ ๋ก ์ง๊ธ๊น์ง ๋ฌธ์ ๋ฅผ ๊ณ ์น์ง ๋ชปํ๋ค.
ยท ์ ๋ขฐํ ์ ์๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ BigInteger๋ BigDecimal์ ์ธ์คํด์ค๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค๋ฉด ์ฃผ์ํด์ผ ํ๋ค.
- ์ด ๊ฐ๋ค์ด ๋ถ๋ณ์ด์ด์ผ ํด๋์ค์ ๋ณด์์ ์งํฌ ์ ์๋ค๋ฉด, ์ธ์๋ก ๋ฐ์ ๊ฐ์ฒด๊ฐ ์ง์ง BigInteger ํน์ BigDecimal์ธ์ง ํ์ธํด์ผ ํ๋ค.
- ์ ๋ขฐํ ์ ์๋ ํ์ ํด๋์ค์ ์ธ์คํด์ค๋ผ๊ณ ํ์ธ๋๋ฉด, ์ด ์ธ์๋ค์ ๊ฐ๋ณ์ด๋ผ ๊ฐ์ ํ๊ณ ๋ฐฉ์ด์ ์ผ๋ก ๋ณต์ฌํด ์ฌ์ฉํ์ผ ํ๋ค(์์ดํ 50).
public static BigInteger safeInstance(BigInteger val){
return val.getClass() == BigInteger.class ?
val : new BigInteger(val.toByteArray());
}์ฑ๋ฅ ๊ณ ๋ คํ๊ธฐ
ยท "๋ชจ๋ ํ๋๊ฐ final์ด๊ณ , ์ด๋ค๋ฉ๋ค ๋ฉ์๋๋ ๊ทธ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์์ด์ผ ํ๋ค"๋ ๊ท์น์ ์ฑ๋ฅ์ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ํ๋ ์ ์๋ค.
"์ด๋ค ๋ฉ์๋๋ ๊ฐ์ฒด์ ์ํ ์ค ์ธ๋ถ์ ๋น์น๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค."
ยท ์ด๋ค ๋ถ๋ณ ํด๋์ค๋ ๊ณ์ฐ ๋น์ฉ์ด ํฐ ๊ฐ์ ์ฒ์ ์ฐ์ผ ๋ ๊ณ์ฐํ์ฌ final์ด ์๋ ํ๋์ ์บ์ทํด๋๊ธฐ๋ ํ๋ค. ๋๊ฐ์ ๊ฐ์ ๋ค์ ์์ฒญํ๋ฉด ์บ์ํด๋ ๊ฐ์ ๋ฐํํ์ฌ ๊ณ์ฐ ๋น์ฉ์ ์ ๊ฐํ๋ค.
- ์ด ๋ฌ์๋ ์์ ํ ๊ทธ ๊ฐ์ฒต๊ฐ ๋ถ๋ณ์ด๊ธฐ ๋๋ฌธ์ ๋ถ๋ฆด ์ ์๋ค. ๋ช ๋ฒ์ ๊ณ์ฐํด๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ง๋ค์ด์ง์ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ถ๋ณ์ผ๋ก ๋ง๋ค ์ ์๋ ํด๋์ค
ยท ๋ชจ๋ ํด๋์ค๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋ค ์๋ ์๋ค.
ยท ๋ถ๋ณ์ผ๋ก ๋ง๋ค ์ ์๋ ํด๋์ค๋ผ๋ ๋ณ๊ฒฝํ ์ ์๋ ๋ถ๋ถ์ ์ต์ํ์ผ๋ก ์ค์ด์.
- ๊ฐ์ฒด๊ฐ ๊ฐ์ง ์ ์๋ ์ํ์ ์๊ฐ ์ค๋ฉด ๊ทธ ๊ฐ์ฒด๋ฅผ ์์ธกํ๊ธฐ ์ฌ์์ง๊ณ , ์ค๋ฅ๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ ๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ํฉ๋นํ ์ด์ ๊ฐ ์๋ค๋ฉด ๋ชจ๋ ํ๋๋ private final์ด์ด์ผ ํ๋ค.
๋ถ๋ณ์ ์ด๊ธฐํ
ยท ์์ฑ์๋ ๋ถ๋ณ์ ์ค์ ์ด ๋ชจ๋ ์๋ฃ๋, ์ด๊ธฐํ๊ฐ ์๋ฒฝํ ๋๋ ์ํ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ค.
ยท ํ์คํ ์ด์ ๊ฐ ์๋ค๋ฉด, ์์ฑ์์ ์ ์ ํฉํฐ๋ฆฌ ์ธ์๋ ๊ทธ ์ด๋ค ์ด๊ธฐํ ๋ฉ์๋๋ public์ผ๋ก ์ ๊ณตํด์๋ ์ ๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฌํ์ฉํ ๋ชฉ์ ์ผ๋ก ์ํ๋ฅผ ๋ค์ ์ด๊ธฐํํ๋ ๋ฉ์๋๋ ์๋๋ค. ๋ณต์ก์ฑ๋ง ์ปค์ง๊ณ ์ฑ๋ฅ ์ด์ ์ ๊ฑฐ์ ์๋ค.
์ ๋ฆฌํ๊ธฐ
ยท ๊ฒํฐ๊ฐ ์๋ค๊ณ ํด์ ๋ฌด์กฐ๊ฑด ์ธํฐ๋ฅผ ๋ง๋ค์ง ๋ง์.
ยท ํด๋์ค๋ ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋ถ๋ณ์ด์ด์ผ ํ๋ค.
ยท ๋ถ๋ณ ํด๋์ค๋ ์ฅ์ ์ด ๋ง์ผ๋ฉฐ, ๋จ์ ์ ํน์ ์ํฉ์์์ ์ ์ฌ์ ์ฑ๋ฅ ์ ํ๋ฟ์ด๋ค.
ยท ๋จ์ํ ๊ฐ ๊ฐ์ฒด๋ ํญ์ ๋ถ๋ณ์ผ๋ก ๋ง๋ค์.
ยท String๊ณผ BigInteger์ฒ๋ผ ๋ฌด๊ฑฐํ ๊ฐ ๊ฐ์ฒด๋ ๋ถ๋ณ์ผ๋ก ๋ง๋ค ์ ์๋์ง ๊ณ ์ฌํ๋ค.
- ์ฑ๋ฅ ๋๋ฌธ์ ์ด์ฉ ์ ์๋ค๋ฉด, ๋ถ๋ณ ํด๋์ค์ ์์ ์ด๋ฃจ๋ ๊ฐ๋ณ ๋๋ฐ ํด๋์ค๋ฅผ public ํด๋์ค๋ก ์ ๊ณตํ์.
์์ดํ
18. ์์๋ณด๋ค๋ ์ปดํฌ์ง์
์ ์ฌ์ฉํ๋ผ
ํต์ฌ ์ ๋ฆฌ
ยท ์์์ ๊ฐ๋ ฅํ์ง๋ง ์บก์ํ๋ฅผ ํด์น๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
ยท ์์์ ์์ ํด๋์ค์ ํ์ ํด๋์ค๊ฐ ์์ํ is-a ๊ด๊ณ์ผ ๋๋ง ์จ์ผํ๋ค.
- is-a ๊ด๊ณ์ผ ๋๋ ์์ฌํ ์ ์๋ค. ํ์ ํด๋์ค์ ํจํค์ง๊ฐ ์์ ํด๋์ค์ ๋ค๋ฅด๊ณ , ์์ ํด๋์ค๊ฐ ํ์ฅ์ ๊ณ ๋ คํด ์ค๊ณ๋์ง ์์๋ค๋ฉด ์ฌ์ ํ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค.
ยท ์์์ ์ทจ์ฝ์ ์ ํผํ๋ ค๋ฉด ์์ ๋์ ์ปดํฌ์ง์ ๊ณผ ์ ๋ฌ์ ์ฌ์ฉํ์.
- ํนํ ๋ํผ ํด๋์ค๋ก ๊ตฌํํ ์ ๋นํ ์ธํฐํ์ด์ค๊ฐ ์๋ค๋ฉด ๋์ฑ ๊ทธ๋ ๋ค. ๋ํผ ํด๋์ค๋ ํ์ ํด๋์ค๋ณด๋ค ๊ฒฌ๊ณ ํ๊ณ ๊ฐ๋ ฅํ๋ค.
์์์ ๋จ์
ยท ์์์ ์ฝ๋๋ฅผ ์ฌํ์ฉํ๋ ๊ฐ๋ ฅํ ์๋จ์ด์ง๋ง, ํญ์ ์ต์ ์ ์๋๋ค. ์๋ชป ์ฌ์ฉํ๋ฉด ์ค๋ฅ๋ฅผ ๋ด๊ธฐ ์ฌ์ด ์ํํธ์จ์ด๋ฅผ ๋ง๋ ๋ค.
- ์์ ํด๋์ค์ ํ์ ํด๋์ค๋ฅผ ๋ชจ๋ ๊ฐ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ํต์ ํ๋ ํจํค์ง ์์์๋ผ๋ฉด, ์์๋ ์์ ํ ๋ฐฉ๋ฒ์ด๋ค.
- ํ์ฅํ ๋ชฉ์ ์ผ๋ก ์ค๊ณ๋์๊ณ , ๋ฌธ์ํ๋ ์ ๋ ํด๋์ค(์์ดํ 19)๋ ์์ ํ๋ค.
- ์ผ๋ฐ์ ์ธ ๊ตฌ์ฒด ํด๋์ค๊ฐ ๋ค๋ฅธ ํจํค์ง์ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์์ํ๋ ์ผ์ ์ํํ๋ค.
ยท ๋ฉ์๋ ํธ์ถ๊ณผ ๋ฌ๋ฆฌ ์์์ ์บก์ํ๋ฅผ ๊นจ๋จ๋ฆฐ๋ค.
- ์์ ํด๋์ค๊ฐ ์ด๋ป๊ฒ ๊ตฌํ๋๋๋์ ๋ฐ๋ผ ํ์ ํด๋์ค์ ๋์์ ์ด์์ด ์๊ธธ ์ ์๋ค. ๊ทธ ์ฌํ๋ก ์ฝ๋ ํ ์ค ๊ฑด๋๋ฆฌ์ง ์์ ํ์ ํด๋์ค๊ฐ ์ค์๋ํ ์ ์๋ค.
- ๋ฐ๋ผ์ ์์ ํด๋์ค ์ค๊ณ์๊ฐ ํ์ฅ์ ์ถฉ๋ถํ ๊ณ ๋ คํ๊ณ ๋ฌธ์ํ๋ ์ ๋๋ก ํด๋์ง ์์ผ๋ฉด, ํ์ ํด๋์ค๋ ์์ ํด๋์ค์ ๋ณํ์ ๋ฐ๋ง์ถฐ ์์ ๋ผ์ผ๋ง ํ๋ค.
์์์ ์๋ชป ์ฌ์ฉํ ์์
ยท ๋ค์ ํด๋์ค๋ HashSet์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ด๋ค. ์ด ํด๋์ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
public class InstrumentedHashSet<E> extends HashSet<E> {
// ์ถ๊ฐ๋ ์์์ ์
private int addCount = 0;
public InstrumentedHashSet() {
}
public InstrumentedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor);
}
@Override
public boolean add(E e) {
addCount++;
return super.add(e);
}
@Override
public boolean addAll(Collection<? extends E> c) {
addCount += c.size();
return super.addAll(c);
}
public int getAddCount(){
return addCount;
}
}ยท ์ด ํด๋์ค์ ์ธ์คํด์ค์ addAll ๋ฉ์๋๋ก ์์ 3๊ฐ๋ฅผ ๋ํ๋ค๊ณ ํด๋ณด์. getAddCount ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด 3์ ๋ฐํํ๋ฆฌ๋ผ ๊ธฐ๋ํ๊ฒ ์ง๋ง, ์ค์ ๋ก๋ 6์ ๋ฐํํ๋ค.
InstrumentedHashSet<String> s = new InstrumentedHashSet();
s.addAll(List.of("๊ฐ","๋","๋ค"))ยท ์์ธ์ HashSet์ addAll ๋ฉ์๋๊ฐ add ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๊ตฌํ๋ ๋ฐ์๋ค. ์ด๋ฐ ๊ตฌํ ๋ฐฉ์์ HashSet ๋ฌธ์์๋ ์ฐ์ฌ ์์ง ์๋ค.
addAll ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ง ์์ผ๋ฉด?
ยท ํ์ ํด๋์ค์์ addAll ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ง ์์ผ๋ฉด, ๋ฌธ์ ๋ฅผ ๊ณ ์น ์ ์๋ค. ํ์ง๋ง HashSet์ addAll์ด add ๋ฉ์๋๋ฅผ ์ด์ฉํด ๊ตฌํํ์ผ์ ๊ฐ์ ํ ํด๋ฒ์ด๋ผ๋ ํ๊ณ๊ฐ ์๋ค.
- ์์ ์ ๋ค๋ฅธ ๋ถ๋ถ์์ฌ์ฉํ๋ ์๊ธฐ์ฌ์ฉ(self-use) ์ฌ๋ถ๋ ํด๋น ํด๋์ค์ ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์ ํด๋นํ๋ฉฐ, ์๋ฐ ํ๋ซํผ ์ ๋ฐ์ ์ธ ์ ์ฑ ์ธ์ง, ๋ค์ ๋ฆด๋ฅด์ค์์๋ ์ ์ง๋ ์ง ์ ์ ์๋ค. ๋ฐ๋ผ์ ์ด๋ฐ ๊ฐ์ ์ ๊ธฐ๋ ํด๋์ค๋ ๊บ ์ง๊ธฐ ์ฝ๋ค.
addAll ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ์์ผ๋ก ์ฌ์ ์ ํ๋ค๋ฉด?
ยท addAll ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ์์ผ๋ก ์ฌ์ ์ํ ์๋ ์๋ค. ์์ปจ๋ ์ฃผ์ด์ง ์ปฌ๋ ์ ์ ์ํํ๋ฉฐ ์์ ํ๋๋น add ๋ฉ์๋๋ฅผ ํ ๋ฒ๋ง ํธ์ถํ๋ ๊ฒ์ด๋ค.
- ์ฅ์ : HashSet์ addAll์ ๋ ์ด์ ํธ์ถํ์ง ์์ผ๋ addAll์ด add๋ฅผ ์ฌ์ฉํ๋์ง์ ์๊ด์์ด ๊ฒฐ๊ณผ๊ฐ ์ณ๋ค๋ ์ ์์ ๋ ๋์ ํด๋ฒ์ด๋ค.
- ๋จ์ : ์์ ํด๋์ค์ ๋ฉ์๋ ๋์์ ๋ค์ ๊ตฌํํ๋ ๋ฐฉ์์ ์ด๋ ต๊ณ , ์๊ฐ๋ ๋ ๋ค๊ณ , ์ค๋ฅ๋ฅผ ๋ด๊ฑฐ๋ ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆด ์ ์๋ค. ๋ํ ํ์ ํด๋์ค์์๋ ์ ๊ทผํ ์ ์๋ private ํ๋๋ฅผ ์จ์ผ ํ๋ ์ํฉ์ด๋ผ๋ฉด ์ด ๋ฐฉ์ฑ์ผ๋ก๋ ๊ตฌํ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
ํ์ ํด๋์ค๊ฐ ๊นจ์ง๊ธฐ ์ถ๊ฐ์ ์ธ ์ฌ์ด ์ด์
ยท ๋ณด์ ๋๋ฌธ์ ์ปฌ๋ ์ ์ ์ถ๊ฐ๋ ๋ชจ๋ ์์๊ฐ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ๋ง ํ๋ ํ๋ก๊ทธ๋จ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค๋ฉด?
- ์ปฌ๋ ์ ์ ์์ํ์ฌ ์์๋ฅผ ์ถ๊ฐํ๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด ํ์ํ ์กฐ๊ฑด์ ๋จผ์ ๊ฒ์ฌํ๊ฒ ํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
- ๋ฌธ์ ์ : ์ด ๋ฐฉ์์ด ํตํ๋ ๊ฒ์ ์์ ํด๋์ค์ ๋ ๋ค๋ฅธ ์์ ์ถ๊ฐ ๋ฉ์๋๊ฐ ๋ง๋ค์ด์ง๊ธฐ ์ ๊น์ง๋ค. ๋ค์ ๋ฆด๋ฆฌ์ค์์ ์ฐ๋ คํ ์ผ์ด ์๊ธฐ๋ฉด, ํ์ ํด๋์ค์์ ์ฌ์ ์ํ์ง ๋ชปํ ๊ทธ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํด 'ํ์ฉ๋์ง ์์' ์์๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ๋๋ค.
- ์ค์ ๋ก Hashtable๊ณผ Vector๋ฅผ ์ปฌ๋ ์ ํ๋ ์์ํฌ์ ํฌํจ์ํค์ ์ด์ ๊ด๋ จํ ๋ณด์ ๊ตฌ๋ฉ๋ค์ ์์ ํด์ผ ํ๋ ์ฌํ๊ฐ ๋ฒ์ด์ก๋ค.
ยท ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ๋์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํด๋ (ํจ์ฌ ์์ ํ ๊ฒ์ ๋ง์ง๋ง) ์ํ์ด ์กด์ฌํ๋ค.
- ์์ ํด๋์ค์ ์ ๋ฉ์๋๊ฐ ์ถ๊ฐ๋๋๋ฐ ํ์ ํด๋์ค์ ์ถ๊ฐํ ๋ฉ์๋์ ์๊ทธ๋์ฒ๊ฐ ๊ฐ๊ณ ๋ฐํ ํ์ ์ด ๋ค๋ฅด๋ค๋ฉด, ํด๋์ค๋ ์ปดํ์ผ์กฐ์ฐจ ๋์ง ์๋๋ค.
- ๋ฐํ ํ์ ๋ง์ ๊ฐ๋ค๋ฉด ์์ ํด๋์ค์ ์ ๋ฉ์๋๋ฅด ์ฌ์ ์ํ ๊ผด์ด๋ ์์์ ๋ฌธ์ ์ ๋๊ฐ์ ์ํฉ์ ๋ถ๋ฅ์น๋ค.
- ์ด ๋ฉ์๋๋ฅผ ์์ฑํ ๋ ์์ ํด๋์ค์ ๋ฉ์๋๋ ์กด์ฌํ์ง๋ ์์์ผ๋, ๋ง๋ ๋ฉ์๋๋ ์์ ํด๋์ค์ ๋ฉ์๋๊ฐ ์๊ตฌํ๋ ๊ท์ฝ์ ๋ง์กฑํ์ง ๋ชปํ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
์์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฌ์ - ์ปดํฌ์ง์
ยท ๊ธฐ์กด ํด๋์ค๋ฅผ ํ์ฅํ๋ ๋์ , ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค๊ณ private ํ๋๋ก ๊ธฐ์กด ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ ๋ฐฉ์์ด๋ค.
ยท ๊ธฐ์กด ํด๋์ค๊ฐ ์๋ก์ด ํด๋์ค์ ๊ตฌ์ฑ์์๋ก ์ฐ์ธ๋ค๋ ๋ป์์ ์ด๋ฌํ ์ค๊ณ๋ฅผ ์ปดํฌ์ง์ (๊ตฌ์ฑ)์ด๋ผ ํ๋ค.
ยท ์ ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋๋ค์ (private ํ๋๋ก ์ฐธ์กฐํ๋) ๊ธฐ์กด ํด๋์ค์ ๋์ํ๋ ๋ฉ์๋๋ฅผ ํธ์ถ ํด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
- ์ด ๋ฐฉ์์ ์ ๋ฌ(forwarding)์ด๋ผ ํ๋ฉฐ, ์ ํด๋์ค์ ๋ฉ์๋๋ค์ ์ ๋ฌ ๋ฉ์๋(forwarding method)๋ผ ๋ถ๋ฅธ๋ค.
ยท ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋ก์ด ํด๋์ค๋ ๊ธฐ์กด ํด๋์ค์ ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์ ์ํฅ์์ ๋ฒ์ด๋๋ฉฐ, ๊ธฐ์กด ํด๋์ค์ ์๋ก์ด ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์ด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
์ปดํฌ์ง์ ์ ์ ์ฉํ ํด๋์ค
ยท ์๋ ์ฝ๋๋ ์์ ๊ตฌํํ InstrumentedHshSet์ ์ปดํฌ์ง์ ๊ณผ ์ ๋ฌ ๋ฐฉ์์ผ๋ก ๋ค์ ๊ตฌํํ ๊ฒ์ด๋ค. ํ๋๋ ์งํ ํด๋์ค ์์ ์ด๊ณ , ๋ค๋ฅธ ํ๋๋ ์ ๋ฌ ๋ฉ์๋๋ง์ผ๋ก ์ด๋ค์ง ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ ๋ฌ ํด๋์ค๋ค.
// ๋ํผ ํด๋์ค - ์์ ๋์ ์ปดํฌ์ง์
์ฌ์ฉ
public class InstrumentedSet<E> extends ForwardingSet<E> {
private int addCount = 0;
public InstrumentedSet(Set<E> s) {
super(s);
}
@Override
public boolean add(E e) {
addCount++;
return super.add(e);
}
@Override
public boolean addAll(Collection<? extends E> c) {
addCount += c.size();
return super.addAll(c);
}
public int getAddCount(){
return addCount;
}
}// ์ฌ์ฌ์ฉํ ์ ์๋ ์ ๋ฌ ํด๋์ค
public class ForwardingSet<E> implements Set<E> {
private final Set<E> s;
public ForwardingSet(Set<E> s) {this.s = s;}
public int size() {return 0;}
public boolean isEmpty() {return s.isEmpty();}
public boolean contains(Object o) {return s.contains(o);}
public Iterator<E> iterator() {return s.iterator();}
public Object[] toArray() {return s.toArray();}
public <T> T[] toArray(T[] a) {return s.toArray(a);}
public boolean add(E e) {return s.add(e);}
public boolean remove(Object o) {return s.remove(o);}
public boolean containsAll(Collection<?> c) {return s.containsAll(c);}
public boolean addAll(Collection<? extends E> c) {return s.addAll(c);}
public boolean retainAll(Collection<?> c) {return s.retainAll(c);}
public boolean removeAll(Collection<?> c) {return s.removeAll(c);}
public void clear() {s.clear();}
@Override public boolean equals(Object o) {return s.equals(o);}
@Override public int hashCode() {return s.hashCode();}
@Override public String toString() {return s.toString();}
}ยท InstrumentedSet์ HashSet์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ์ํ Set ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํด ์ค๊ณ๋์ด ๊ฒฌ๊ณ ํ๊ณ , ์ ์ฐํ๋ค.
- Set ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ , Set์ ์ธ์คํด์ค๋ฅผ ์ธ์๋ก ๋ฐ๋ ์์ฑ์๋ฅผ ํ๋ ์ ๊ณตํ๋ค.
- ์์์ Set์ ๊ณ์ธก ๊ธฐ๋ฅ์ ๋ง์์ ์๋ก์ด Set์ผ๋ก ๋ง๋๋ ๊ฒ์ด ์ด ํด๋์ค์ ํต์ฌ์ด๋ค.
ยท ์์ ๋ฐฉ์์ ๊ตฌ์ฒด ํด๋์ค ๊ฐ๊ฐ์ ๋ฐ๋ก ํ์ฅํด์ผ ํ๋ฉฐ, ์ง์ํ๊ณ ์ถ์ ์์ ํด๋์ค์ ์์ฑ์ ๊ฐ๊ฐ์ ๋์ํ๋ ์์ฑ์๋ฅผ ๋ณ๋๋ก ์ ์ํด์ค์ผ ํ์ง๋ง, ์ง๊ธ ์ ๋ณด์ธ ์ปดํฌ์ง์ ๋ฐฉ์์ ํ ๋ฒ๋ง ๊ตฌํํด๋๋ฉด ์ด๋ค Set ๊ตฌํ์ฒด๋ผ๋ ๊ณ์ธกํ ์ ์์ผ๋ฉฐ, ๊ธฐ์กด ์์ฑ์๋ค๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
Set<Instant> times = new InstrumentedSet<>(new TreeSet<>());
Set<E> s = new InstrumentedSet<>(new HashSet<>(INIT_CAPACITY));ยท InstrumentSet์ ์ด์ฉํ๋ฉด ๋์ Set ์ธ์คํด์ค๋ฅผ ํน์ ์กฐ๊ฑดํ์์๋ง ์์๋ก ๊ณ์ธกํ ์ ์๋ค.
static void walk(Set<Dog> dogs) {
InstrumentedSet<Dog> iDogs = new InstrumentedSet<>(dogs);
... //์ด ๋ฉ์๋์์๋ dogs๋์ idogs๋ฅผ ์ฌ์ฉํ๋ค.
}ยท ๋ค๋ฅธ Set ์ธ์คํด์ค๋ฅผ ๊ฐ์ธ๊ณ ์๋ค๋ ๋ป์์ InstrumentedSet ๊ฐ์ ํด๋์ค๋ฅผ ๋ํผ ํด๋์ค๋ผ ํ๋ฉฐ, ๋ค๋ฅธ Set์ ๊ณ์ธก ๊ธฐ๋ฅ์ ๋ง์์ด๋ค๋ ๋ป์์ ๋ฐ์ฝ๋ ์ดํฐ ํจํด[Gamma95]์ด๋ผ๊ณ ํ๋ค.
ยท ์ปดํฌ์ง์ ๊ณผ ์ ๋ฌ์ ์กฐํฉ์ ๋์ ์๋ฏธ๋ก ์์(delegation)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์๋ฐํ ๋ฐ์ง๋ฉด ๋ํผ ๊ฐ์ฒด๊ฐ ๋ด๋ถ ๊ฐ์ฒด์ ์๊ธฐ ์์ ์ ์ฐธ์กฐ๋ฅผ ๋๊ธฐ๋ ๊ฒฝ์ฐ๋ง ์์์ ํด๋นํ๋ค.
ยท ์ ๋ฌ ๋ฉ์๋๋ฅผ ์ธํฐํ์ด์ค๋น ํ๋์ฉ๋ง ๋ง๋ค์ด๋๋ฉด ์ํ๋ ๊ธฐ๋ฅ์ ๋ง์์ฐ๋ ์ ๋ฌ ํด๋์ค๋ค์ ์์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
ex) ๊ตฌ์๋ฐ๋ ๋ชจ๋ ์ปฌ๋ ์ ์ธํฐํ์ด์ค์ฉ ์ ๋ฌ ๋ฉ์๋๋ฅด ์ ๋ถ ๊ตฌํํด๋๋ค.
๋ํผ ํด๋์ค์ ๋จ์
ยท ๋ํผ ํด๋์ค์ ๋จ์ ์ ๊ฑฐ์ ์์ง๋ง, ์ฝ๋ฐฑ ํ๋ ์์ํฌ์ ์ด์ธ๋ฆฌ์ง ์๋ค๋ ์ ๋ง ์ฃผ์ํ์.
- ์ฝ๋ฐฑ ํ๋ ์์ํฌ์์๋ ์๊ธฐ ์์ ์ ์ฐธ์กฐ๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋๊ฒจ์ ๋ค์ ํธ์ถ(์ฝ๋ฐฑ) ๋ ์ฌ์ฉํ๋๋ก ํ๋ค. ๋ด๋ถ ๊ฐ์ฒด๋ ์์ ์ ๊ฐ์ธ๊ณ ์๋ ๋ํผ์ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๋ ๋์ ์๊ธฐ(this)์ ์ฐธ์กฐ๋ฅผ ๋๊ธฐ๊ณ , ์ฝ๋ฐฑ ๋๋ ๋ํผ๊ฐ ์๋ ๋ด๋ถ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ค. ์ด๋ฅผ SELF ๋ฌธ์ ๋ผ๊ณ ํ๋ค.
ยท ์ ๋ฌ ๋ฉ์๋๊ฐ ์ฑ๋ฅ์ ์ฃผ๋ ์ํฅ์ด๋ ๋ํผ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฃผ๋ ์ํฅ์ ๊ฑฑ์ ํ๋ ์ฌ๋๋ ์์ง๋ง, ์ค์ ์์๋ ๋ ๋ค ๋ณ๋ค๋ฅธ ์ํฅ์ด ์๋ค๊ณ ๋ฐํ์ก๋ค.
์์์ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
ยท ์์์ ๋ฐ๋์ ํ์ ํด๋์ค๊ฐ ์์ ํด๋์ค์ ์ง์ง ํ์ ํ์ ์ธ ์ํฉ์๋ง ์ฐ์ฌ์ผ ํ๋ค. ์ฆ, ํด๋์ค B๊ฐ ํด๋์ค A์ is-a ๊ด๊ณ์ผ ๋๋ง ํด๋์ค A๋ฅผ ์์ํด์ผํ๋ค.
- ์๋ ๊ฒฝ์ฐ A๋ฅผ private ์ธ์คํด์ค๋ก ๋๊ณ , A์๋ ๋ค๋ฅธ API๋ฅผ ์ ๊ณตํด์ผ ํ๋ ์ํฉ์ด ๋๋ค์๋ค. ์ฆ, A๋ B๊ฐ ํ์ ๊ตฌ์ฑ์์๊ฐ ์๋๋ผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ผ ๋ฟ์ด๋ค.
- ์๋ฐ ํ๋ซํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Stack๊ณผ Vector, Properties์ Hashtable์ ๋ ์ด๋ฅผ ๋ช ๋ฐฑํ ์๋ฐํ ํด๋์ค๋ค. ๋ ์ฌ๋ก ๋ชจ๋ ์ปดํฌ์ง์ ์ ์ฌ์ฉํ๋ค๋ฉด ๋ ์ข์์ ๊ฒ์ด๋ค.
ยท ์ปดํฌ์ง์ ์ ์จ์ผ ํ ์ํฉ์ ์์์ ์ฌ์ฉํ๋ ๊ฑด ๋ด๋ถ ๊ตฌํ์ ๋ถํ์ํ๊ฒ ๋ ธ์ถํ๋ ๊ผด์ด๋ค.
- ๊ทธ ๊ฒฐ๊ณผ API๊ฐ ๋ด๋ถ ๊ตฌํ์ ๋ฌถ์ด๊ณ , ํด๋์ค์ ์ฑ๋ฅ๋ ์์ํ ์ ํ๋๋ค. ๋ํ ํด๋ผ์ด์ธํธ๊ฐ ๋ ธ์ถ๋ ๋ด๋ถ์ ์ง์ ์ ๊ทผํ ์ ์๋ค. ๊ฐ์ฅ ์ฌ๊ฐํ ๋ฌธ์ ๋ ํด๋ผ์ด์ธํธ์์ ์์ ํด๋์ค๋ฅผ ์ง์ ์์ ํ์ฌ ํ์ ํด๋์ค์ ๋ถ๋ณ์์ ํด์น ์ ์๋ค๋ ๊ฒ์ด๋ค.
ex) Properties๋ ํค์ ๊ฐ์ผ๋ก ๋ฌธ์์ด๋ง ํ์ฉํ๋๋ก ์ค๊ณํ๋ ค ํ์ผ๋, ์์ ํด๋์ค์ธ Hashtable์ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ๋ฉด ์ด ๋ถ๋ณ์ ์ ๊บ ๋ฒ๋ฆด ์ ์๋ค. ๋ถ๋ณ์์ด ํ ๋ฒ ๊บ ์ง๋ฉด load, store ๊ฐ์ properties API๋ ๋ ์ด์ ์ฌ์ฉํ ์ ์๋ค.
ยท ์ปดํฌ์ง์ ๋์ ์์์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ธฐ ์ ์๋ฌธํ ์ง๋ฌธ๋ค: 1. ํ์ฅํ๋ ค๋ ํด๋์ค์ API์ ์๋ฌด๋ฐ ๊ฒฐํจ์ด ์๋๊ฐ?
2. ๊ฒฐํจ์ด ์๋ค๋ฉด, ์ด ๊ฒฐํจ์ด ํ์ฅ ํด๋์ค์ API๊น์ง ์ ํ๋ผ๋ ๊ด์ฐฎ์๊ฐ?
- ์ปดํฌ์ง์ ์ผ๋ก๋ ์ด๋ฐ ๊ฒฐํจ์ ์จ๊ธฐ๋ ์๋ก์ด API๋ฅผ ์ค๊ณํ ์ ์์ง๋ง, ์์์ ์์ ํด๋์ค์ API์ ๊ฒฐํจ๊น์ง ๊ทธ๋๋ก ์น๊ณํ๋ค.
์์ดํ
19. ์์์ ๊ณ ๋ คํด ์ค๊ณํ๊ณ ๋ฌธ์ํํ๋ผ. ๊ทธ๋ฌ์ง ์์๋ค๋ฉด ์์์ ๊ธ์งํ๋ผ
ํต์ฌ ์ ๋ฆฌ
ยท ์์์ฉ ํด๋์ค๋ฅผ ์ค๊ณํ๊ธฐ๋ง ๋ง๋ง์น ์๋ค.
- ํด๋์ค ๋ด๋ถ์์ ์ค์ค๋ก๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง(์๊ธฐ์ฌ์ฉ ํจํด) ๋ชจ๋ ๋ฌธ์๋ก ๋จ๊ฒจ์ผ ํ๋ฉฐ, ์ผ๋จ ๋ฌธ์ํํ ๊ฒ์ ๊ทธ ํด๋์ค๊ฐ ์ฐ์ด๋ํ ๋ฐ๋์ ์ง์ผ์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, ๊ทธ ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์ ๋ฏฟ๊ณ ํ์ฉํ๋ ํ์ ํด๋์ค๋ฅผ ์ค์๋ํ๊ฒ ๋ง๋ค ์ ์๋ค.
ยท ๋ค๋ฅธ ์ด๊ฐ ํจ์จ ์ข์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋๋ก ์ผ๋ถ ๋ฉ์๋๋ฅผ protected๋ก ์ ๊ณตํด์ผ ํ ์๋ ์๋ค.
ยท ํด๋์ค๋ฅผ ํ์ฅํด์ผ ํ ๋ช ํํ ์ด์ ๊ฐ ๋ ์ค๋ฅด์ง ์๋๋ค๋ฉด ์์์ ๊ธ์งํ๋ ํธ์ด ๋ซ๋ค.
ยท ์์์ ๊ธ์งํ๋ ค๋ฉด ํด๋์ค๋ฅผ final๋ก ์ ์ธํ๊ฑฐ๋ ์์ฑ์ ๋ชจ๋๋ฅผ ์ธ๋ถ์์ ์ ๊ธํ ์ ์๋๋ก ๋ง๋ค๋ฉด ๋๋ค.
TODO: ๋ด์ฉ ์ถ๊ฐ
public class Super {
// ์๋ชป๋ ์ - ์์์๊ฐ ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
public Super() {
overrideMe();
}
public void overrideMe() {
}
}public class Sub extends Super{
// ์ด๊ธฐํ๋์ง ์์ final ํ๋, ์์ฑ์์์ ์ด๊ธฐํํ๋ค.
private final Instant instant;
public Sub() {
super();
instant = Instant.now();
}
// ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋, ์์ ํด๋์ค์ ์์ฑ์๊ฐ ํธ์ถํ๋ค.
@Override
public void overrideMe() {
System.out.println(instant);
}
public static void main(String[] args) {
Sub sub = new Sub();
sub.overrideMe();
}
}์์ดํ
20. ์ถ์ ํด๋์ค๋ณด๋ค๋ ์ธํฐํ์ด์ค๋ฅผ ์ฐ์ ํ๋ผ
ํต์ฌ ์ ๋ฆฌ
ยท ์ผ๋ฐ์ ์ผ๋ก ๋ค์ค ๊ตฌํ์ฉ ํ์ ์ผ๋ก๋ ์ธํฐํ์ด์ค๊ฐ ๊ฐ์ฅ ์ ํฉํ๋ค.
ยท ๋ณต์กํ ์ธํฐํ์ด์ค๋ผ๋ฉด ๊ตฌํํ๋ ์๊ณ ๋ฅผ ๋์ด์ฃผ๋ ๊ณจ๊ฒฉ ๊ตฌํ์ ํจ๊ป ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๊ผญ ๊ณ ๋ คํ์.
ยท ๊ณจ๊ฒฉ ๊ตฌํ์ '๊ฐ๋ฅํ' ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ก ์ ๊ณตํ์ฌ ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ชจ๋ ๊ณณ์์ ํ์ฉํ๋๋ก ํ์.
ยท '๊ฐ๋ฅํ'์ด๋ผ๊ณ ํ ์ด์ ๋, ์ธํฐํ์ด์ค์ ๊ฑธ๋ ค ์๋ ๊ตฌํ์์ ์ ์ฝ ๋๋ฌธ์ ๊ณจ๊ฒฉ ๊ตฌํ์ ์ถ์ ํด๋์ค๋ก ์ ๊ณตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ ํํ๊ธฐ ๋๋ฌธ์ด๋ค.
TODO: ๋ด์ฉ ์ถ๊ฐ
public interface Singer {
AudioClip sing(Song s);
}
public interface SonrgWriter {
Song compose(int chartPosition);
}public interface SingerSongWriter extends Singer, SongWritter {
AudioClip strum();
void actSensitive();
}static List<Integer> intArrayAsList(int[] a) {
Objects.requireNonNull(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 size() {
return a.length;
}
};
}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 Objects.equals(e.getKey(), getKey())
&& Objects.equals(e.getValue(), getValue());
}
// Map.Entry.hashCode์ ์ผ๋ฐ ๊ท์ฝ์ ๊ตฌํํ๋ค.
@Override public int hashCode() {
return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue());
}
@Override public String toString() {
return getKey() + "=" + getValue();
}
}์์ดํ
21. ์ธํฐํ์ด์ค๋ ๊ตฌํํ๋ ์ชฝ์ ์๊ฐํด ์ค๊ณํ๋ผ
* ํต์ฌ: ๋ํดํธ ๋ฉ์๋๋ผ๋ ๋๊ตฌ๊ฐ ์๊ฒผ๋๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ค๊ณํ ๋๋ ์ฌ์ ํ ์ธ์ฌํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์. ๋ํดํธ ๋ฉ์๋๋ก ๊ธฐ์กด ์ธํฐํ์ด์ค์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ฉด ์ปค๋ค๋ ์ํ๋ ๋ธ๋ ค ์จ๋ค.
ยท ์๋ฐ 8์ ์๋ ๊ธฐ์กด ๊ตฌํ์ฒด๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์๊ณ ๋ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ ๋ฐฉ๋ฒ์ด ์์๋ค.
- ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋ณดํต์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋๋๋ฐ, ์ถ๊ฐ๋ ๋ฉ์๋๊ฐ ์ฐ์ฐํ ๊ธฐ์กด ๊ตฌํ์ฒด์ ์ด๋ฏธ ์กด์ฌํ ๊ฐ๋ฅ์ฑ์ ์์ฃผ ๋ฎ๊ธฐ ๋๋ฌธ์ด๋ค.
ยท ์๋ฐ 8๋ถํฐ ๊ธฐ์กด ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์๋๋ก ๋ํดํธ ๋ฉ์๋๋ฅผ ์๊ฐํ์ง๋ง, ์ํ์ด ์์ ํ ์ฌ๋ผ์ง ๊ฒ์ ์๋๋ค.
- ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ์ธํ๋ฉด, ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ง ์์ ๋ชจ๋ ํด๋์ค์์ ๋ํดํธ ๊ตฌํ์ด ์ฐ์ด๊ฒ ๋๋ค. ํ์ง๋ง ๋ํดํธ ๋ฉ์๋๋ ๊ตฌํ ํด๋์ค์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅธ ์ฑ ๋ฌด์์ ์ฝ์ ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ๊ธฐ์กด ๊ตฌํ์ฒด๋ค๊ณผ ๋งค๋๋ฝ๊ฒ ์ฐ๋๋๋ฆฌ๋ผ๋ ๋ณด์ฅ์ ์๋ค.
๋ํดํธ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์์ - ์ปฌ๋ ์ ์ธํฐํ์ด์ค
ยท ์๋ฐ 8์์๋ ํต์ฌ ์ปฌ๋ ์ ์ธํฐํ์ด์ค๋ค์ ๋ค์์ ๋ํดํธ ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์๋ค.
- ์ฃผ๋ก ๋๋ค๋ฅผ ํ์ฉํ๊ธฐ ์ํด์๋ค.
ยท ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํดํธ ๋ฉ์๋๋ ์ฝ๋ ํ์ง์ด ๋๊ณ ๋ฒ์ฉ์ ์ด๋ผ ๋๋ถ๋ถ ์ํฉ์์ ์ ์๋ํ๋ค. ํ์ง๋ง ์๊ฐํ ์ ์๋ ๋ชจ๋ ์ํฉ์์ ๋ถ๋ณ์์ ํด์น์ง ์๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ์์ฑํ๊ธฐ๋ ์ด๋ ต๋ค.
ยท ์๋ฐ 8 Collection ์ธํฐํ์ด์ค์ ์ถ๊ฐ๋ removeIf ๋ฉ์๋๋ ์ฃผ์ด์ง ๋ถ๋ฆฌ์ธ ํจ์(predicate)๊ฐ true๋ฅผ ๋ฐํํ๋ ๋ชจ๋ ์์๋ฅผ ์ ๊ฑฐํ๋ค. ๋ํดํธ ๊ตฌํ์ ์๋ง ๋ค์์ฒ๋ผ ๊ตฌํ๋ ์์ ๊ฒ์ด๋ค.
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}์ด ์ฝ๋๋ณด๋ค ๋ ๋ฒ์ฉ์ ์ผ๋ก ๊ตฌํํ๊ธฐ๋ ์ด๋ ต๊ฒ ์ง๋ง, ํ์กดํ๋ ๋ชจ๋ Collection ๊ตฌํ์ฒด์ ์ ์ด์ฐ๋ฌ์ง๋ ๊ฒ์ ์๋๋ค. ์ํ์น ์ปค๋จผ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ SynchronizedCollection ํด๋์ค๋ ์ง๊ธ๋ ํ๋ฐํ ๊ด๋ฆฌ๋๊ณ ์์ง๋ง, removeIf ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ง ์๊ณ ์๋ค. (2018.11 ๊ธฐ์ค)
ํด๋น ํด๋์ค๋ ์ปฌ๋ ์ ๋์ ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ณตํ ๊ฐ์ฒด๋ก ๋ฝ์ ๊ฑฐ๋ ๋ฅ๋ ฅ์ ์ ๊ณตํ๋ค. ์ฆ, ๋ชจ๋ ๋ฉ์๋์์ ์ฃผ์ด์ง๋ฝ ๊ฐ์ฒด๋ก ๋๊ธฐํํ ํ ๋ด๋ถ ์ปฌ๋ ์ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ์์ํ๋ ๋ํผ ํด๋์ค(์์ดํ 18)๋ค.
์ด ํด๋์ค๋ฅผ ์๋ฐ 8๊ณผ ํจ๊ป ์ฌ์ฉํ๊ฒ๋์ด removeIf์ ๋ํดํธ ๊ตฌํ์ ๋ฌผ๋ ค๋ฐ์ผ๋ฉด, ๋ชจ๋ ๋ฉ์๋ ํธ์ถ์ ์์์ ๋๊ธฐํํด์ฃผ์ง ๋ชปํ๋ค. removeIf์ ๊ตฌํ์ ๋๊ธฐํ์ ๊ดํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ฏ๋ก ๋ฝ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์ SynchronizedCollection ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ํ๊ฒฝ์์ ํ ์ค๋ ๋๊ฐ removeIf๋ฅผ ํธ์ถํ๋ฉด ConcurrentModificationException์ด ๋ฐ์ํ๊ฑฐ๋ ๋ค๋ฅธ ์๊ธฐ์น ๋ชปํ ๊ฒฐ๊ณผ๋ก ์ด๋ฌ์ง ์ ์๋ค.
ยท ์๋ฐ ํ๋ซํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ๊ธฐ ์ํด ์ผ๋ จ์ ์กฐ์น๋ฅผ ์ทจํ๋ค.
- ์๋ฅผ ๋ค์ด ๊ตฌํํ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๊ณ , ๋ค๋ฅธ ๋ฉ์๋์์๋ ๋ํฌ๋กํธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ ํ์ํ ์์ ์ ์ํํ๋๋ก ํ๋ค.
ex) Collections.synchronizedCollection์ด ๋ฐํํ๋ package-private ํด๋์ค๋ค์ removeIf๋ฅผ ์ฌ์ ์ํ๊ณ , ์ด๋ฅผ ํธ์ถํ๋ ๋ค๋ฅธ ๋ฉ์๋๋ค์ ๋ํดํธ ๊ตฌํ์ ํธ์ถํ๊ธฐ ์ ์ ๋๊ธฐํ๋ฅผ ํ๋๋ก ํ๋ค.
ยท ์๋ฐ ํ๋ซํผ์ ์ํ์ง ์์ ์ 3์ ๊ธฐ์กด ์ปฌ๋ ์ ๊ตฌํ์ฒด๋ค์ ์ด๋ฐ ์ธ์ด ์ฐจ์์ ์ธํฐํ์ด์ค ๋ณํ์ ๋ฐ๋ง์ถฐ ์์ ๋ ๊ธฐํ๊ฐ ์์์ผ๋ฉฐ, ๊ทธ์ค ์ผ๋ถ๋ ์ฌ์ ํ ์์ ๋์ง ์๊ณ ์๋ค.
๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ ์ฌํญ
ยท ๋ํดํธ ๋ฉ์๋๋ ์ปดํ์ผ์ ์ฑ๊ณตํ๋๋ผ๋ ๊ธฐ์กด ๊ตฌํ์ฒด์์ ๋ฐํ์ ์ค๋ฅ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
ยท ๊ธฐ์กด ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ก ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ์ผ์ ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ํผํด์ผ ํ๋ค.
- ์ถ๊ฐํ๋ ค๋ ๋ํดํธ ๋ฉ์๋๊ฐ ๊ธฐ์กด ๊ตฌํ์ฒด๋ค๊ณผ ์ถฉ๋ํ์ง๋ ์์์ง ์ฌ์ฌ์๊ณ ํ์.
ยท ๋ฐ๋ฉด, ์๋ก์ด ์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด ํ์ค์ ์ธ ๋ฉ์๋ ๊ตฌํ์ ์ ๊ณตํ๋ ๋ฐ ์์ฃผ ์ ์ฉํ ์๋จ์ด๋ฉฐ, ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๋ ์ฝ๊ฒ ๊ตฌํํด ํ์ฉํ ์ ์๊ฒ๋ ํด์ค๋ค(์์ดํ 20).
ยท ๋ํดํธ ๋ฉ์๋๋ 1. ์ธํฐํ์ด์ค๋ก๋ถํฐ ๋ฉ์๋๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ 2. ๊ธฐ์กด ๋ฉ์๋์ ์๊ทธ๋์ฒ๋ฅผ ์์ ํ๋ ์ฉ๋๊ฐ ์๋์ ๋ช ์ฌํ์.
- ์ด๋ฐ ํํ๋ก ์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ฐ๋์ ๊ธฐ์กด ํด๋ผ์ด์ธํธ๋ฅผ ๋ง๊ฐ๋จ๋ฆฌ๊ฒ ๋๋ค.
ยท ์๋ก์ด ์ธํฐํ์ด์ค๋ผ๋ฉด ๋ฆด๋ฆฌ์ค ์ ๋ฐ๋์ ํ ์คํธ๋ฅผ ๊ฑฐ์น์.
- ์๋ก ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ต์ํ ์ธ ๊ฐ์ง๋ ๊ตฌํํ์.
- ๊ฐ ์ธํฐํ์ด์ค์ ์ธ์คํด์ค๋ฅผ ๋ค์ํ ์์ ์ ํ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด๋ณด์.
- ์ธํฐํ์ด์ค๋ฅผ ๋ฆด๋ฆฌ์คํ ํ๋ผ๋ ๊ฒฐํจ์ ์์ ํ๋ ๊ฒ ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ก ์๊ฒ ์ง๋ง, ์ ๋ ๊ทธ ๊ฐ๋ฅ์ฑ์ ๊ธฐ๋์๋ ์ ๋๋ค.
์์ดํ
22. ์ธํฐํ์ด์ค๋ ํ์
์ ์ ์ํ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๋ผ
ยท ์ธํฐํ์ด์ค๋ ์์ ์ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋ ํ์ ์ญํ ๋ก๋ง ์ฌ์ฉํด์ผ ํ๋ค.
- ํด๋์ค๊ฐ ์ด๋ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค๋ ๊ฒ์ ์์ ์ ์ธ์คํด์ค๋ก ๋ฌด์์ ํ ์ ์๋์ง๋ฅผ ํด๋ผ์ด์ธํธ์ ์๊ธฐํด์ฃผ๋ ๊ฒ์ด๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ง์นจ์ ๋ง์ง ์๊ฒ ์ฌ์ฉํ ์์ - ์์ ์ธํฐํ์ด์ค
ยท ์์ ์ธํฐํ์ด์ค๋ ๋ฉ์๋ ์์ด, ์์๋ฅผ ๋ปํ๋ static final ํ๋๋ก๋ง ๊ฐ๋ ์ฐฌ ์ธํฐํ์ด์ค๋ค.
- ์ด ์์๋ค์ ์ฌ์ฉํ๋ ค๋ ํด๋์ค์์๋ ์ ๊ทํ๋ ์ด๋ฆ(qualified name)์ ์ฐ๋ ๊ฑธ ํผํ๊ณ ์ ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
public interface PhysicalConstants {
// ์๋ณด๊ฐ๋๋ก ์ (1/๋ชฐ)
static final double AVOGADRO_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) java.io.ObjectStreamConstants
์ฌ๋ฐ๋ฅด๊ฒ ์์๋ฅผ ๊ณต๊ฐํ๋ ๋ฐฉ๋ฒ
ยท ํน์ ํด๋์ค๋ ์ธํฐํ์ด์ค์ ๊ฐํ๊ฒ ์ฐ๊ฒฐ๋ ์์๋ผ๋ฉด ๊ทธ ํด๋์ค๋ ์ธํฐํ์ด์ค ์์ฒด์ ์ถ๊ฐํ๋ค.
ex) Integer์ Double์ ์ ์ธ๋ MIN_VALUE, MAX_VALUE
ยท ์ด๊ฑฐ ํ์ ์ผ๋ก ๋ํ๋ด๊ธฐ ์ ํฉํ ์์๋ผ๋ฉด, ์ด๊ฑฐํ์ ์ผ๋ก ๋ง๋ค์ด ๊ณต๊ฐํ๋ค(์์ดํ 34).
ยท ์ธ์คํด์คํํ ์ ์๋ ์ ํธ๋ฆฌํฐ ํด๋์ค(์์ดํ 4)์ ๋ด์ ๊ณต๊ฐํ ์๋ ์๋ค.
public class PhysicalConstants {
private PhysicalConstants(){}; //์ธ์คํด์คํ ๋ฐฉ์ง
//์๋ณด๊ฐ๋๋ฅด ์(1/๋ชฐ)
public static final double AVOGADROS_NUMBER = 6.002_140_857e23;
//๋ณผ์ธ ๋ง ์์ (J/K)
public static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
// ์ ์ ์ง๋ (kg)
public static final double ELECTRON_MASS = 9.109_383_56e-31;
}์์ดํ
23. ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ณด๋ค๋ ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ผ
ยท ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ ๋จ์ ์ด ํ๊ฐ๋์ด๋ค.
- ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค: ๋ ๊ฐ์ง ์ด์์ ์๋ฏธ๋ฅผ ํํํ ์ ์์ผ๋ฉฐ, ๊ทธ์ค ํ์ฌ ํํํ๋ ์๋ฏธ๋ฅผ ํ๊ทธ ๊ฐ์ผ๋ก ์๋ ค์ฃผ๋ ํด๋์ค
1. ์ด๊ฑฐ ํ์ ์ ์ธ, ํ๊ทธ ํ๋, switch ๋ฌธ ๋ฑ ์ธ๋ฐ์๋ ์ฝ๋๊ฐ ๋ง๋ค.
2. ์ฌ๋ฌ ๊ตฌํ์ด ํ ํด๋์ค์ ํผํฉ๋ผ ์์ด์ ๊ฐ๋ ์ฑ์ด ๋์๋ค.
3. ๋ค๋ฅธ ์๋ฏธ๋ฅผ ์ํ ์ฝ๋๊ฐ ์ธ์ ๋ ํจ๊ป ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
4. ํ๋๋ฅผ final๋ก ์ ์ธํ๋ ค๋ฉด ํด๋น ์๋ฏธ์ ์ฐ์ด์ง ์๋ ํ๋๊น์ง ์์ฑ์์์ ์ด๊ธฐํํด์ผ ํ๋ค.
5. ์์ฑ์๊ฐ ํ๊ทธ ํ๋๋ฅผ ์ค์ ํ๊ณ ํด๋น ์๋ฏธ์ ์ฐ์ด๋ ๋ฐ์ดํฐ ํ๋๋ฅผ ์ด๊ธฐํํ๋ ๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ๋์์ค ์ ์๋ ๊ฑด ๋ณ๋ก ์๋ค.
- ์๋ฑํ ํ๋๋ฅผ ์ด๊ธฐํํด๋ ๋ฐํ์์ ๋ฌธ์ ๊ฐ ๋๋ฌ๋๋ค.
6. ๋ค๋ฅธ ์๋ฏธ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ค.
- ์๋ก์ด ์๋ฏธ๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค ๋ชจ๋ switch ๋ฌธ์ ์ ์๋ฏธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผํ๊ณ , ์ค์๋ก ๋น ๋จ๋ฆฌ๋ฉด ๋ฐํ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
7. ์ธ์คํด์ค์ ํ์ ๋ง์ผ๋ก ํ์ฌ ๋ํ๋ด๋ ์๋ฏธ๋ฅผ ์ ์ ์๋ค.
* ์์ฝ: ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ ์ฅํฉํ๊ณ , ์ค๋ฅ๋ฅผ ๋ด๊ธฐ ์ฝ๊ณ , ๋นํจ์จ์ ์ด๋ค.
// ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค ์์
class Figure {
enum Shape { RECTANGLE, CIRCLE };
// ํ๊ทธ ํ๋ - ํ์ฌ ๋ชจ์์ ๋ํ๋ธ๋ค.
final Shape shape;
// ๋ค์ ํ๋๋ค์ ๋ชจ์์ด ์ฌ๊ฐํ์ผ ๋๋ง ์ฐ์ธ๋ค.
double length;
double width;
// ๋ค์ ํ๋๋ ๋ชจ์์ด ์์ผ ๋๋ง ์ฐ์ธ๋ค.
double radius;
// ์์ฉ ์์ฑ์
Figure(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}
// ์ฌ๊ฒฉํ์ฉ ์์ฑ์
Figure(double length, double width) {
shape = Shape.RECTANGLE;
this.length = length;
this.width = width;
}
double area() {
switch(shape) {
case RECTANGLE:
return length * width;
case CIRCLE:
return Math.PI * (radius * radius);
default:
throw new AssertionError(shape);
}
}ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค์ ๋์: ์๋ธํ์ดํ
ยท ๊ฐ์ฒด ์งํฅ ์ธ์ด๋ ํ์ ํ๋๋ก ๋ค์ํ ์๋ฏธ ๊ฐ์ฒด๋ฅผ ํํํ๋ ํจ์ฌ ๋์ ์๋จ์ ์ ๊ณตํ๋ค.
๋ฐ๋ก ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ ์๋ธํ์ดํ์ด๋ค.
- ์๋ธ ํ์ดํ(subtyping): ํ์ ๊ณ์ธต์ ๊ตฌ์ฑํ๊ธฐ ์ํด ์์์ ์ฌ์ฉ.
- ์๋ธ ํด๋์ฑ(subclassing): ๋ค๋ฅธ ํด๋์ค ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๋ชฉ์ ์ผ๋ก ์์์ ์ฌ์ฉ.
ยท ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ฅผ ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ:
1. ๊ณ์ธต๊ตฌ์กฐ์ ๋ฃจํธ๊ฐ ๋ ์ถ์ ํด๋์ค๋ฅผ ์ ์ํ๋ค.
2. ํ๊ทธ ๊ฐ์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง๋ ๋ฉ์๋๋ค์ ๋ฃจํธ ํด๋์ค์ ์ถ์ ๋ฉ์๋๋ก ์ ์ธํ๋ค.
3. ํ๊ทธ ๊ฐ์ ์๊ด์์ด ๋์์ด ์ผ์ ํ ๋ฉ์๋๋ค์ ๋ฃจํธ ํด๋์ค์ ์ผ๋ฐ ๋ฉ์๋๋ก ์ถ๊ฐํ๋ค.
4. ๋ชจ๋ ํ์ ํด๋์ค์์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ํ๋๋ค๋ ์ ๋ถ ๋ฃจํธ ํด๋์ค๋ก ์ฌ๋ฆฐ๋ค.
5. ๋ฃจํธ ํด๋์ค๋ฅผ ํ์ฅํ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์๋ฏธ๋ณ๋ก ํ๋์ฉ ์ ์ํ๋ค.
6. ๋ฃจํธ ํด๋์ค๊ฐ ์ ์ํ ์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ์์ ์๋ฏธ์ ๋ง๊ฒ ๊ตฌํํ๋ค.
// ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ฅผ ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ๋ก ๋ณํ
abstract class Figure {
abstract double area();
}
class Circle extends Figure {
final double radius;
Circle(double radius) { this.radius = radius; }
@Override double area() { return Math.PI * (radius * radius); }
}
class Rectangle extends Figure {
final double length;
final double width;
Rectangle(double length, double width;) {
this.length = length;
this.width = width;
}
@Override double area() { return length * width; }
}ยท ์์ ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ์ ์ฅ์ :
1. ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ , ๋ช ํํ๋ค.
2. ์ธ๋ฐ์๋ ์ฝ๋๊ฐ ์ฌ๋ผ์ง๋ค.
- ๊ฐ์๋ฏธ๋ฅผ ๋ ๋ฆฝ๋ ํด๋์ค์ ๋ด์ ๊ด๋ จ ์๋ ๋ฐ์ดํฐ ํ๋๋ฅผ ๋ชจ๋ ์ ๊ฑฐ
3. ๊ฐ ํด๋์ค์ ์์ฑ์๊ฐ ๋ชจ๋ ํ๋๋ฅผ ๋จ๊น์์ด ์ด๊ธฐํํ๊ณ , ์ถ์ ๋ฉ์๋๋ฅผ ๋ชจ๋ ๊ตฌํํ๋์ง ์ปดํ์ผ๋ฌ๊ฐ ํ์ธํด์ค๋ค.
4. ์ค์๋ก ๋นผ๋จน์ case๋ฌธ ๋๋ฌธ์ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ผ์ด ์๋ค.
5. ๋ฃจํธ ํด๋์ค์ ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ๋ค์ด ๋ ๋ฆฝ์ ์ผ๋ก ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ํ์ฅํ๊ณ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
6. ํ์ ์ด ์๋ฏธ๋ณ๋ก ๋ฐ๋ก ์กด์ฌํ์ฌ ๋ณ์์ ์๋ฏธ๋ฅผ ๋ช ์ํ๊ฑฐ๋ ์ ํํ ์ ์๊ณ , ํน์ ์๋ฏธ๋ง ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์ ์๋ค.
7. ํ์ ์ฌ์ด์ ์์ฐ์ค๋ฌ์ด ๊ณ์ธต ๊ด๊ณ๋ฅผ ๋ฐ์ํ ์ ์์ด์ ์ ์ฐ์ฑ์ ๋ฌผ๋ก ์ปดํ์ผํ์ ํ์ ๊ฒ์ฌ ๋ฅ๋ ฅ์ ๋์ฌ์ค๋ค.
ex) ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ์์ ์ ์ฌ๊ฐํ์ด ์ฌ๊ฐํ์ ํน๋ณํ ํํ์์ ์์ฃผ ๊ฐ๋จํ๊ฒ ๋ฐ์ํ ์ ์๋ค.
class Square extends Rectangle {
Square(double side) {
super(side, side);
}
}์์ดํ
24. ๋ฉค๋ฒ ํด๋์ค๋ ๋๋๋ก static์ผ๋ก ๋ง๋ค๋ผ
ยท ์ค์ฒฉ ํด๋์ค๋ ์์ ์ ๊ฐ์ผ ๋ฐ๊นฅ ํด๋์ค์์๋ง ์ฐ์ฌ์ผ ํ๋ฉฐ, ๊ทธ ์ธ์ ์ฐ์์ ์๋ค๋ฉด ํฑ๋ ๋ฒจ ํด๋์ค๋ก ๋ง๋ค์ด์ผ ํ๋ค.
- ์ค์ฒฉ ํด๋์ค(nested class): ๋ค๋ฅธ ํด๋์ค์์ ์ ์๋ ํด๋์ค
ยท ์ค์ฒฉ ํด๋์ค๋ ์ ์ ๋ฉค๋ฒ ํด๋์ค, (๋น์ ์ ) ๋ฉค๋ฒ ํด๋์ค, ์ต๋ช ํด๋์ค, ์ง์ญ ํด๋์ค ๋ค ๊ฐ์ง๊ฐ ์๋ค. ๊ฐ๊ฐ์ ์ฐ์์ด ๋ค๋ฅด๋ค.
- ์ด ์ค ์ฒซ ๋ฒ์งธ๋ฅผ ์ ์ธํ ๋๋จธ์ง๋ ๋ด๋ถ ํด๋์ค(inner class)์ ํด๋นํ๋ค.
์ ์ ๋ฉค๋ฒ ํด๋์ค์ ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค
ยท ๋ฉ์๋ ๋ฐ์์๋ ์ฌ์ฉํด์ผ ํ๊ฑฐ๋ ๋ฉ์๋ ์์ ์ ์ํ๊ธฐ์ ๋๋ฌด ๊ธธ๋ค๋ฉด ๋ฉค๋ฒ ํด๋์ค๋ก ๋ง๋ ๋ค.
ยท ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ ๋ค๋ฅธ ํด๋์ค ์์ ์ ์ธ๋๊ณ , ๋ฐ๊นฅ ํด๋์ค์ private ๋ฉค๋ฒ์๋ ์ ๊ทผํ ์ ์๋ค. ๋๋จธ์ง๋ ์ผ๋ฐ ํด๋์ค์ ๊ฐ๋ค.
ยท ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ ๋ค๋ฅธ ์ ์ ๋ฉค๋ฒ์ ๋๊ฐ์ ์ ๊ทผ ๊ท์น์ ์ ์ฉ๋ฐ๋๋ค. ex) private์ผ๋ก ์ ์ธํ๋ฉด ๋ฐ๊นฅ ํด๋์ค์์๋ง ์ ๊ทผํ ์ ์๋ค.
ยท ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ ํํ ๋ฐ๊นฅ ํด๋์ค์ ํจ๊ป ์ฐ์ผ ๋๋ง ์ ์ฉํ public ๋์ฐ๋ฏธ ํด๋์ค๋ก ์ฐ์ธ๋ค.
ex) ๊ณ์ฐ๊ธฐ๊ฐ ์ง์ํ๋ ์ฐ์ฐ ์ข ๋ฅ๋ฅผ ์ ์ํ๋ Operation ์ด๊ฑฐ ํ์ ์ด ์๋ค๊ณ ์๊ฐํ์. Operation ์ด๊ฑฐ ํ์ ์ Calculator ํด๋์ค์ public ์ ์ ๋ฉค๋ฒ ํด๋์ค๊ฐ ๋์ด Calculator ํด๋ผ์ด์ธํธ์์ Calculator.Operation.Plus ๊ฐ์ ํํ๋ก ์ํ๋ ์ฐ์ฐ์ ์ฐธ์กฐํ ์ ์๋ค.
ยท ์ ์ ๋ฉค๋ฒ ํด๋์ค์ ๋น์ ์ ๋ฉค๋ฒํด๋์ค์ ๊ตฌ๋ฌธ์ ์ฐจ์ด๋ ๋จ์ง static์ด ๋ถ์ด ์๊ณ ์๊ณ ๋ฟ์ด์ง๋ง, ์๋ฏธ์ ์ฐจ์ด๋ ํฌ๋ค.
- ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค์ ์ธ์คํด์ค๋ ๋ฐ๊นฅ ํด๋์ค์ ์ธ์คํด์ค์ ์๋ฌต์ ์ผ๋ก ์ฐ๊ฒฐ๋๋ค. ๊ทธ๋์ ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋์์ ์ ๊ทํ๋ this๋ฅผ ์ฌ์ฉํด ๋ฐ๊นฅ ์ธ์คํด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋ ๋ฐ๊นฅ ์ธ์คํด์ค์ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
- ์ด ๊ด๊ณ ์ ๋ณด๋ ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค์ ์ธ์คํด์ค ์์ ๋ง๋ค์ด์ ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐจ์งํ๋ฉฐ, ์์ฑ ์๊ฐ๋ ๋ ๊ฑธ๋ฆฐ๋ค.
- ์ด ๊ด๊ณ๋ ๋ฉค๋ฒ ํด๋์ค๊ฐ ์ธ์คํด์คํ๋ ๋ ํ๋ฆฝ๋๋ฉฐ, ๋ ์ด์ ๋ณ๊ฒฝํ ์ ์๋ค.
- ๊ฐ๋ ์ ์ค์ฒฉ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ฐ๊นฅ ์ธ์คํด์ค์ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ ์๋ค๋ฉด ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ก ๋ง๋ค์ด์ผ ํ๋ค. ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค๋ ๋ฐ๊นฅ ์ธ์คํด์ค ์์ด๋ ์์ฑํ ์ ์๋ค.
ยท ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค๋ ์ด๋ํฐ[Gamma95]๋ฅผ ์ ์ํ ๋ ์์ฃผ ์ฐ์ธ๋ค.
- ์ฆ, ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ธ ๋ง์น ๋ค๋ฅธ ํด๋์ค์ ์ธ์คํด์ค์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ ๋ทฐ๋ก ์ฌ์ฉ๋๋ค.
ex) Map ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ค์ ๋ณดํต (keySet, entrySet, values ๋ฉ์๋๊ฐ ๋ฐํํ๋)์์ ์ ์ปฌ๋ ์ ๋ทฐ๋ฅผ ๊ตฌํํ ๋ ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค. 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์ ์๋ตํ๋ฉด ๋ฐ๊นฅ ์ธ์คํด์ค๋ก์ ์จ์ ์ธ๋ถ ์ฐธ์กฐ๋ฅผ ๊ฐ๊ฒ๋๋ค. ์ด ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ ค๋ฉด ์๊ฐ๊ณผ ๊ณต๊ฐ์ด ์๋น๋๋ค. ๋ ์ฌ๊ฐํ ๋ฌธ์ ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ๋ฐ๊นฅ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์๊ฑฐํ์ง ๋ชปํ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๊ธธ ์ ์๋ค๋ ์ ์ด๋ค.
ยท private ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ ํํ ๋ฐ๊นฅ ํด๋์ค๊ฐ ํํํ๋ ๊ฐ์ฒด์ ํ ๋ถ๋ถ์ ๋ํ๋ผ ๋ ์ด๋ค.
ex) ๋ง์ Map ๊ตฌํ์ฒด๋ ๊ฐ๊ฐ์ ํค-๊ฐ ์์ ํํํ๋ ์ํธ๋ฆฌ ๊ฐ์ฒด๋ค์ ๊ฐ์ง๊ณ ์๋ค. ๋ชจ๋ ์ํธ๋ฆฌ๊ฐ ๋งต๊ณผ ์ฐ๊ด๋์ด ์์ง๋ง, ์ํธ๋ฆฌ์ ๋ฉ์๋๋ค(getKey, getValue, setValue)์ ๋งต์ ์ง์ ์ฌ์ฉํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ํธ๋ฆฌ๋ฅผ ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค๋ก ํํํ๋ ๊ฒ์ ๋ญ๋น๊ณ , private ์ ์ ๋ฉค๋ฒ ํด๋์ค๊ฐ ๊ฐ์ฅ ์๋ง๋ค. TODO: ์ดํด๊ฐ....
์ต๋ช ํด๋์ค
ยท ์ต๋ช ํด๋์ค๋ ์ด๋ฆ์ด ์๊ณ , ๋ฉค๋ฒ์ ๋ฌ๋ฆฌ ์ฐ์ด๋ ์์ ์ ์ ์ธ๊ณผ ๋์์ ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๋ค.
ยท ์ต๋ช ํด๋์ค๋ ์ค์ง ๋น์ ์ ์ธ ๋ฌธ๋งฅ์์ ์ฌ์ฉ๋ ๋๋ง ๋ฐ๊นฅ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ์ ์ ๋ฌธ๋งฅ์์๋ ์์ ๋ณ์ ์ด์ธ์ ์ ์ ๋ฉค๋ฒ๋ฅผ ๊ฐ์ค ์ ์๋ค.
public class NestedClass {
private Integer outerClassInstance;
public static Integer constant = 100_000;
public void nonStaticMethod(){
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("๋น์ ์ ๋ฌธ๋งฅ ๋ฉ์๋์์ ๋ฐ๊นฅ ํด๋์ค ์ธ์คํด์ค ์ฐธ์กฐ ๊ฐ๋ฅ:" + outerClassInstance);
System.out.println("๋น์ ์ ๋ฌธ๋งฅ ๋ฉ์๋์์ ์์ ์ฐธ์กฐ ๊ฐ๋ฅ:" + constant);
}
});
}
public static void staticMethod() {
new Thread(new Runnable() {
@Override
public void run() {
//์ปดํ์ผ ์ค๋ฅ System.out.println("์ ์ ๋ฌธ๋งฅ ๋ฉ์๋์์ ๋ฐ๊นฅ ํด๋์ค ์ธ์คํด์ค ์ฐธ์กฐ ๋ถ๊ฐ๋ฅ:" + outerClassInstance);
System.out.println("์ ์ ๋ฌธ๋งฅ ๋ฉ์๋์์ ๋ฐ๊นฅ ํด๋์ค ์ธ์คํด์ค ์์ ์ฐธ์กฐ ๊ฐ๋ฅ:" + constant);
}
});
}
}ยท ์ต๋ช ํด๋์ค๋ ์์ฉํ๋ ๋ฐ ์ ์ฝ์ด ๋ง๋ค.
1. ์ ์ธํ ์ง์ ์์๋ง ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
2. instanceof ๊ฒ์ฌ๋ ํด๋์ค์ ์ด๋ฆ์ด ํ์ํ ์์ ์ ์ํํ ์ ์๋ค.
3. ์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์๋ค.
4. ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋์์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์ํ ์ ์๋ค.
5. ์ต๋ช ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ ๊ทธ ์ต๋ช ํด๋์ค๊ฐ ์์ ํ์ ์์ ์์ํ ๋ฉค๋ฒ ์ธ์๋ ํธ์ถํ ์ ์๋ค.
6. ํํ์ ์ค๊ฐ์ ๋ฑ์ฅํ๋ฏ๋ก ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค.
ยท ์๋ฐ๊ฐ ๋๋ค๋ฅผ ์ง์ํ๊ธฐ ์ ์๋ ์ฆ์ฑ์์ ์์ ํจ์ ๊ฐ์ฒด๋ ์ฒ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐ ์ฃผ๋ก ์ฌ์ฉํ์ง๋ง, ์ด์ ๋๋ค์๊ฒ ๊ทธ ์๋ฆฌ๋ฅผ ๋ฌผ๋ ค์คฌ๋ค.
ยท ์ต๋ช ํด๋์ค๋ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉ๋ ์ ์๋ค.
static List<Integer> intArrayAsList(int[] a) {
Objects.requireNonNull(a);
return new AbtractList<Integer>() {
@Override public Integer get(int i) {
return a[i]; // ์คํ ๋ฐ์ฑ
}
@Override public Integer set(int i, Integer val) {
int oldVal = a[i];
a[i] = val; // ์ธ๋ฐ์ฑ
return oldVal; // ์คํ ๋ฐ์ฑ
}
@Ovveride public int size() {
return a.length;
}
}
}์ง์ญ ํด๋์ค
ยท ์ง์ญ ํด๋์ค๋ ์ง์ญ๋ณ์๋ฅผ ์ ์ธํ ์ ์๋ ๊ณณ์ด๋ฉด, ์ค์ง์ ์ผ๋ก ์ด๋์๋ ์ ์ธํ ์ ์๊ณ , ์ ํจ ๋ฒ์๋ ์ง์ญ๋ณ์์ ๊ฐ๋ค.
ยท ๋ค ๊ฐ์ง ์ค์ฒฉ ํด๋์ค ์ค ๊ฐ์ฅ ๋๋ฌผ๊ฒ ์ฌ์ฉ๋๋ค.
ยท ๋ค๋ฅธ ์ธ ์ค์ฒฉ ํด๋์ค์ ๊ณตํต์ ์ ํ๋์ฉ ๊ฐ์ง๊ณ ์๋ค.
- ๋ฉค๋ฒ ํด๋์ค์ฒ๋ผ ์ด๋ฆ์ด ์๊ณ , ๋ฐ๋ณตํด์ ์ฌ์ฉํ ์ ์๋ค.
- ์ต๋ช ํด๋์ค์ฒ๋ผ ๋น์ ์ ๋ฌธ๋งฅ์์ ์ฌ์ฉ๋ ๋๋ง ๋ฐ๊นฅ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๊ณ , ์ ์ ๋ฉค๋ฒ๋ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ๊ฐ๋ ์ฑ์ ์ํด ์งง๊ฒ ์์ฑํด์ผ ํ๋ค.
์ํฉ์ ๋ฐ๋ผ ์ฌ์ฉํ ์ค์ฒฉ ํด๋์ค ์ ํํ๊ธฐ
ยท ๋ฉ์๋ ๋ฐ์์๋ ์ฌ์ฉํด์ผ ํ๊ฑฐ๋ ๋ฉ์๋ ์์ ์ ์ํ๊ธฐ์ ๋๋ฌด ๊ธธ๋ค๋ฉด ๋ฉค๋ฒ ํด๋์ค๋ก ๋ง๋ ๋ค.
ยท ๋ฉค๋ฒ ํด๋์ค์ ์ธ์คํด์ค ๊ฐ๊ฐ์ด ๋ฐ๊ฐ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ค๋ฉด ๋น์ ์ ์ผ๋ก, ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ ์ผ๋ก ๋ง๋ ๋ค.
ยท ์ค์ฒฉ ํด๋์ค๊ฐ ํ ๋ฉ์๋ ์์์๋ง ์ฐ์ด๋ฉด์ ๊ทธ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์ง์ ์ด ๋จ ํ ๊ณณ์ด๊ณ ํด๋น ํ์ ์ผ๋ก ์ฐ๊ธฐ์ ์ ํฉํ ํด๋์ค๊ฐ ์ธ์คํด์ค๊ฐ ์ด๋ฏธ ์๋ค๋ฉด ์ต๋ช ์ต๋ช ํด๋์ค๋ก, ๊ทธ๋ ์ง ์์ผ๋ฉด ์ง์ญ ํด๋์ค๋ก ๋ง๋ ๋ค.
์์ดํ
25. ํฑ๋ ๋ฒจ ํด๋์ค๋ ํ ํ์ผ์ ํ๋๋ง ๋ด์ผ๋ผ
ยท ์์ค ํ์ผ ํ๋์ ํฑ๋ ๋ฒจ ํด๋์ค๋ฅผ ์ฌ๋ฌ ๊ฐ ์ ์ธํด๋ ์๋ฐ ์ปดํ์ผ๋ฌ๋ ๋ถํํ์ง ์๋๋ค. ํ์ง๋ง ์๋ฌด๋ฐ ๋์ด ์๊ณ , ์ฌ๊ฐํ ์ํ์ ๊ฐ์ํด์ผ ํ๋ ํ์๋ค.
- ํ ํด๋์ค๋ฅผ ์ฌ๋ฌ ๊ฐ์ง๋ก ์ ์ํ ์ ์์ผ๋ฉฐ, ๊ทธ์ค ์ด๋ ๊ฒ์ ์ฌ์ฉํ ์ง๋ ์ด๋ ์์ค ํ์ผ์ ๋จผ์ ์ปดํ์ผํ๋๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
ํ๋์ ์์ค ํ์ผ์ ๋ ๊ฐ์ ํฑ๋ ๋ฒจ ํด๋์ค๊ฐ ์ ์๋ ์์
๋ค๋ฅธ ํฑ๋ ๋ฒจ ํด๋์ค 2๊ฐ(Utensil, Dssert)๋ฅผ ์ฐธ์กฐํ๋ Main ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์.
public class Main {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Dessert.NAME);
}
}Utensil๊ณผ Dessert ํด๋์ค๋ Utensil.java๋ผ๋ ํ ํ์ผ์ ์ ์๋์ด ์๋ค๊ณ ๊ฐ์ ํ์.
class Utensil {
static final String NAME = "pan";
}
class Dessert {
static final String NAME = "cake";
}Main์ ์คํํ๋ฉด pancake๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋, ์ฐ์ฐํ ๋๊ฐ์ ๋ ํด๋์ค๋ฅผ ๋ด์ Dessert.java๋ผ๋ ํ์ผ์ ๋ง๋ค์๋ค๊ณ ๊ฐ์ ํ์.
class Utensil {
static final String NAME = "pot";
}
class Dessert {
static final String NAME = "pie";
}์ด ์ข๊ฒ javac Main.java Desert.java ๋ช ๋ น์ผ๋ก ์ปดํ์ผํ๋ค๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋๊ณ , Utensil๊ณผ Dessert ํด๋์ค๋ฅผ ์ค๋ณต ์ ์ํ๋ค๊ณ ์๋ ค์ค ๊ฒ์ด๋ค.
์ปดํ์ผ๋ฌ๋ ๊ฐ์ฅ ๋จผ์ Main.java๋ฅผ ์ปดํ์ผํ๊ณ , ๊ทธ ์์์ Utensil ์ฐธ์กฐ๋ฅผ ๋ง๋๋ฉด Utensil.java ํ์ผ์ ์ดํด Utensil๊ณผ Dessert๋ฅผ ๋ชจ๋ ์ฐพ์๋ผ ๊ฒ์ด๋ค. ๊ทธ๋ฐ ๋ค์ ์ปดํ์ผ๋ฌ๊ฐ ๋ ๋ฒ์งธ ๋ช ๋ น์ค ์ธ์๋ก ๋์ด์จ Dessert.java๋ฅผ ์ฒ๋ฆฌํณ๋ ค ํ ๋ ๊ฐ์ ํด๋์ค์ ์ ์๊ฐ ์ด๋ฏธ ์์์ ์๊ฒ ๋๋ค.
ํํธ, javac Main.java๋ javac Main.java Utensil.java ๋ช ๋ น์ผ๋ก ์ปดํ์ผํ๋ฉด Dessert.java ํ์ผ์ ์์ฑํ๊ธฐ ์ ์ฒ๋ผ pancake๋ฅผ ์ถ๋ ฅํ๋ค. ๊ทธ๋ฌ๋ javac Dessert.java Main.java ๋ช ๋ น์ผ๋ก ์ปดํ์ผํ๋ฉด potpie๋ฅผ ์ถ๋ ฅํ๋ค.
* ์ด ์ฒ๋ผ ์ปดํ์ผ๋ฌ์ ์ด๋ ์์ค ํ์ผ์ ๋จผ์ ๊ฑด๋ค๋๋์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง๋ฏ๋ก, ๋ฐ๋์ ๋ฐ๋ก ์ก์์ผํ ๋ฌธ์ ๋ค.
ํด๊ฒฐ์ฑ 1
ยท ํฑ๋ ๋ฒจ ํด๋์ค๋ค์ ์๋ก ๋ค๋ฅธ ์์ค ํ์ผ๋ก ๋ถ๋ฆฌํ๋ค.
ํด๊ฒฐ์ฑ 2
ยท ํฑ๋ ๋ฒจ ํด๋์ค๋ฅผ ํ ํ์ผ์ ๋ด๊ณ ์ถ๋ค๋ฉด, ์ ์ ๋ฉค๋ฒ ํด๋์ค(์์ดํ 24)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ๋ค.
- ๋ค๋ฅธ ํด๋์ค์ ๋ธ๋ฆฐ ๋ถ์ฐจ์ ์ธ ํด๋์ค๋ผ๋ฉด ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ก ๋ง๋๋ ์ชฝ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ซ๋ค.
- ์ฝ๊ธฐ ์ข๊ณ , private์ผ๋ก ์ ์ธํ๋ฉด(์์ดํ 15) ์ ๊ทผ ๋ฒ์๋ ์ต์๋ก ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
public class Test {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Dessert.NAME);
}
private static class Utensil {
static final String NAME = "pan";
}
private static class Dessert {
static final String NAME = "cake";
}
}Last updated