10.1 ๊ธฐ๋ณธํ๊ณผ ์ฐธ์กฐํ์ ๊ฐ ์ ๋ฌํ๊ธฐ
10.1.1 ๊ธฐ๋ณธํ๊ณผ ์ฐธ์กฐํ์ ๊ฐ ์ ๋ฌ ๋ฐฉ๋ฒ
๊ธฐ๋ณธํ์ผ๋ก ๊ฐ์ ์ ๋ฌํ๋ ๊ฒฝ์ฐ์๋ ์์ ์์์ ๊ฐ์ ๋ณ๊ฒฝํด๋ ํธ์ถ์์ ์ํฅ์ ์ฃผ์ง ๋ชปํ๋ค.
ํ์ง๋ง ์ฐธ์กฐํ์ ๊ฐ ์ ๋ฌ์ ํ๋ฉด ์์ ์ ์์์ ๋ณ๊ฒฝ๋ ๊ฐ์ด ํธ์ถ์ ๋ฐ์๋๋ค.
"์ฐธ์กฐํ"์ ๊ฒฝ์ฐ๋ ๊ฐ์ฒด ์์ฒด์ ๊ฐ์ ๋ณต์ฌํด์ ๋๊ธฐ๋ ๊ฒ์ด ์๋ '์ฐธ์กฐ'๋ฅผ ๋ํ๋ด๋ ๊ฐ์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ํธ์ถ๋ ๋ฉ์๋์ ๋ณ๊ฒฝ ์ฌํญ์ด ํธ์ถ์์๊ฒ ๋ฐ์๋๋ค.
๋ฐ๋ผ์, ์ธ์์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ์ ๋๋ ๋ฉ์๋ ์์์ ๊ฐ์ด ๋ณํ๋์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ๋ช ํํ ํด์ผ๋ง ํ๋ค.
์ฑ ์ ์ ์๋ ์ด๋ฅผ ์ํด ๊ท์น์ ์ ํด๋์๋ค.
- ์์น์ ์ผ๋ก ์ธ์ ๊ฐ์ฒด์ ์์ ์ ํผํ๋ค.
- ๋ฐํ๊ฐ์ด void์ธ ๊ฒฝ์ฐ ์ธ์๊ฐ์ฒด๋ฅผ ์์ ํด๋ ์ข๋ค.
- ๋ฐํ๊ฐ์ด void ์ด์ธ์ ๊ฒฝ์ฐ ์ธ์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํด์๋ ์๋๋ค.
๋ฐํ๊ฐ์ด ๋ฐ๋ก ์กด์ฌํ๋ฉด ์ธ์๋ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ์์ํ๊ธฐ ์ด๋ ต๋ค.
๋ํ ํธ์ถ์ ์ํฅ์ ๋ฏธ์น๋์ง ์ฌ๋ถ๋ฅผ Javadoc ์ฃผ์ ๋ฑ์์ ๋ช ์ํ๋ ๊ฒ์ด ์ข๋ค.
10.1.2 ์กฐ์ํด๋ ๊ฐ์ด ๋ณํ์ง ์๋ ๋ถ๋ณ ๊ฐ์ฒด ํด๋์ค
'์์น์ ์ผ๋ก ์ธ์ ๊ฐ์ฒด์ ์์ ์ ํผํ๋ค' ์ด๋ฐ ๊ท์น์ ์ ํ๊ธฐ ๋ณด๋ค ์์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋๋ก ํ ๊ฒ์ ๋ถ๋ณ ๊ฐ์ฒด ํด๋์ค๋ผ๊ณ ํ๋ค.
๋ถ๋ณ ๊ฐ์ฒด ํด๋์ค๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ "Immutable Object"๋ผ๊ณ ํ๋ค. ex) Integer, String, Date and Time API ํด๋์ค
์๋ ์ฝ๋๋ ๊ธฐ์กด string์ ๋ฌธ์์ด์ ์ถ๊ฐํ๋ ์ฝ๋์ด๋ค.
String text1 = "THIS IS STRING";
System.out.println("Before Hashcode : " + text1.hashCode());
text1 = text1 + " PLUS VALUE";
System.out.println("After Hashcode : " +text1.hashCode());
์ถ๋ ฅ๊ฐ
Before Hashcode : 1464937669
After Hashcode : -404159098
๋๊ฐ์ ๋ณ์๊ฐ text1์ด์ง๋ง hashcode๊ฐ์ด ๋ค๋ฅธ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด ์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ถ๋ณ๊ฐ์ฒดํด๋์ค๋ ๋ชจ๋ ๋ฉ์๋์์ ๊ฐ์ฒด ์์ ์ ๊ฐ์ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ์กฐ์ํ ๊ฒฐ๊ณผ๋ ๋ฉ์๋์ ๋ฐํ๊ฐ์ผ๋ก ๋ฐํํ๊ณ ์๋ค.
10.1.3 ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ ํด๋์ค
StringBuilder, AtomicInteger ํด๋์ค๋ append() ๋ฉ์๋, incrementAndGet() ๋ฉ์๋ ๋ฑ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ฉ์๋๊ฐ 'ํ๋๋ผ๋' ์กด์ฌํ๋ฏ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ ํด๋์ค์ด๋ค.
๋ณ๊ฒฝ ๊ฐ๋ฅ ํด๋์ค์ ์ฅ์ ๊ณผ ๋จ์
์ผ๋จ ๋ถ๋ณ ํด๋์ค๋ ์๋ํ์ง ์์ ๋ณ๊ฒฝ์ ์ํ ๋ฒ๊ทธ๊ฐ ์๋ค๋ ์ฅ์ ์ด ์๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ์ฑ์ด ์๋ค.
๊ทธ๋ฌ๋ ๋ถ๋ณ ๊ฐ์ฒด ํด๋์ค๋ ๋ณ๊ฒฝ์ด ํ์ํ ๋ ๋๋์ผ๋ก ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฏ๋ก ๋งค์ฐ ๋นํจ์จ์ ์ด๋ค.
์ด๋ฌํ ๋นํจ์จ์ ์ธ ๋จ์ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ํด๋์ค๊ฐ ๊ทน๋ณตํ ์ ์๋ค.
10.2 ๊ฐ์์ฑ์ ์ ์ ํ ์ค์ ํ์ฌ ๋ฒ๊ทธ๊ฐ ์ ์ ํ๋ก๊ทธ๋จ ๋ง๋ค๊ธฐ
public -> ๋ชจ๋ ํด๋์ค
protected -> ์๋ธ ํด๋์ค ๋ฐ ๋์ผ ํจํค์ง์ ํด๋์ค
package private (์ง์ ์์) -> ๋์ผ ํจํค์ง์ ํด๋์ค๋ก๋ถํฐ ์ด์ฉ ๊ฐ๋ฅ
private -> ์์ ์ ํด๋์ค๋ง ์ด์ฉ ๊ฐ๋ฅ
ํด๋์ค์๋ ์ด๋ฌํ '๊ฐ์์ฑ'์ด ๋์ผํ๊ฒ ์ ์ฉ๋จ์ ๊ธฐ์ตํ์. private class๋ผ๋ฉด public๋ฉ์๋์ฌ๋ ๋ค๋ฅธ ํจํค์ง์์ ์ ๊ทผ ๋ถ๊ฐํ๋ค.
10.2.2 ๊ฐ์์ฑ์ด ์ข์ ์ฌ๋ก
๊ฐ์์ฑ์ด ๋์ผ๋ฉด ๋ค๋ฅธ ํด๋์ค์์ ์ ๊ทผํ๊ธฐ๊ฐ ์ฝ๋ค...์ด๋ ์๊ฐ์ง ๋ชปํ ํด๋์ค์์ ํธ์ถ๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
๋ฐ๋ผ์, ๊ฐ์์ฑ์ ์ ์ ํ๊ฒ ์ค์ ํด์ผ๋ง ํ๋ค.
์์น์ ์ผ๋ก ๊ฐ์ฅ ๋ฒ์๊ฐ ์ข์ ๊ฐ์์ฑ์ผ๋ก ํ๋ค.
public์ ๋ค๋ฅธ ํด๋์ค์์ ์ง์ ๋ณ์์ ๊ฐ์ ์ ๊ทผํ๊ณ ๋ณ๊ฒฝํ ์ ์๊ฒ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋๋ค.
-> ํด๋์ค์์ ์ ์ธํ๋ ํ๋๋ private์ผ๋ก ํ๋ค.
-> ์ธ๋ถ์์ ์ก์ธ์คํ๋ ๋ฉ์๋์๋ง public์ผ๋ก ํ๋ค.
ํ์ฅ์ฑ์ ๋์ด๊ธฐ ์ํด protected๋ก ํ๋ค.
private์ ์ฌ์ฉํ๋ฉด ๊ฐ์์ฑ์ ์ขํ ์ ์์ง๋ง ํ์ฅ์ฑ๋ ๋ฎ์์ง๊ฒ ๋๋ค.
์์ ๋ฑ์ ํตํด ํ์ฅํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ protected๋ก ํ์ฌ ํ์ฅ์ฑ์ ๋์ฌ ๋๋๋ก ํ๋ค.
protected๋ ๊ฐ์์ฑ์ด ๋์ง ์์ ์๋ํ์ง ์์ ๊ณณ์์ ๋ณ๊ฒฝ๋๋ ์ํ์ด ์ ์ผ๋ ๋ฏธ๋๋ฅผ ์ํ ํ์ฅ์ฑ์ ํ๋ณดํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
ํ ์คํธ ์ฉ์ด์ฑ์ ๋์ด๊ธฐ ์ํด protected ํ๊ธฐ
ํ๋๋ ๋ฉ์๋๋ฅผ private์ด ์๋ protected ๋๋ package private์ผ๋ก ์ฌ์ฉํ๋ฉด ํ ์คํธ ์ฝ๋์์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ค.
์ด๋ ๊ฒ ํ๋ฉด ํ ์คํธ ์ ํ์ํ ๊ฐ์ฒด๋ฅผ ๋ชจ์ ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํ๊ฑฐ๋ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ฉ์ดํด์ง๋ค. (๊ฐ์ ํจํค์ง ๋๋ ์์์์ ์ ๊ทผ)
protected๋ ์ด๋ฌํ ํ ์คํธ์ ํธ๋ฆฌํจ์ด ์๋ค.
10.3 ๊ฐ์ฒด์ ๋ผ์ดํ ์ฌ์ดํด ํ์ ํ๊ธฐ
๋ก์ปฌ ๋ณ์, ์ธ์คํด์ค ๋ณ์, ํด๋์ค ๋ณ์ ์ธ ๊ฐ์ง ๋ผ์ดํ ์ฌ์ดํด์ด ์๋ค.
๋ผ์ดํ ์ฌ์ดํด์ด ๊ธธ๋ฉด(ํด๋์ค ๋ณ์) ์๋ํ์ง ์๊ฒ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์ปค์ง๋ค. ๋ฐ๋ผ์ ๋ผ์ดํ ์ฌ์ดํด์ ์งง๊ฒ ํ๋ ๊ฒ์ด ์์ ํ๋ค.
๋ผ์ดํ ์ฌ์ดํด์ ๊ธธ๊ฒํ๋ฉด ์ฑ๋ฅ์ ๋์ผ ์ ์๋ค. ์๋กญ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค..
10.4 ์ธํฐํ์ด์ค์ ์ถ์ ํด๋์ค๋ฅผ ํ์ฉํ์ฌ ์ค๊ณํ๊ธฐ
10.4.1 ๋คํ์ฑ์ ์คํํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ
์๋ฐ์ ๊ฐ์ฒด์งํฅ์ ์ธ ํน์ง์ ํ์ ํ๊ธฐ ์ํด์ '์ธํฐํ์ด์ค'์ '์ถ์ ํด๋์ค'๋ผ๋ ๋ ๊ฐ์ง ๊ฐ๋ ๋ฐ ๊ธฐ๋ฅ์ ์ดํด๊ฐ ํ์์ ์ด๋ค.
์ด๋ค์ ์ ํํ ์ดํดํจ์ผ๋ก์จ ์ข์ ํด๋์ค์ ์ข์ API๋ฅผ ์ค๊ณํ ์ ์๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๊ตฌํ์ฒด๊ฐ ArrayList์ด๋ LinkedList์ด๋ ์ ๊ฒฝ ์ฐ์ง ์๊ณ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. ํ๋ก๊ทธ๋๋จธ๋ ๊ทธ๋ฅ ์ฌ์ฉ๋ง ํ๋ฉด ๋๊ณ ๋ด๋ถ ์ฒ๋ฆฌ๋ฅผ ์ ํ์๊ฐ ์๋ค. (๋ชฐ๋ผ์ผ ํ๋ค)
10.4.2 ์ธํฐํ์ด์ค์ ์ถ์ ํด๋์ค
์ธํฐํ์ด์ค -> ์ธ์คํด์ค ๋ณ์๋ฅผ ๊ฐ์ง ์ ์๋ค. ์์๋ฅผ ๊ฐ์ง ์ ์๋ค.
์ถ์ ํด๋์ค -> abstract ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๋ค. (ํ๋๋ผ๋ ์์ผ๋ฉด ์ถ์ ํด๋์ค) // ์์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค. // ๊ทธ ์ธ๋ ํด๋์ค์ ๋์ผ
์ธํฐํ์ด์ค
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์์ ์ธํฐํ์ด์ค์์ ์ ์ํ ๋ฉ์๋ ์ด์ธ์ public ๋ฉ์๋๋ฅผ ์ ์ํ๋ค๊ณ ํด๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ถ์์ ํธ์ถํ๋ ๊ฒ์ ๋ง์ ์ ์๋ค (๋จ, ํ์ ์ ๋ช ํํ๊ฒ ํ์ง ์๋ ๊ฒฝ์ฐ)
์ธํฐํ์ด์ค๋ "์์"๋ฅผ ๊ฐ์ง ์ ์๋ค. ์์๋ง์ ๊ฐ์ง๋ ์ธํฐํ์ด์ค๋ฅผ ์์ ์ธํฐํ์ด์ค๋ผ๊ณ ํ๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๋ฐ๋์งํ์ง ์๋ค.
์ผ๋จ ์ธํฐํ์ด์ค์ ๋ณธ๋ ๋ชฉ์ ์์ ๋ฒ์ด๋๋ค. ๋ํ ์ด์ฉํ์ง ์๋ ์์๋ ๊ตฌํ ํด๋์ค๊ฐ ๊ฐ์ง๊ฒ ๋๋ค.
์์๋ฅผ ๊ณต์ ํ๋ ๊ฒฝ์ฐ์๋ '์์ ํด๋์ค' ๋ 'enum ํด๋์ค'๋ฅผ ์ฌ์ฉํ์.
์ถ์ ํด๋์ค
์ถ์ ํด๋์ค๋ ํด๋์ค๋ฅผ ์ถ์ํํ ๊ฒ์ด๋ค.
์ฌ๋ฌ ํด๋์ค์์ ๋์ผํ ๋ถ๋ถ(๊ณตํต ๋ถ๋ถ)์ ์ํผ ํด๋์ค๋ก ์๋ผ ๋ด์ด ์ถ์ํํด, ๊ณตํตํํ ๊ฒ์ด๋ค.
์ค์ ๊ณ ๋ ค
- ์ธํฐํ์ด์ค๋ '์ ์'์ ์ฌ์ฉ
- ์ถ์ ํด๋์ค๋ '๋ผ๋' ๋ '๊ณตํต ์ฒ๋ฆฌ'์ ์ฌ์ฉ
'๋คํธ์ํฌ๋ฅผ ํตํด ์๋น์ค๋ฅผ ํธ์ถํ๋ ๊ธฐ๋ฅ'์ ๊ตฌํํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์๋น์ค๋ฅผ ํธ์ถํ๋ ๋ก์ง์ด ํต์ ๋ฐฉ์์ ์์กดํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์ชฝ์์ ํต์ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ์ ํ๋๋ก ํ๋ฉด ๋คํธ์ํฌ ํต์ ๋ฐฉ์์ด HTTP์ธ์ง SOAP์ธ์ง, ๋ค๋ฅธ ๋ฐฉ๋ฒ์ธ์ง ์ ๊ฒฝ ์ธ ํ์๊ฐ ์๋ค. ๊ทธ๋ฅ ์๋น์ค๋ฅผ ์ด์ฉํ ๋ '๋ฌด์์ ๊ฑด๋ค๋ฉด ๋ฌด์์ ๋ฐํ๋๋์ง'์ ๋ํ "์ ์"๋ง ์๋ฉด ๋๋ค.
์ด๊ฒ์ ์ถ์ ํด๋์ค๋ก ํ๋ฉด ๊ตฌํ์ด ํฌํจ๋์ด ์ข ์์ฑ์ด ๊ฐํด์ง๊ธฐ ๋๋ฌธ์ ๋์ค์ ์์ ์ด ํ๋ค์ด์ง๋ค. (๊ฐ๊ฐ์ ๋ชฉ์ ์ ๋ง๊ฒ ์ฐ๋ ๊ฒ์ด ์ค์ํ๋ค)
์ธํฐํ์ด์ค๋ฅผ ์๊ณ ์์ผ๋ฉด ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํ ํด๋์ค๋ฅผ ๋ฐ๊ฟ์ผ๋ก์จ ๊ฐ๋จํ๊ฒ ๊ต์ฒดํ ์ ์์ผ๋ฉฐ ๋์ค์ ์ฒ๋ฆฌ๋ฅผ ์ ๊ฒฝ์ฐ์ง์๊ณ ๋ค๋ฅธ ๊ตฌํ์ ์ง์คํ ์ ์๊ฒ๋๋ค.
์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค์ ๊ณตํต ์ฒ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ถ๋ค๋ฉด..
์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค ์ฌ์ด์ ์ถ์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ๊ฐ ๊ตฌํ ํด๋์ค์์ ์ฌ์ฉํ ์ ์๋ค.
(์ธํฐํ์ด์ค - ์ถ์ ํด๋์ค(๊ณตํต ์ฒ๋ฆฌ) - ๊ตฌํ ํด๋์ค)
๊ทธ๋ ๋ค๋ฉด ๊ทธ๋ฅ ์ธํฐํ์ด์ค๋ฅผ ์ถ์ํด๋์ค๋ก ๋ฐ๊พธ๋ฉด ๋์ง ์์๊น..?
์ด๊ฒ์ ๋์ ํจํด์ด๋ค. ์ธํฐํ์ด์ค๋ฅผ ์ถ์ ํด๋์ค๋ก ๋ง๋ฆ์ผ๋ก์จ ํด๋์ค ๊ฐ์ ์์กด๊ด๊ณ๊ฐ ๊ฐํด์ ธ๋ฒ๋ ค ๋์ค์ ์ฒ๋ฆฌ์ ๋ณ๊ฒฝ์ด ์ด๋ ค์์ง๋ค. (๋ฐ๋ก ๋ฐ์ ๋์ค๋ ํ ์คํธ๊ฐ ๊ทธ ์์์ด๋ค)
์ธํฐํ์ด์ค์ ์์ ๊ฐ
์ถ์ ํด๋์ค ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ ์ ์ ํ ์คํธ ์ฝ๋๋ฅผ ๊ตฌํํ๋ ๊ฒฝ์ฐ์ ๋ํ๋๋ค.
public class AService {
protected BService bService;
public void someMethod() {
service.excute();
...
}
}
ํ ์คํธ ์ service.execute() ์์์ ๋ค๋ฅธ ์์คํ ์ ์ก์ธ์คํ๊ณ ์์ด ๊ทธ๋๋ก ํ ์คํธํ ์ ์๋ ๊ฒฝ์ฐ ํธ์ถ๋ ๋ถ๋ถ์ '๋ชจ์ ๊ฐ์ฒด'๋ก ๋ง๋ค๊ฒ ๋๋ค.
์ด ๋ ๋ง์ฝ service ๊ฐ์ฒด์ ํ์ ์ด ์ธํฐํ์ด์ค๋ผ๋ฉด ํธ์ถ๋ ๋ถ๋ถ(๊ตฌํ ๋ถ๋ถ)์ด ๋ฌด์์ ํ๊ณ ์๋ ํธ์ถํ๋ ์ชฝ์๋ ์๋ฌด๋ฐ ์ํฅ์ด ์๊ธฐ ๋๋ฌธ์ ํธ์ถ๋ ๋ถ๋ถ์ ์ฒ๋ฆฌ์ ๋ํด์๋ ์ ๊ฒฝ ์ฐ์ง์๊ณ '๋ชจ์ ๊ฐ์ฒด'๋ก ๋ง๋ค์ด ๋ฒ๋ฆด ์ ์๋ค.
๊ทธ๋ฌ๋ service ๊ฐ์ฒด๊ฐ ์ถ์ ํด๋์ค์ธ ๊ฒฝ์ฐ ๊ทธ ์ถ์ ํด๋์ค๋ ๊ตฌํ์ด ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์(ํด๋์ค ๊ฐ ์์กด๊ด๊ณ๊ฐ ๊ฐํด์ง) ์ ์ฒด๋ฅผ ๋ชจ์ ๊ฐ์ฒดํ ํ ์ ์๋ค. (ํ์ํ ์ฒ๋ฆฌ๋ฅผ ์ง์ ๋ฒ๋ฆด ๊ฐ๋ฅ์ฑ์ด ์๋ค)
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํ ์คํธ๋ฅผ ํฌํจํ์ฌ ์ฝ๋ฉ ์์ ์์ ๊ฐ์ ์ ์งํ ์ ์๋ค.
10.4.3 ์ธํฐํ์ด์ค์ ๋ํดํธ ๊ตฌํ
๋ํดํธ ๋ฉ์๋์ ์ถ๊ฐ๋ก ๊ณตํต ๋ถ๋ถ์ ์ธํฐํ์ด์ค์์ ๊ตฌํํ ์ ์์ผ๋ ์ถ์ ํด๋์ค์ ์ฐจ์ด๊ฐ ์์ด์ง ๊ฒ์ธ๊ฐ..?
์ฌ์ค ๋ํดํธ ๊ตฌํ์ ์ถ๊ฐ๋ ๊ทธ ๋ฐฐ๊ฒฝ๊ณผ ๋ชฉ์ ์ด ์์ ํ ๋ค๋ฅด๋ค
์๋ฐ 8์์ Stream API ์ถ๊ฐ๋ก ์ธํด ๊ธฐ์กด์ ์ธํฐํ์ด์ค(java.util.List ๋ฑ) ์ ๋ฉ์๋ ์ถ๊ฐ๊ฐ ๋ถ๊ฐํผํด์ก๋ค. ํ์ง๋ง ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ฉด ๊ตฌํ ํด๋์ค์ ์ํฅ์ ๋ฏธ์น๊ฒ ๋๋ค. ์ฆ, ์๋ฐ 7๊น์ง์ ํ์ ํธํ์ฑ์ ์์ด ๋ฒ๋ฆฌ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ํธํ์ฑ์ ์๋ ๊ฒ์ ํผํ๊ธฐ ์ํด List ์ธํฐํ์ด์ค์ ๋ํดํธ ๊ตฌํ์ผ๋ก ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ฒ ๋์๋ค.
์ฆ, ์ธํฐํ์ด์ค์ ๋ํดํธ ๊ตฌํ์ ์๋ฐ์ '์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ'์ ์ํด ํ์ํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ๊ณตํต ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ๋ณด๋จ ์๋ฐ 7 ์ด์ ์ฒ๋ผ ์ถ์ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ์๊ธฐ ์ฌ์ธ ๊ฒ์ด๋ค. (์ ์์ ์๊ฐ)
10.4.4 ์ธํฐํ์ด์ค์ static ๋ฉ์๋
์๋ฐ 8 ๋ถํฐ๋ ์ธํฐํ์ด์ค๊ฐ ๋ฉ์๋์ ๊ตฌํ์ ์ง๋ ์ ์์ผ๋ฏ๋ก static ๋ฉ์๋๋ ์ ์ํ ์ ์๋ค.
// ์ธํฐํ์ด์ค
public interface Bar {
String say();
static Bar newInstance(String message) {
return new DefaultBar(message);
}
}
// ๊ตฌํ ํด๋์ค
class DefaultBar implements Bar {
private String message;
DefaultBar(String message) {
this.message = message;
}
@Override
public String say() {
return this.message;
}
}
์ธํฐํ์ด์ค์ static ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์ฌ์ฉํด๋ณด์.
Bar bar = Bar.newInstance("Hello Bar!");
System.out.println(bar.say());
static ๋ฉ์๋๋ฅผ ์ฌ์ฉํจ ์ ์๊ฒ ๋จ์ผ๋ก์จ ์ธํฐํ์ด์ค ์ค์ค๋ก ๊ตฌํํ๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ 'ํฉํ ๋ฆฌ ๋ฉ์๋'(newInstance)๋ฅผ ์ ์ํ ์ ์๊ฒ ๋์๋ค.
ํฉํ ๋ฆฌ ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ๋งํ๋ค. (ํฉํ ๋ฆฌ ํด๋์ค๋ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ๋ปํ๋ค.)
๋ฐํ๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก '์ธํฐํ์ด์ค ๋๋ ์ถ์ํด๋์ค'๋ก ํ์ ์ด๋ ํ ๊ฐ์ฒด๊ฐ ๋ฐํ๋์๋์ง ๋ชจ๋ฅด๊ฒ ํด์ ์ฒ๋ฆฌ์ ๊ณตํตํ ๋ฐ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ ์๋ค.
** ์ข ๋ ๊น๊ฒ ์๊ฐํด๋ณด์ **
์ธํฐํ์ด์ค๋ public ๋ฉ์๋๋ฅผ ์ ์ํ๋ ๊ฒ์ผ๋ก ํจํค์ง๋ฅผ ๋์ด์ ์ด๋์์๋ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ๋ฉ์๋๋ฅผ ๊ณต๊ฐํ๋ ๊ฒ์ด๋ค. ์ฐ๋ฆฌ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ตฌํ ํด๋์ค์ ์ฒ๋ฆฌ๋ฅผ ์ ํ์๊ฐ ์๋ค.
ํ์ง๋ง... ๋ชจ์์ ์ผ๋ก ์ธํฐํ์ด์ค์ ๋ํ ๊ตฌํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด์ ๊ตฌํ ํด๋์ค๋ฅผ public์ผ๋ก ํ๊ณ ์ฝ๋์์์๋ ์ค๋ฅธ์ชฝ ์ ๊ตฌํ ํด๋์ค๋ฅผ ๊ธฐ์ ํด์ผ๋ง ํ๋ค...
Foo foo = new DefaultFoo("Hello Foo!");
์์ ์ฝ๋์ฒ๋ผ ๊ตฌํ ํด๋์ค๊ฐ ๋๋ฌ๋๊ฒ ๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ๋๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด์๋ง ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ๊ตฌํ ํด๋์ค์ ์ก์ธ์คํ ํ์๊ฐ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ตฌํ ํด๋์ค ์ชฝ๋ ์ ์ฒด ํด๋์ค๋ฅผ public์ผ๋ก ์ด์ด๋ ํ์ ๋ํ ์์ด์ง๋ค.
์๋ฐ 8์์ static ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์๊ฒ ๋๋ฉด์ ๊ตฌํ ํด๋์ค์ธ DefaultFoo ํด๋์ค๋ฅผ ๋์ฑ ์๋ฒฝํ๊ฒ '์ํ'ํ ์ ์๊ฒ ๋์๋ค.
์ด๋ฅผ ํตํด ์ธํฐํ์ด์ค๋ง์ผ๋ก ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ์ ๊ทผ ์ ํ์์ ์ํ ๊ฐ์์ฑ์ ์ ์๋ ์๋ฏธ๊ฐ ์๊ฒ ๋๋ค.
// ์ธํฐํ์ด์ค
public interface Bar {
String say();
static Bar newInstance(String message) {
return new DefaultBar(message);
}
}
// ๊ตฌํ ํด๋์ค
class DefaultBar implements Bar { // package private class
private String message;
DefaultBar(String message) {
this.message = message;
}
@Override
public String say() {
return this.message;
}
}
'๐์ฝ์ ์ฑ ์ ๋ฆฌ > ์๋ฐ ๋ง์คํฐ๋ถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฐ ๋ง์คํฐ๋ถ] 12์ฅ : ๋์์ธํจํด ์ฆ๊ธฐ๊ธฐ - ๊ตฌ์กฐ (0) | 2021.10.02 |
---|---|
[์๋ฐ ๋ง์คํฐ๋ถ] 12์ฅ ๋์์ธํจํด ์ฆ๊ธฐ๊ธฐ - ์์ฑ (0) | 2021.09.22 |
[์๋ฐ ๋ง์คํฐ๋ถ] 9์ฅ ๋ ์ง ์ฒ๋ฆฌ ๊ณต๋ตํ๊ธฐ (0) | 2021.09.14 |
[์๋ฐ ๋ง์คํฐ๋ถ] 6์ฅ ์์ธ ๊ณต๋ตํ๊ธฐ (0) | 2021.09.12 |
[์๋ฐ ๋ง์คํฐ๋ถ] 1์ฅ๋ถํฐ 5์ฅ.. ๋๋ค์๊ณผ Stream API๊น์ง. (0) | 2021.09.12 |