๐ ๋ชฉ์ฐจ.
4. ํด๋์ค์ ์ธํฐํ์ด์ค
.์์ดํ 15 - ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผ ๊ถํ์ ์ต์ํํ๋ผ.
.์์ดํ 16 - public ํด๋์ค์์๋ public ํ๋๊ฐ ์๋ ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ผ
.์์ดํ 17 - ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ต์ํํ๋ผ
.์์ดํ 17 - ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ต์ํํ๋ผ
.์์ดํ 18 - ์์๋ณด๋ค๋ ์ปดํฌ์ง์ ์ ์ฌ์ฉํ๋ผ
.์์ดํ 19 - ์์์ ๊ณ ๋ คํด ์ค๊ณํ๊ณ ๋ฌธ์ํํ๋ผ. ๊ทธ๋ฌ์ง ์์๋ค๋ฉด ์์์ ๊ธ์งํ๋ผ
.์์ดํ 20 - ์ถ์ ํด๋์ค๋ณด๋ค๋ ์ธํฐํ์ด์ค๋ฅผ ์ฐ์ ํ๋ผ
.์์ดํ 21 - ์ธํฐํ์ด์ค๋ ๊ตฌํํ๋ ์ชฝ์ ์๊ฐํด ์ค๊ณํ๋ผ
.์์ดํ 22 - ์ธํฐํ์ด์ค๋ ํ์ ์ ์ ์ํ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๋ผ
.์์ดํ 23 - ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ณด๋ค๋ ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ผ
.์์ดํ 24 - ๋ฉค๋ฒ ํด๋์ค๋ ๋๋๋ก static์ผ๋ก ๋ง๋ค๋ผ
.์์ดํ 25 - ํฑ๋ ๋ฒจ ํด๋์ค๋ ํ ํ์ผ์ ํ๋๋ง ๋ด์ผ๋ผ.
โ๏ธ ๋ด์ฉ.
4. ํด๋์ค์ ์ธํฐํ์ด์ค
์ถ์ํ์ ๊ธฐ๋ณธ ๋จ์์ธ ํด๋์ค์ ์ธํฐํ์ด์ค๋ ์๋ฐ ์ธ์ด์ ์ฌ์ฅ๊ณผ๋ ๊ฐ๋ค. ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ์ฐ๊ธฐ ํธํ๊ณ , ๊ฒฌ๊ณ ํ๋ฉฐ, ์ ์ฐํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๋ดํ๋ค.
.์์ดํ 15 - ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผ ๊ถํ์ ์ต์ํํ๋ผ.
์ด์คํ๊ฒ ์ค๊ฒ๋ ์ปดํฌ๋ํธ์ ์ ์ค๊ณ๋ ์ปดํฌ๋ํธ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ ๋ฐ๋ก ํด๋์ค ๋ด๋ถ ๋ฐ์ดํฐ์ ๋ด๋ถ ๊ตฌํ ์ ๋ณด๋ฅผ ์ธ๋ถ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ผ๋ง๋ ์ ์จ๊ฒผ๋๋๋ค. ์ ์ค๊ณ๋ ์ปดํฌ๋ํธ๋ ๋ชจ๋ ๋ด๋ถ ๊ตฌํ์ ์๋ฒฝํ ์จ๊ฒจ, ๊ตฌํ๊ณผ API๋ฅผ ๊น๋ํ ๋ถ๋ฆฌํ๋ค.
์ค์ง API๋ฅผ ํตํด์๋ง ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํตํ๋ฉฐ ์๋ก์ ๋ด๋ถ ๋์ ๋ฐฉ์์๋ ์ ํ ๊ฐ์์น ์๋๋ค. ์ ๋ณด ์๋, ํน์ ์บก์ํ๋ผ๊ณ ํ๋ ์ด ๊ฐ๋ ์ ์ํํธ์จ์ด ์ค๊ณ์ ๊ทผ๊ฐ์ด ๋๋ ์๋ฆฌ๋ค.
์ ๋ณด ์๋์ ์ฅ์
- ์์คํ ๊ฐ๋ฐ ์๋ ํฅ์.
์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ณ๋ ฌ๋ก ๊ฐ๋ฐํ ์ ์๊ธฐ ๋๋ฌธ
- ์์คํ ๊ด๋ฆฌ ๋น์ฉ์ ๋ฎ์ถค
๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋นจ๋ฆฌ ํ์ ํ์ฌ ๋๋ฒ๊น ํ ์ ์๊ณ , ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ๊ต์ฒดํ๋ ๋ถ๋ด๋ ์ ๊ธฐ ๋๋ฌธ
- ์ ๋ณด ์๋ ์์ฒด๊ฐ ์ฑ๋ฅ์ ํฅ์ํด ์ฃผ์ง๋ ์์ง๋ง, ์ต์ ํ์๋ ๋์์ ์ค๋ค.
์์ฑ๋ ์์คํ ์ ํ๋กํ์ผ๋งํด ์ต์ ํํ ์ปดํฌ๋ํธ๋ฅผ ์ ํ ๋ค์(์์ดํ 67), ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํฅ์ ์ฃผ์ง ์ํน ํด๋น ์ปดํฌ๋ํธ๋ง ์ต์ ํํ ์ ์๊ธฐ ๋๋ฌธ
- ์ํํธ์จ์ด ์ฌ์ฌ์ฉ์ฑ์ ๋์ธ๋ค.
์ธ๋ถ์ ์์กดํ์ง ์ํธ ๋ ์์ ์ผ๋ก ๋์ํ ์ ์๋ ์ปดํฌ๋ํธ๋ผ๋ฉด ๊ทธ ์ปดํฌ๋ํธ์ ํจ๊ป ๊ฐ๋ฐ๋์ง ์์ ๋ฏ์ ํ๊ฒฝ์์๋ ์ ์ฉํ๊ฒ ์ฐ์ผ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
- ํฐ ์์คํ ์ ์ ์ํ๋ ๋์ด๋๋ฅผ ๋ฎ์ถฐ์ค๋ค.
์์คํ ์ ์ฒด๊ฐ ์์ง ์์ฑ๋์ง ์์ ์ํ์์๋ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ๋์์ ๊ฒ์ฆํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฐ๋ ์ ๋ณด ์๋์ ์ํ ๋ค์ํ ์ฅ์น๋ฅผ ์ ๊ณตํ๋ค. ๊ทธ์ค ์ ๊ทผ ์ ์ด ๋ฉ์ปค๋์ฆ์ ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉค๋ฒ์ ์ ๊ทผ์ฑ์ ๋ช ์ํ๋ค.
๊ธฐ๋ณธ ์์น์ ๊ฐ๋จํ๋ค. ๋ชจ๋ ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผ์ฑ์ ๊ฐ๋ฅํ ํ ์ขํ์ผ ํ๋ค. ์ฆ, ์ํํธ์จ์ด๊ฐ ์ฌ๋ฐ๋ก ๋์ํ๋ ํ ํญ์ ๊ฐ์ฅ ๋ฎ์ ์ ๊ทผ ์์ค์ ๋ถ์ฌํด์ผ ํ๋ค.
Top ๋ ๋ฒจ(๊ฐ์ฅ ๋ฐ๊นฅ) ํด๋์ค์ ์ธํฐํ์ด์ค์ ๋ถ์ฌํ ์ ์๋ ์ ๊ทผ ์์ค์ package-private์ public ๋ ๊ฐ์ง์ด๋ค. ์ธ๋ถ์์ ์ธ์ด์ ๊ฐ ์๋ค๋ฉด package-private์ผ๋ก ์ ์ธํ์. ๊ทธ๋ฌ๋ฉด ์ด๋ค์ API๊ฐ ์๋ ๋ด๋ถ ๊ตฌํ์ด ๋์ด ์ธ์ ๋ ์์ ํ ์ ์๋ค. ์ฆ, ํด๋ผ์ด์ธํธ์ ์๋ฌด๋ฐ ํผํด ์์ด ๋ค์ ๋ฆด๋ฆฌ์ค์์ ์์ , ๊ต์ฒด, ์ ๊ฑฐํ ์ ์๋ค. ๋ฐ๋ฉด, public์ผ๋ก ์ ์ธํ๋ค๋ฉด API๊ฐ ๋๋ฏ๋ก ํ์ ํธํ์ ์ํด ์์ํ ๊ด๋ฆฌํด์ผ ํ๋ค.
ํ ํด๋์ค์์๋ง ์ฌ์ฉํ๋ package-private Top๋ ๋ฒจ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค ์์ private static์ผ๋ก ์ค์ฒฉ์์ผ๋ณด์(์์ดํ 24), Top ๋ ๋ฒจ๋ก ๋๋ฉด ๊ฐ์ ํจํค์ง์ ๋ชจ๋ ํด๋์ค๊ฐ ์ ๊ทผํ ์ ์์ง๋ง, private static์ผ๋ก ์ค์ฒฉ์ํค๋ฉด ๋ฐ๊นฅ ํด๋์ค ํ๋์์๋ง ์ ๊ทผํ ์ ์๋ค.
ํด๋์ค์ ๊ณต๊ฐ APi๋ฅผ ์ธ์ฌํ ์ค๊ณํ ํ, ๊ทธ ์ธ์ ๋ชจ๋ ๋ฉค๋ฒ๋ private๋ก ๋ง๋ค์. ๊ทธ๋ฐ ๋ค์ ์ค์ง ๊ฐ์ ํจํค์ง์ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ ๊ทผํด์ผ ํ๋ ๋ฉค๋ฒ์ ํํด package-private์ผ๋ก ํ์ด์ฃผ์. ๊ถํ์ ํ์ด์ฃผ๋ ์ผ์ ์์ฃผ ํ๊ฒ ๋๋ค๋ฉด ์ฌ๋ฌ๋ถ ์์คํ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ถํดํด์ผ ํ๋ ๊ฒ์ ์๋์ง ๋ค์ ๊ณ ๋ฏผํด ๋ณด์. prviate์ package-private ๋ฉค๋ฒ๋ ๋ชจ๋ ํด๋น ํด๋์ค์ ๊ตฌํ์ ํด๋นํ๋ฏ๋ก ๋ณดํต์ ๊ณต๊ฐ APi์ ์ํฅ์ ์ฃผ์ง ์๋๋ค. ๋จ, Serializable์ ๊ตฌํํ ํด๋์ค์์๋ private ๊ฐ์ ํ๋๋ค๋ ์๋์น ์๊ฒ ๊ณต๊ฐ API๊ฐ ๋ ์๋ ์๋ค.(์์ดํ 86,87)
public ํด๋์ค์์๋ ๋ฉค๋ฒ์ ์ ๊ทผ ์์ค์ package-private์์ protected๋ก ๋ฐ๊พธ๋ ์๊ฐ ๊ทธ ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์๋ ๋์ ๋ฒ์๊ฐ ์์ฒญ ๋์ด์ง๋ค. public ํด๋์ค์ protected ๋ฉค๋ฒ๋ ๊ณต๊ฐ API๋ก ์์ํ ์ง์๋ผ์ผ ํ๋ค. ๋ํ ๋ด๋ถ ๋์ ๋ฐฉ์์ API ๋ฌธ์์ ์ ์ด ์ฌ์ฉ์์๊ฒ ๊ณต๊ฐํด์ผ ํ ์๋ ์๋ค.(์์ดํ 19) ๋ฐ๋ผ์ protected ๋ฉค๋ฒ์ ์๋ ์ ์์๋ก ์ข๋ค.
์์ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ๋๋ ๊ทธ ์ ๊ทผ ์์ค์ ์์ ํด๋์ค์์๋ณด๋ค ์ข๊ฒ ์ค์ ํ ์ ์๋ค. ์ด ์ ์ฝ์ ์์ ํด๋์ค์ ์ธ์คํด์ค๋ ํ์ ํด๋์ค์ ์ธ์คํด์ค๋ก ๋์ฒดํด ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค๋ ๋ฆฌ์ค์ฝํ ์นํ ์์น์ ์งํค๊ธฐ ์ํด ํ์ํ๋ค.
๋จ์ง ์ฝ๋๋ฅผ ํ ์คํธํ๋ ค๋ ๋ชฉ์ ์ผ๋ก ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉค๋ฒ์ ์ ๊ทผ ๋ฒ์๋ฅผ ๋ํ๋ ค ํ ๋๊ฐ ์๋ค. ์ ๋นํ ์์ค๊น์ง๋ ๋ํ๋ ๊ด์ฐฎ๋ค. ์๋ก, public ํด๋์ค์ private ๋ฉค๋ฒ๋ฅผ package-private๊น์ง ํ์ด์ฃผ๋ ๊ฒ์ ํ์ฉํ ์ ์์ง๋ง, ๊ทธ ์ด์์ ์ ๋๋ค. ์ฆ, ํ ์คํธ๋ง์ ์ํด ํด๋์ค ์ธํฐํ์ด์ค, ๋ฉค๋ฒ๋ฅผ ๊ณต๊ฐ API๋ก ๋ง๋ค์ด์๋ ์ ๋๋ค. ๋คํํ ์ด๋ ๊ฒ ํด์ผ ํ ์ด์ ๋ ์๋ค. ํ ์คํธ ์ฝ๋๋ฅผ ํ ์คํธ ๋์๊ณผ ๊ฐ์ ํจํค์ง์ ๋๋ฉด package-private ์์์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
public ํด๋์ค์ ์ธ์คํด์ค ํ๋๋ ๋๋๋ก public์ด ์๋์ด์ผ ํ๋ค(์์ดํ 16) public ๊ฐ๋ณ ํ๋๋ฅผ ๊ฐ๋ ํด๋์ค๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ ๋ ์ธ์ดํ ํ์ง ์๋ค.
final์ ์ฌ์ฉํ๋ค ํ๋๋ผ๋ ๋ฐฐ์ด ํ๋๋ฅผ ๋๊ฑฐ๋ ์ด ํ๋๋ฅผ ๋ฐํํ๋ ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์๋ ์๋๋ค. ์ ๊ทผ์๋ฅผ ์ ๊ณตํ๋ฉด ๋ด์ฉ์ ์์ ํ ์ ์๊ฒ ๋๋ค.
public static final Thing[] VALUES = {new Thing(), new Thing()};
ํด๊ฒฐ์ฑ ์ ๋ ๊ฐ์ง๋ค.
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ public๋ฐฐ์ด์ private๋ก ๋ง๋ค๊ณ public ๋ถ๋ณ list๋ฅผ ์ถ๊ฐํ๋ค.
public static final List<Thing> VALUES_LIST = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
๋ ๋ฒ์งธ๋ ๋ฐฐ์ด์ private๋ก ๋ง๋ค๊ณ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ public ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด๋ค(๋ฐฉ์ด์ ๋ณต์ฌ)
public static final Thing[] values(){
return PRIVATE_VALUES.clone();
}
ํต์ฌ ์ ๋ฆฌ
ํ๋ก๊ทธ๋จ ์์์ ์ ๊ทผ์ฑ์ ๊ฐ๋ฅํ ํ ์ต์ํ์ผ๋ก ํ๋ผ. ๊ผญ ํ์ํ ๊ฒ๋ง ๊ณจ๋ผ ์ต์ํ์ public API๋ฅผ ์ค๊ณํ์. ๊ทธ ์ธ์๋ ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉค๋ฒ๊ฐ ์๋์น ์๊ฒ APi๋ก ๊ณต๊ฐ๋๋ ์ผ์ด ์๋๋ก ํ๋ค. public ํด๋์ค๋ ์์์ฉ public static final ํ๋ ์ธ์๋ ์ด๋ ํ public ํ๋๋ ๊ฐ์ ธ์๋ ์ ๋๋ค. public static final ํ๋๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ๋ถ๋ณ์ธ์ง ํ์ธํ๋ผ.
.์์ดํ 16 - public ํด๋์ค์์๋ public ํ๋๊ฐ ์๋ ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ผ
ํจํค์ง ๋ฐ๊นฅ์์ ์ ๊ทผํ ์ ์๋ ํด๋์ค๋ผ๋ฉด ์ ๊ทผ์๋ฅผ ์ ๊ณตํ๋ค.
public class Point {
private double x; // ์ ๊ทผ์์ ๋ณ๊ฒฝ์ ๋ฉ์๋๋ฅผ ํ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์บก์ํํ๋ค., public ํด๋์ค๋ ์ ๋ ๊ฐ๋ณ ํ๋๋ฅผ ์ง์ ๋
ธ์ถํด์๋ ์๋๋ค.
private double y; // public X
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 ์ค์ฒฉ ํด๋์ค๋ผ๋ฉด ๋ฐ์ดํฐ ํ๋๋ฅผ ๋ ธ์ถํด๋ ํ๋ฑ ๋ฌธ์ ๊ฐ ์๋ค. ํด๋์ค๊ฐ ํํํ๋ ค๋ ์ถ์ ๊ฐ๋ ๋ง ์ฌ๋ฐ๋ฅด๊ฒ ํํํด ์ฃผ๋ฉด ๋๋ค. ์ด ๋ฐฉ์์ ํด๋์ค ์ ์ธ ๋ฉด์์๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ์ฝ๋ฌ ๋ฉด์์๋ ์ ๊ทผ์ ๋ฐฉ์๋ณด๋ค ํจ์ฌ ๊น๋ํ๋ค.
// package-private class
class PackagePrivateClass {
// ์ด ํ๋๋ ๊ฐ์ ํจํค์ง ๋ด์์ ์ง์ ์ ๊ทผ ๊ฐ๋ฅ
public String packagePrivateField;
}
public class MainClass {
// private nested class
private static class PrivateNestedClass {
// ์ด ํ๋๋ MainClass ๋ด์์ ์ง์ ์ ๊ทผ ๊ฐ๋ฅ
public String privateNestedField;
}
public static void main(String[] args) {
PackagePrivateClass obj1 = new PackagePrivateClass();
obj1.packagePrivateField = "Hello, package-private!"; // ๊ฐ์ ํจํค์ง ๋ด์์ ์ง์ ์ ๊ทผ ๊ฐ๋ฅ
PrivateNestedClass obj2 = new PrivateNestedClass();
obj2.privateNestedField = "Hello, private nested!"; // MainClass ๋ด์์ ์ง์ ์ ๊ทผ ๊ฐ๋ฅ
System.out.println(obj1.packagePrivateField);
System.out.println(obj2.privateNestedField);
}
}
public ํด๋์ค์ ํ๋๊ฐ ๋ถ๋ณ์ด๋ผ๋ฉด ์ง์ ๋ ธ์ถํ ๋์ ๋จ์ ์ด ์กฐ๊ธ์ ์ค์ด๋ค์ง๋ง, ๊ฒฐ์ฝ ์ข์ ์๊ฐ์ด ์๋๋ค. API๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ํํ ๋ฐฉ์์ ๋ฐ๊ฟ ์ ์๊ณ , ํ๋๋ฅผ ์ฝ์ ๋ ๋ถ์ ์์ ์ ์ํํ ์ ์๋ค๋ ๋จ์ ์ ์ฌ์ ํ๋ค. ๋จ, ๋ถ๋ณ์์ ๋ณด์ฅํ ์ ์๊ฒ ๋๋ค. ๋ค์ Time ํด๋์ค๋ ๊ฐ ์ธ์คํด์ค๊ฐ ์ ํจํ ์๊ฐ์ ํํํจ์ ๋ณด์ฅํ๋ค.
public 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){
if(hour < 0 || hour >= HOURS_PER_DAY)
throw new IllegalArgumentException("์๊ฐ: " + hour);
if(minute < 0 || minute >= MINUTES_PER_HOUR)
throw new IllegalArgumentException("๋ถ: " + minute);
this.hour = hour;
this.minute = minute;
}
}
ํต์ฌ ์ ๋ฆฌ
public ํด๋์ค๋ ์ ๋ ๊ฐ๋ณ ํ๋๋ฅผ ์ง์ ๋ ธ์ถํด์๋ ์ ๋๋ค. ๋ถ๋ณ ํ๋๋ผ๋ฉด ๋ ธ์ถํด๋ ๋ ์ํํ์ง๋ง ์์ ํ ์์ฌํ ์๋ ์๋ค. ํ์ง๋ง package-private ํด๋์ค๋ prviate ์ค์ฒฉ ํด๋์ค์์๋ ์ข ์ข ํ๋๋ฅผ ๋ ธ์ถํ๋ ํธ์ด ๋์ ๋๋ ์๋ค.
.์์ดํ 17 - ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ต์ํํ๋ผ
๋ถ๋ณ ํด๋์ค๋ ๊ฐ๋จํ ๋งํด ๊ทธ ์ธ์คํด์ค์ ๋ด๋ถ ๊ฐ์ ์์ ํ ์ ์๋ ํด๋์ค๋ก ์๋ก BigInteger, BigDecimal ๋ฑ์ด ์๋ค.
ํด๋์ค๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋ค์ฏ ๊ฐ์ง ๊ท์น์ ๋ฐ๋ฅด๋ฉด ๋๋ค.
1. ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋(๋ณ๊ฒฝ์)๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
2. ํด๋์ค๋ฅผ ํ์ฅํ ์ ์๋๋ก ํ๋ค.
- ํ์ ํด๋์ค์์ ๋ถ์ฃผ์ํ๊ฒ ํน์ ๋์ ์๋๋ก ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณํ๊ฒ ๋ง๋๋ ์ฌํ๋ฅผ ๋ง์์ค๋ค. ์์์ ๋ง๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ ํด๋์ค๋ฅผ final๋ก ์ ์ธํ๋ ๊ฒ์ด์ง๋ง, ๊ทธ ์ธ ๋ฐฉ๋ฒ๋ ๊ณง ๋์จ๋ค.
3. ๋ชจ๋ ํ๋๋ฅผ final๋ก ์ ์ธํ๋ค.
- ์์คํ ์ด ๊ฐ์ ํ๋ ์๋จ์ ์ด์ฉํด ์ค๊ณ์์ ์๋๋ฅผ ๋ช ํํ ๋๋ฌ๋ด๋ ๋ฐฉ๋ฒ์ด๋ค. ์๋ก ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๋๊ธฐํ ์์ด ๋ค๋ฅธ ์ค๋ ๋๋ก ๊ฑด๋ค๋ ๋ฌธ์ ์์ด ๋์ํ๊ฒ๋ ๋ณด์ฅํ๋ ๋ฐ๋ ํ์ํ๋ค
4. ๋ชจ๋ ํ๋๋ฅผ private์ผ๋ก ์ ์ธํ๋ค.
- ํ๋๊ฐ ์ฐธ์กฐํ๋ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ํด๋ผ์ด์ธํธ์์ ์ง์ ์ ๊ทผํด ์์ ํ๋ ์ผ์ ๋ง์์ค๋ค. ๊ธฐ์ ์ ์ผ๋ก๋ ๊ธฐ๋ณธ ํ์ ํ๋๋ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ํ๋๋ฅผ public final๋ก๋ง ์ ์ธํด๋ ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ๋์ง๋ง, ์ด๋ ๊ฒ ํ๋ฉด ๋ค์ ๋ฆด๋ฆฌ์ค์์ ๋ด๋ถ ํํ์ ๋ฐ๊พธ์ง ๋ชปํ๋ฏ๋ก ๊ถํ์ง๋ ์๋๋ค.
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 c){
return new Complex(re + c.re, im + c.im);
}
public Complex minus(Complex c){
return new Complex(re - c.re, im - c.im);
}
public Complex times(Complex c){
return new Complex(re * c.re - im * c.im, re * c.im + im * c.re);
}
public Complex dividedBy(Complex c){
double tmp = c.re * c.re + c.im * c.im;
return new Complex((re * c.re + im * c.im) / tmp, (im * c.re - re * c.im) / tmp);
}
@Override
public boolean equals(Object o){
if(o == this)
return true;
if(!(o instanceof Complex))
return false;
Complex c = (Complex) o;
return Double.compare(re, c.re) == 0 && Double.compare(im, c.im) == 0;
}
@Override
public int hashCode(){
int result = 17 + hashDouble(re);
result = 31 * result + hashDouble(im);
return result;
}
private int hashDouble(double val){
long longBits = Double.doubleToLongBits(re);
return (int) (longBits ^ (longBits >>> 32));
}
}
์์ ์์ ๋ ํผ์ฐ์ฐ์์ ํจ์๋ฅผ ์ ์ฉํด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง๋ง, ํผ์ฐ์ฐ์ ์์ฒด๋ ๊ทธ๋๋ก๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ์ฌ์ฉํ๋ค. ์ด ๋ฐฉ์์ผ๋ก ํ๋ก๊ทธ๋๋ฐํ๋ฉด ์ฝ๋์์ ๋ถ๋ณ์ ์์ญ ๋น์จ์ด ๋์์ ธ ์ฅ์ ์ ๋๋ฆด ์ ์๋ค. ๋ถ๋ณ ๊ฐ์ฒด๋ ์์ฑ๋ ์์ ์ ์ํ๋ฅผ ํ๊ดด๋ ๋๊น์ง ๊ทธ๋๋ก ๊ฐ์งํ๋ค. ๋ชจ๋ ์์ฑ์๊ฐ ํด๋์ค ๋ถ๋ณ์ ๋ณด์ฅํ๋ค๋ฉด ๊ทธ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์๊ฐ ๊ฐ๋ณ ๊ฐ์ฒด์ ๋ณํ์ ์ํ ๋ณต์ก์ฑ์ ์๊ฐํ์ง ์์๋ ๋๋ค.
๋ํ ๋ถ๋ณ๊ฐ์ฒด๋ ๊ทผ๋ณธ์ ์ผ๋ก ์ค๋ ๋ ์์ ํ์ฌ ๋ฐ๋ก ๋๊ธฐํํ ํ์ ์๋ค. ์ฆ, ๋ถ๋ณ ๊ฐ์ฒด๋ ์์ฌํ๊ณ ๊ณต์ ํ ์ ์๋ค.
์ถ๊ฐ๋ก ๋ถ๋ณ ํด๋์ค์ ์์ฃผ ์ฌ์ฉ๋๋ ์ ์ ํฉํฐ๋ฆฌ(์์ดํ 1)๋ฅผ ์ ๊ณตํ๊ฒ ๋๋ฉด ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ GC ๋น์ฉ์ด ์ค์ด๋ ๋ค. ์๋ก์ด ํด๋์ค๋ฅผ ์ค๊ณํ ๋ public ์์ฑ์ ๋์ ์ ์ ํฉํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋๋ฉด, ํด๋ผ์ด์ธํธ๋ฅผ ์์ ํ์ง ์๊ณ ๋ ํ์์ ๋ฐ๋ผ ์บ์ ๊ธฐ๋ฅ์ ๋์ค์ ๋ง ๋ถ์ผ ์ ์๋ค.
๋ถ๋ณ ๊ฐ์ฒด๋ ๊ทธ ์์ฒด๋ก ์คํจ ์์์ฑ์ ์ ๊ณตํ๋ค(์์ดํ 76). ์ํ๊ฐ ์ ๋ ๋ณํ์ง ์์ผ๋ ์ ๊น์ด๋ผ๋ ๋ถ์ผ์น ์ํ์ ๋น ์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค.
๋ถ๋ณ ๊ฐ์ฒด๋ ์์ ๋กญ๊ฒ ๊ณต์ ํ ์ ์์์ ๋ฌผ๋ก , ๋ถ๋ณ ๊ฐ์ฒด๋ผ๋ฆฌ๋ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์๋ค. ์๋ก BigInteger ํด๋์ค๋ ๋ด๋ถ ๊ฐ์ ๋ถํธ(sign)์ ํฌ๊ธฐ(magnitude)๋ฅผ ๋ฐ๋ก ํํํ๋ค. ๋ถํธ๋ฅผ int ๋ณ์, ํฌ๊ธฐ(์ ๋๊ฐ)๋ int ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค. ํํธ negate ๋ฉ์๋๋ ํฌ๊ธฐ๊ฐ ๊ฐ๊ณ ๋ถํธ๋ง ๋ฐ๋์ธ ์๋ก์ด BigInteger๋ฅผ ์์ฑํ๋๋ฐ, ์ด๋ ๋ฐฐ์ด์ ๋น๋ก ๊ฐ๋ณ์ด์ง๋ง ๋ณต์ฌํ์ง ์๊ณ ์๋ณธ ์ธ์คํด์ค์ ๊ณต์ ํด๋ ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์๋ก ๋ง๋ BigInteger ์ธ์คํด์ค๋ ์๋ณธ ์ธ์คํด์ค๊ฐ ๊ฐ๋ฆฌํค๋ ๋ด๋ถ ๋ฐฐ์ด์ ๊ทธ๋๋ก ๊ฐ๋ฆฌํจ๋ค.
public class BigInteger extends Number implements Comparable<BigInteger> {
final int signum;
final int[] mag;
...
}
negate()
public BigInteger negate() {
return new BigInteger(this.mag, -this.signum);
}
๋ถ๋ณ ํด๋์ค์๋ ๋จ์ ์ด ์๋ค. ๊ฐ์ด ๋ค๋ฅด๋ฉด ๋ฐ๋์ ๋ ๋ฆฝ๋ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ๊ฐ์ ๊ฐ์ง์๊ฐ ๋ง๋ค๋ฉด ์ด๋ค์ ๋ชจ๋ ๋ง๋๋ ๋ฐ ํฐ ๋น์ฉ์ ์น๋ฌ์ผ ํ๋ค.
์๋ก ๋ฐฑ๋ง ๋นํธ์ง๋ฆฌ BigIntger์์ ๋นํธ ํ๋๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ค๊ณ ํ๋ฉด.
BigIntger moby = ...;
moby = moby.flipBit(0);
flipBit ๋ฉ์๋๋ ์๋ก์ด BigIntger ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. ์๋ณธ๊ฐ ๋จ์ง ํ ๋นํธ๋ง ๋ค๋ฅธ ๋ฐฑ๋ง ๋นํธ์ง๋ฆฌ ์ธ์คํด์ค๋ฅผ ๋ง์ด๋ค.
์ด๋ก ์ธํด ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ถ๊ฑฐ์ง๋ค.
public BigInteger flipBit(int n) {
if (n < 0) {
throw new ArithmeticException("Negative bit address");
} else {
int intNum = n >>> 5;
int[] result = new int[Math.max(this.intLength(), intNum + 2)];
for(int i = 0; i < result.length; ++i) {
result[result.length - i - 1] = this.getInt(i);
}
result[result.length - intNum - 1] ^= 1 << (n & 31);
return valueOf(result);
}
}
์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ ๊ฐ์ง๊ฐ ์๋๋ฐ ์ฒซ ๋ฒ์งธ๋ ๋ค๋จ๊ณ ์ฐ์ฐ(multistep operation)๋ค์ ์์ธกํ์ฌ ๊ธฐ๋ณธ๊ธฐ๋ฅ์ผ๋ก ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์๋ก BigInteger๋ ๋ชจ๋๋ฌ ์ง์ ๊ฐ์ ๋ค๋จ๊ณ ์ฐ์ฐ ์๋๋ฅผ ๋์ฌ์ฃผ๋ ๊ฐ๋ณ ๋๋ฐ ํด๋์ค(companion class)๋ฅผ package-private์ผ๋ก ๋๊ณ ์๋ค.
ํด๋ผ์ด์ธํธ์ ๋ณต์กํ ์ฐ์ฐ๋ค์ ์ ํํ ์์ธกํ ์ ์๋ค๋ฉด package-private์ ๊ฐ๋ณ ๋๋ฐ ํด๋์ค๋ง์ผ๋ก ์ถฉ๋ถํ๋ค.
๋ํ์ ์ธ ์ String ํด๋์ค์ ๊ฐ๋ณ ๋๋ฐ ํด๋์ค๋ StringBuilder์ด๋ค.
์์ ์ ์์๋ฐ์ง ๋ชปํ๋ ๋ค์ ๋ฐฉ๋ฒ์ผ๋ก๋ ์์ฑ์๋ฅผ private ํน์ package-private์ผ๋ก ๋๊ณ ๋ชจ๋ ์์ฑ์๋ฅผ ์ ์ ํฉํ ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ด๋ค.
public final class Complex {
private final double re;
private final double im;
private Complex(double re, double im){
this.re = re;
this.im = im;
}
public static Complex valueOf(double re, double im){
return new Complex(re, im);
}
์ง๋ ฌํ ์ฃผ์์ฌํญ
Serializable์ ๊ตฌํํ๋ ๋ถ๋ณ ํด๋์ค์ ๋ด๋ถ์ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ํ๋๊ฐ ์๋ค๋ฉด readObject๋ readResolve ๋ฉ์๋๋ฅผ ๋ฐ๋์ ์ ๊ณตํ๊ฑฐ๋, ObjectOutputStream.writeUnshared์ ObjectInputStrea.readUnshared ๋ฉ์๋ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ํ๋ซํผ์ด ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์ง๋ ฌํ ๋ฐฉ๋ฒ์ด๋ฉด ์ถฉ๋ถํ๋๋ผ๋ ๋ง์ด๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ณต๊ฒฉ์๊ฐ ์ด ํด๋์ค๋ก๋ถํฐ ๊ฐ๋ณ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋ผ ์ ์๋ค.(์์ดํ 88)
ํด๋์ค๋ ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋ถ๋ณ์ด์ด์ผ ํ๋ค. ๋ถ๋ณ์ผ๋ก ๋ง๋ค ์ ์๋ ํด๋์ค๋ผ๋ ๋ณ๊ฒฝํ ์ ์๋ ๋ถ๋ถ์ ์ต์ํ์ผ๋ก ์ค์ด์. ๋ค๋ฅธ ํฉ๋นํ ์ด์ ๊ฐ ์๋ค๋ฉด ๋ชจ๋ ํ๋๋ private final์ด์ด์ผ ํ๋ค. ๊ฐ์ฒด๊ฐ ๊ฐ์ง ์ ์๋ ์ํ์ ์๋ฅผ ์ค์ด๋ฉด ๊ทธ ๊ฐ์ฒด๋ฅผ ์์ธกํ๊ธฐ ์ฌ์์ง๊ณ ์ค๋ฅ๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ด๋ค.
.์์ดํ 18 - ์์๋ณด๋ค๋ ์ปดํฌ์ง์ ์ ์ฌ์ฉํ๋ผ
์์์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ฐ๋ ฅํ ์๋จ์ด์ง๋ง, ํญ์ ์ต์ ์ ์๋๋ค. ๋ฉ์๋ ํธ์ถ๊ณผ ๋ฌ๋ฆฌ ์์์ ์บก์ํ๋ฅผ ๊นจ๋จ๋ฆฐ๋ค. ์์ ํด๋์ค๊ฐ ์ด๋ป๊ฒ ๊ตฌํ๋๋๋์ ๋ฐ๋ผ ํ์ ํด๋์ค์ ๋์์ ์ด์์ด ์๊ธธ ์ ์๋ค. ์์ ํด๋์ค๋ ๋ฆด๋ฆฌ์ค๋ง๋ค ๋ด๋ถ ๊ตฌํ์ด ๋ฌ๋ผ์ง ์ ์์ผ๋ฉฐ, ๊ทธ ์ฌํ๋ก ์ฝ๋ ํ ์ค ๊ฑด๋๋ฆฌ์ง ์์ ํ์ ํด๋์ค๊ฐ ์ค๋์ํ ์ ์๋ค.
์ด์์ ๋ฌธ์ ๋ฅผ ํผํด ๊ฐ๊ธฐ ์ํด. ๊ธฐ์กด ํด๋์ค๋ฅผ ํ์ฅํ๋ ๋์ , ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค๊ณ private ํ๋๋ก ๊ธฐ์กด ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ฒ ํ์. ๊ธฐ์กด ํด๋์ค๊ฐ ์๋ก์ด ํด๋์ค์ ๊ตฌ์ฑ์์๋ก ์ฐ์ธ๋ค๋ ๋ป์์ ์ด๋ฌํ ์ค๊ณ๋ฅผ ์ปดํฌ์ง์ ์ด๋ผ ํ๋ค.
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> set;
public ForwardingSet(Set<E> set){
this.set = set;
}
@Override
public int size() {
return set.size();
}
@Override
public boolean isEmpty(){
return set.isEmpty();
}
...
}
๋ค๋ฅธ Set ์ธ์คํด์ค๋ฅผ ๊ฐ์ธ๊ณ ์๋ค๋ ๋ป์์ InstrumentedSet ๊ฐ์ ํด๋์ค๋ฅผ ๋ํผ ํด๋์ค๋ผ ํ๋ฉฐ, ๋ค๋ฅธ Set์ ๊ณ์ธก ๊ธฐ๋ฅ์ ๋ง์์ด๋ค๋ ๋ป์์ ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ปดํฌ์ง์ ๊ณผ ์ ๋ฌ์ ์กฐํฉ์ ๋์ ์๋ฏธ๋ก ์์์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋จ, ์๋ฐํ ๋ฐ์ง๋ฉด ๋ํผ ๊ฐ์ฒด๊ฐ ๋ด๋ถ ๊ฐ์ฒด์ ์๊ธฐ ์์ ์ ์ฐธ์กฐ๋ฅผ ๋๊ธฐ๋ ๊ฒฝ์ฐ๋ง ์์์ ํด๋นํ๋ค.
๋ํผ ํด๋์ค๋ ๋จ์ ์ด ๊ฑฐ์ ์๋ค. ํ ๊ฐ์ง, ๋ํผ ํด๋์ค๊ฐ ์ฝ๋ฐฑ ํ๋ ์์ํฌ์๋ ์ด์ธ๋ฆฌ์ง ์๋๋ค๋ ์ ๋ง ์ฃผ์ํ๋ฉด ๋๋ค. ์ฝ๋ฐฑ ํ๋ ์ ์ํฌ์์๋ ์๊ธฐ ์์ ์ ์ฐธ์กฐ๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋๊ฒจ์ ๋ค์ ํธ์ถ ๋ ์ฌ์ฉํ๋๋ก ํ๋ค. ๋ด๋ถ ๊ฐ์ฒด๋ ์์ ์ ๊ฐ์ธ๊ณ ์๋ ๋ํผ์ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๋ ๋์ ์์ (this)์ ์ฐธ์กฐ๋ฅผ ๋๊ธฐ๊ณ ์ฝ๋ฐฑ ๋๋ ๋ํผ๊ฐ ์๋ ๋ด๋ถ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๊ฒ ๋๋ค. ์ด๋ฅผ Self ๋ฌธ์ ๋ผ๊ณ ํ๋ค.
์์์ ๋ฐ๋์ ํ์ ํด๋์ค๊ฐ ์์ ํด๋์ค์ '์ง์ง' ํ์ ํ์ ์ธ ์ํฉ์์๋ง ์ฌ์ฉํด์ผ ํ๋ค. ํด๋์ค B๊ฐ ํด๋์ค A์ is-a ๊ด๊ณ์ผ ๋๋ง ํด๋์ค A๋ฅผ ์์ํด์ผ ํ๋ค. ํด๋์ค A๋ฅผ ์์ํ๋ ํด๋์ค B๋ฅผ ์์ฑํ๋ ค ํ๋ค๋ฉด 'B๊ฐ ์ ๋ง A์ธ๊ฐ?'๋ผ๊ณ ์๋ฌธํด ๋ณด์. ๋๋ต์ด ์๋๋ผ๋ฉด A๋ฅผ private ์ธ์คํด์ค๋ก ๋๊ณ , A์๋ ๋ค๋ฅธ API๋ฅผ ์ ๊ณตํด์ผ ํ๋ ์ํฉ์ด ๋๋ค์๋ค.
ํต์ฌ ์ ๋ฆฌ
์์์ ๊ฐ๋ ฅํ์ง๋ง ์บก์ํ๋ฅผ ํด์น๋ค. ์์์ ์์ ํด๋์ค์ ํ์ ํด๋์ค๊ฐ ์์ํ is-a ๊ด๊ณ์ผ ๋๋ง ์จ์ผ ํ๋ค. is-a๊ด๊ณ์ผ ๋๋ ์์ฌํ ์๋ง์ ์๋ ๊ฒ, ํ์ ํด๋์ค์ ํจํค์ง๊ฐ ์์ ํด๋์ค์ ๋ค๋ฅด๊ณ , ์์ ํด๋์ค๊ฐ ํ์ฅ์ ๊ณ ๋ คํด ์ค๊ณ๋์ง ์์ ๋ค๋ฉด ์ฌ์ ํ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. ์์์ ์ทจ์ฝ์ ์ ํผํ๋ ค๋ฉด ์์ ๋์ ์ปดํฌ์ง์ ๊ณผ ์ ๋ฌ์ ์ฌ์ฉํ์. ํนํ ๋ํผ ํด๋์ค๋ก ๊ตฌํํ ์ ๋นํ ์ธํฐํ์ด์ค๊ฐ ์๋ค๋ฉด ๋์ฑ ๊ทธ๋ ๋ค. ๋ํผ ํด๋์ค๋ ํ์ ํด๋์ค๋ณด๋ค ๊ฒฌ๊ณ ํ๊ณ ๊ฐ๋ ฅํ๋ค.
.์์ดํ 19 - ์์์ ๊ณ ๋ คํด ์ค๊ณํ๊ณ ๋ฌธ์ํํ๋ผ. ๊ทธ๋ฌ์ง ์์๋ค๋ฉด ์์์ ๊ธ์งํ๋ผ
์์์ฉ ํด๋์ค๋ ์ฌ์ ์ํ ์ ์๋ ๋ฉ์๋๋ค์ ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ์ด์ฉํ๋์ง(์๊ธฐ ์ฌ์ฉ) ๋ฌธ์๋ก ๋จ๊ฒจ์ผ ํ๋ค. API ์ค๋ช , ์ด๋ค ์์๋ก ํธ์ถํ๋์ง, ๊ฐ๊ฐ์ ํธ์ถ ๊ฒฐ๊ณผ๊ฐ ์ด์ด์ง๋ ์ฒ๋ฆฌ์ ์ด๋ค ์ํฅ์ ์ฃผ๋์ง ๋ด์์ผ ํ๋ค.('์ฌ์ ์ ๊ฐ๋ฅ'์ด๋ public๊ณผ protected ๋ฉ์๋ ์ค final์ด ์๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ ๋ปํ๋ค). ๋ ๋๊ฒ ๋งํ๋ฉด, ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ ๋ชจ๋ ์ํฉ์ ๋ฌธ์๋ก ๋จ๊ฒจ์ผ ํ๋ค.
API ๋ฌธ์ ์ค ๋ฉ์๋ ์ค๋ช ๋์์ ์ข ์ข "Implementation Requirements"๋ก ์์ํ๋ ์ ์ ๋ฉ์๋ ๋ด๋ถ ๋์ ๋ฐฉ์์ ์ค๋ช ํ๋ ๊ณณ์ด๋ค.
ํจ์จ ์ ์ธ ํ์ ํด๋์ค๋ฅผ ํฐ ์ด๋ ค์ ์์ด ๋ง๋ค ์ ์๊ฒ ํ๋ ค๋ฉด ํด๋์ค์ ๋ด๋ถ ๋์ ๊ณผ์ ์ค๊ฐ์ ๋ผ์ด๋ค ์ ์๋ ํ (hook)์ ์ ์ ๋ณํ์ฌ protected ๋ฉ์๋ ํํ๋ก ๊ณต๊ฐํด์ผ ํ ์ ๋ ์๋ค.
์์์ฉ ํด๋์ค๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค์ด๋ณด๋ ๊ฒ์ด ์ ์ผํ๋ฉฐ ๋ฐ๋์ ๋ง๋ค์ด์ ๊ฒ์ฆํด๋ด์ผ ํ๋ค.
์์์ฉ ํด๋์ค์ ์์ฑ์๋ ์ง์ ์ ์ด๋ ๊ฐ์ ์ ์ด๋ ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋๋ฅผ ํธ์ถํด์๋ ์๋๋ค. ์์ ํด๋์ค์ ์์ฑ์๊ฐ ํ์ ํด๋์ค์ ์์ฑ์๋ณด๋ค ๋จผ์ ์คํ๋๋ฏ๋ก ์ฌ์ ์ ํ ๋ฉ์๋๊ฐ ํ์ ํด๋์ค์ ์์ฑ์๋ณด๋ค ๋จผ์ ํธ์ถ๋๋ค. ์ด๋ ์ฌ์ ์ํ ๋ฉ์๋๊ฐ ํ์ ํด๋์ค์ ์์ฑ์์์ ์ด๊ธฐํํ๋ ๊ฐ์ ์์กดํ๋ค๋ฉด ์๋๋๋ก ๋์ํ์ง ์์ ๊ฒ์ด๋ค.
public class Super {
// ์๋ชป๋ ์ - ์์ฑ์๊ฐ ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
public Super() {
overrideMe();
}
public void overrideMe() {
}
}
public class Sub extends Super {
// ์ด๊ธฐํ๋์ง ์์ final ํ๋. ์์ฑ์์์ ์ด๊ธฐํํ๋ค.
private final Instant instant;
public Sub() {
instant = Instant.now();
}
// ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋. ์์ ํด๋์ค์ ์์ฑ์๊ฐ ํธ์ถํ๋ค.
@Override
public void overrideMe() {
System.out.println("instant = " + instant);
}
public static void main(String[] args) {
Sub sub = new Sub();
// ์์ ํด๋์ค ์์ฑ์ด ๋จผ์ ์งํ ๋๊ธฐ ๋๋ฌธ์ instant๋ null์ด๋ค.
sub.overrideMe();
}
}
// ์ค์ ์ถ๋ ฅ ๊ฐ
instant = null
instant = 2023-05-16T12:20:54.766884300Z
Cloneable๊ณผ Serializable ์ธํฐํ์ด์ค๋ ์์์ฉ ์ค๊ณ์ ์ด๋ ค์์ ํ์ธต ๋ํด์ค๋ค. clone๊ณผ readObject ๋ชจ๋ ์ง์ ์ ์ด๋ ๊ฐ์ ์ ์ผ๋ก๋ ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋๋ฅผ ํธ์ถํด์๋ ์๋๋ค.. readObject์ ๊ฒฝ์ฐ ํ์ ํด๋์ค์ ์ํ๊ฐ ๋ฏธ์ฒ ๋ค ์ญ์ง๋ ฌํ๋๊ธฐ ์ ์ ์ฌ์ ์ํ ๋ฉ์๋๋ถํฐ ํธ์ถํ๊ฒ ๋๋ค. clone์ ๊ฒฝ์ฐ ํ์ ํด๋์ค์ clone ๋ฉ์๋๊ฐ ๋ณต์ ๋ณธ์ ์ํ๋ฅผ ์์ ํ๊ธฐ ์ ์ ์ฌ์ ์ํ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ์ด๋ ์ชฝ์ด๋ ํ๋ก๊ทธ๋จ ์ค์๋์ผ๋ก ์ด์ด์ง ๊ฒ์ด๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์์์ฉ์ผ๋ก ์ค๊ณํ์ง ์์ ํด๋์ค๋ ์์์ ๊ธ์งํ๋ ๊ฒ์ด๋ค.
๊ธ์งํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง์ด๋ค. ์ฌ์ด ๋ฐฉ๋ฒ ํ ๊ฐ์ง๋ ํด๋์ค๋ฅผ final๋ก ์ ์ธํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ ๋ฒ์งธ๋ ๋ชจ๋ ์์ฑ์๋ฅผ private์ด๋. package-private์ผ๋ก ์ ์ธํ๊ณ public ์ ์ ํฉํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค.
ํต์ฌ ์ ๋ฆฌ
์์์ฉ ํด๋์ค๋ฅผ ์ค๊ณํ๊ธฐ๋ ๊ฒฐ์ฝ ๋ง๋ง์น ์๋ค. ํด๋์ค ๋ด๋ถ์์ ์ค์ค๋ก๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง(์๊ธฐ ์ฌ์ฉ ํจํด) ๋ชจ๋ ๋ฌธ์๋ก ๋จ๊ฒจ์ผ ํ๋ฉฐ, ์ผ๋จ ๋ฌธ์ํํ ๊ฒ์ ๊ทธ ํด๋์ค๊ฐ ์ฐ์ด๋ ํ ๋ฐ๋์ ์ง์ผ์ผ ํ๋ค. ๊ทธ๋ฌ์ง ์์ผ๋ฉด ๊ทธ ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์ ๋ฏฟ๊ณ ํ์ฉํ๋ ํ์ ํด๋์ค๋ฅผ ์ค๋์ํ๊ฒ ๋ง๋ค ์ ์๋ค. ๋ค๋ฅธ ์ด๊ฐ ํจ์จ ์ข์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋๋ก ์ผ๋ถ ๋ฉ์๋๋ฅผ protected๋ก ์ ๊ณตํด์ผ ํ ์ ๋ ์๋ค. ๊ทธ๋ฌ๋ ํด๋์ค๋ฅผ ํ์ฅํด์ผ ํ ๋ช ํํ ์ด์ ๊ฐ ๋ ์ค๋ฅด์ง ์์ผ๋ฉด ์์์ ๊ธ์งํ๋ ํธ์ด ๋์ ๊ฒ์ด๋ค. ์์์ ๊ธ์งํ๋ ค๋ฉด ํด๋์ค๋ฅผ final๋ก ์ ์ธํ๊ฑฐ๋ ์์ฑ์ ๋ชจ๋๋ฅผ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋๋ก ๋ง๋ค๋ฉด ๋๋ค.
.์์ดํ 20 - ์ถ์ ํด๋์ค๋ณด๋ค๋ ์ธํฐํ์ด์ค๋ฅผ ์ฐ์ ํ๋ผ
์ธํฐํ์ด์ค๋ ๋ฏน์ค์ธ(mixin) ์ ์์ ์์ฑ๋ง์ถค์ด๋ค. ๋ฏน์ค์ธ์ด๋ ํด๋์ค๊ฐ ๊ตฌํํ ์ ์๋ ํ์ ์ผ๋ก, ๋ฏน์ค์ธ์ ๊ตฌํํ ํด๋์ค์ ์๋์ '์ฃผ๋ ํ์ ' ์ธ์๋ ํน์ ์ ํ์ ํ์๋ฅผ ์ ๊ณตํ๋ค๊ณ ์ ์ธํ๋ ํจ๊ณผ๋ฅผ ์ค๋ค. ์๋ก Comparable์ ์์ ์ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ค๋ผ๋ฆฌ๋ ์์๋ฅผ ์ ํ ์ ์๋ค๊ณ ์ ์ธํ๋ ๋ฏน์ค์ธ ์ธํฐํ์ด์ค์ด๋ค. ์ถ์ ํด๋์ค๋ก๋ ๋ฏน์ค์ธ์ ์ ์ํ ์ ์๋ค. ๊ธฐ์กด ํด๋์ค์ ๋ง์์ธ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ํด๋์ค๋ ๋ ๋ถ๋ชจ๋ฅผ ์ฌ๊ธธ ์ ์๊ณ , ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ์๋ ๋ฏน์ค์ธ์ ์ฝ์ ํ๊ธฐ์ ํฉ๋ฆฌ์ ์ธ ์์น๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ธํฐํ์ด์ค๋ ๊ธฐ๋ฅ์ ํฅ์ํ๋ ์์ ํ๊ณ ๊ฐ๋ ฅํ ์๋จ์ด ๋๋ค.
์ธํฐํ์ด์ค์ ์ถ์ ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค๋ฅผ ํจ๊ป ์ ๊ณตํ๋ ์์ผ๋ก ์ธํฐํ์ด์ค์ ์ถ์ ํด๋์ค์ ์ฅ์ ์ ๋ชจ๋ ์ทจํ๋ ๋ฐฉ๋ฒ๋ ์๋ค. ์ธํฐํ์ด์ค๋ก ํ์ ์ ์ ์ํ๊ณ ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ค. ๋จ์ํ ๊ณจ๊ฒฉ ๊ตฌํ์ ํ์ฅํ๋ ๊ฒ๋ง์ผ๋ก ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ฐ ํ์ํ ์ผ์ด ๋๋ถ๋ถ ์๋ฃ๋๋ค. ๋ฐ๋ก ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ด๋ค.
๊ด๋ก๋ก ์ธํฐํ์ด์ค ์ด๋ฆ์ด interface๋ผ๋ฉด ๊ทธ ๊ณจ๊ฒฉ ๊ตฌํ ํด๋์ค์ ์ด๋ฆ์ AbstractInterface๋ก ์ง๋๋ค. ์๋ก ์ปฌ๋ ์ ํ๋ ์์ํฌ์ AbstradctCollection, AbstractSet ๋ฑ์ด ํต์ฌ ์ปฌ๋ ์ ์ธํฐํ์ด์ค์ ๊ณจ๊ฒฉ ๊ตฌํ์ด๋ค.
public abstract class AbstractMap<K, V> implements Map<K, V> {
transient Set<K> keySet;
transient Collection<V> values;
protected AbstractMap() {
}
...
๋จ์ ๊ตฌํ์ ๊ณจ๊ฒฉ ๊ตฌํ์ ์์ ๋ณ์ข ์ผ๋ก AbstractMap.SimpleEntiry๊ฐ ์ข์ ์๋ฐ. ๋จ์ ๊ตฌํ๋ ๊ณจ๊ฒฉ ๊ตฌํ๊ณผ ๊ฐ์ด ์์์ ์ํด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒ์ด์ง๋ง, ์ถ์ ํด๋์ค๊ฐ ์๋๋ ์ ์ด ๋ค๋ฅด๋ค. ์ฝ๊ฒ ๋งํด ๋์ํ๋ ๊ฐ์ฅ ๋จ์ํ ๊ตฌํ์ด๋ค. ํ์์ ๋ฐ๋ผ ๊ทธ๋๋ก ์ฌ์ฉ๊ฐ๋ฅํ๊ณ ํ์ฅ๋ ๊ฐ๋ฅํ๋ค.
public static class SimpleEntry<K, V> implements Map.Entry<K, V>, Serializable {
private static final long serialVersionUID = -8499721149061103585L;
private final K key;
private V value;
...
ํต์ฌ ์ ๋ฆฌ
์ผ๋ฐ์ ์ผ๋ก ๋ค์ค ๊ตฌํ์ฉ ํ์ ์ผ๋ก๋ ์ธํฐํ์ด์ค๊ฐ ๊ฐ์ฅ ์ ํฉํ๋ค. ๋ณต์กํ ์ธํฐํ์ด์ค๋ผ๋ฉด ๊ตฌํํ๋ ์๊ณ ๋ฅผ ๋์ด์ฃผ๋ ๊ณจ๊ฒฉ ๊ตฌํ์ ํจ๊ป ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๊ผญ ๊ณ ๋ คํด ๋ณด์. ๊ณจ๊ฒฉ ๊ตฌํ์ '๊ฐ๋ฅํ ํ' ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ก ์ ๊ณตํ์ฌ ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ชจ๋ ๊ณณ์์ ํ์ฉํ๋๋ก ํ๋ ๊ฒ์ด ์ข๋ค. '๊ฐ๋ฅํ ํ'์ด๋ผ ํ ์ด์ ๋ ์ธํฐํ์ด์ค์ ๊ฑธ๋ ค์๋ ๊ตฌํ์์ ์ ์ฝ ๋๋ฌธ์ ๊ณจ๊ฒฉ ๊ตฌํ์ ์ถ์ ํด๋์ค๋ก ์ ๊ณตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ ํํ๊ธฐ ๋๋ฌธ์ด๋ค.
.์์ดํ 21 - ์ธํฐํ์ด์ค๋ ๊ตฌํํ๋ ์ชฝ์ ์๊ฐํด ์ค๊ณํ๋ผ
์๋ฐ 8 ์ด์ ์๋ ๊ธฐ์กด ๊ตฌํ์ฒด๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์๊ณ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ๋ฐฉ๋ฒ์ด ์์์ง๋ง ๋ํดํธ ๋ฉ์๋๋ก ์ธํด ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํด์ก๋ค. ํ์ง๋ง ๊ธฐ์กด ๊ตฌํ์ฒด๋ค๊ณผ ๋งค๋๋ฝ๊ฒ ์ฐ๋๋๋ฆฌ๋ผ๋ ๋ณด์ฅ์ ์๋ค. ์๋ฐ 7 ๊น์ง๋ ๋ชจ๋ ํด๋์ค๊ฐ 'ํ์ฌ์ ์ธํฐํ์ด์ค์ ์๋ก์ด ๋ฉ์๋๊ฐ ์ถ๊ฐ๋ ์ผ์ ์์ํ ์๋ค'๋ผ๊ณ ๊ฐ์ ํ๊ณ ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฐ 8 ํต์ฌ ์ปฌ๋ ์ ์ธํฐํ์ด์ค๋ค์ ๋ค์์ ๋ํดํธ ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์๋๋ฐ. ์ฃผ๋ก ๋๋ค(7์ฅ)๋ฅผ ํ์ฉํ๊ธฐ ์ํด์๋ค. ๋ํดํธ ๋ฉ์๋๋ ์ฝ๋ ํ์ง์ด ๋๊ณ ๋ฒ์ฉ์ ์ด๋ผ ๋๋ถ๋ถ ์ํฉ์์ ์ ์๋ํ๋ค. ํ์ง๋ง ์๊ฐํ ์ ์๋ ๋ชจ๋ ์ํฉ์์ ๋ถ๋ณ์์ ํด์น์ง ์๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ์์ฑํ๊ธฐ๋ ์ด๋ ต๋ค.
- ์๋ฐ 8์์ ์ถ๊ฐ๋ Collection ์ธํฐํ์ด์ค์ removeIf ๋ํดํธ ๋ฉ์๋
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
Iterator<E> each = this.iterator();
while(each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
์์ ๊ฐ์ ๋ํดํธ ๋ฉ์๋๊ฐ ๋ชจ๋ ์ด์ธ๋ ค์ง๋ ๊ฒ์ ์๋๋ค ์๋ก SynchronizedCollection์ผ๋ก ๋๊ธฐํ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์๊ฐ๋ฅํ๋ค. ์์ removeIf๋ ๋๊ธฐํ์ lock๊ณผ ๊ด๋ จ๋ ์ฌํญ์ ์ผ์ฒด ๋ชจ๋ฅด๋ฏ๋ก ์๊ธฐ์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์, ๊ธฐ์กด ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ก ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ์ผ์ ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ํผํ์. ํ์ง๋ง ์๋ก์ด ์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ํดํธ ๋ฉ์๋๋ ์์ฃผ ์ ์ฉํ ์๋จ์ด๋ค.
.์์ดํ 22 - ์ธํฐํ์ด์ค๋ ํ์ ์ ์ ์ํ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๋ผ
์ธํฐํ์ด์ค๋ ์์ ์ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋ ํ์ ์ญํ ์ ํ๋ค. ์ค์ง ์ด์ฉ๋๋ก ์ฌ์ฉํด์ผ ํ๋ค. ์ด ์ง์นจ์ ๋ง์ง ์์ ์๋ก ์์ ์ธํฐํ์ด์ค๊ฐ ์กด์ฌํ๋ค. ์์๋ฅผ ๋ปํ๋ static final ํ๋๋ก๋ง ๊ฐ๋ ์ฐจ๋ ์ธํฐํ์ด์ค์ด๋ค.
- ์์ ์ธํฐํ์ด์ค ์ํฐํจํด (์ธํฐํ์ด์ค์ ์๋ชป ์ฌ์ฉํ ์)
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 ๋ ธ์ถ -> ์ฌ์ฉ์์๊ฒ ํผ๋
- ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ๋ด๋ถ ๊ตฌํ์ ํด๋นํ๋ ์์ ์์๋ค์๊ฒ ์ข ์๋ ์ํ
์์ ๊ฐ์ด ์์๋ฅผ ๊ณต๊ฐํ ๋ชฉ์ ์ด๋ผ๋ฉด ์ฌ์ฉ ํด๋์ค๋ ์ธํฐํ์ด์ค ์์ฒด์ ์ถ๊ฐํ๊ฑฐ๋, ์ด๊ฑฐ ํ์ ์ผ๋ก ๊ณต๊ฐํ๊ฑฐ๋(์์ดํ 34) ์ด๋ ์๋๋ผ๋ฉด ์ธ์คํด์คํํ ์ ์๋ ์ ํธ๋ฆฌํฐ ํด๋์ค(์์ดํ 4)์ ๋ด์ ๊ณต๊ฐํ์.
- ์ ํธ๋ฆฌํฐ ํด๋์ค ๋ฒ์
public class PhysicalConstantUtils {
private PhysicalConstantUtils() {} // ์ธ์คํด์คํ ๋ฐฉ์ง
// ์๋ณด๊ฐ๋๋ก ์ (1/๋ชฐ)
public static final double AVOGADROS_NUMBER = 6.022_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 - ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ณด๋ค๋ ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ผ
๋ ๊ฐ์ง ์ด์์ ์๋ฏธ๋ฅผ ํํํ ์ ์์ผ๋ฉฐ, ๊ทธ์ค ํ์ฌ ํํํ๋ ์๋ฏธ๋ฅผ ํ๊ทธ ๊ฐ์ผ๋ก ์๋ ค์ฃผ๋ ํด๋์ค.
- ์๊ณผ ์ฌ๊ฐํ์ ํํํ ์ ์๋ ํด๋์ค
// ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค - ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ๋ณด๋ค ํจ์ฌ ๋์๋ค!
public class Figure {
enum Shape { RECTANGLE, CIRCLE }
// ํ๊ทธ ํ๋ - ํ์ฌ ๋ชจ์์ ๋ํ๋ธ๋ค.
final Shape shape;
// ๋ค์ ํ๋๋ค์ ๋ชจ์์ด ์ฌ๊ฐํ(RECTANGLE)์ผ ๋๋ง ์ฐ์ธ๋ค.
double length;
double width;
// ๋ค์ ํ๋๋ ๋ชจ์์ด ์(CIRCLE)์ผ ๋๋ง ์ฐ์ธ๋ค.
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);
}
}
}
๋จ์
- ์ด๊ฑฐ ํ์ ์ ์ธ, ํ๊ทธ ํ๋, switch ๋ฌธ ๋ฑ ์ธ๋ฐ์๋ ์ฝ๋๊ฐ ๋ง๋ค.
- ์ฌ๋ฌ ๊ตฌํ์ด ํ ํด๋์ค์ ํผํฉ๋ผ ์์ด์ ๊ฐ๋ ์ฑ์ด ๋์๋ค.
- ๋ค๋ฅธ ์๋ฏธ๋ฅผ ์ํ ์ฝ๋๋ ์ธ์ ๋ ํจ๊ป ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ง์ด ์ฌ์ฉํ๋ค.
- ํ๋๋ค์ final ์ ์ธํ๊ธฐ ์ํด์๋ ํด๋น ์๋ฏธ์ ์ฐ์ด์ง ์๋ ํ๋๋ค๊น์ง ์์ฑ์์์ ์ด๊ธฐํํด์ผ ํ๋ค. - ๋ถํ์ํ ์ฝ๋ ์์ฑ
- ๋ ๋ค๋ฅธ ์๋ฏธ ์ถ๊ฐ๋ฅผ ์ํด ์ฝ๋๊ฐ ์์ ๋์ด์ผ ํ๋ค.
์ฆ, ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ ์ฅํฉํ๊ณ , ์ค๋ฅ๋ฅผ ๋ด๊ธฐ ์ฝ๊ณ , ๋นํจ์จ ์ ์ด๋ค. ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ด์คํ๊ฒ ํ๋ด ๋์ ๋ฟ์ด๋ค.
ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋ณํ ๊ณผ์
1. ๊ณ์ธต ๊ตฌ์กฐ์ ๋ฃจํธ(root)๊ฐ ๋ ์ถ์ ํด๋์ค ์ ์
2. ํ๊ทธ ๊ฐ์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง๋ ๋ฉ์๋๋ค์ ๋ฃจํธ ํด๋์ค์ ์ถ์๋ฉ์๋๋ก ์ ์ธ - area() ๋ฉ์๋
3. ํ๊ทธ ๊ฐ๊ณผ ์๊ด์์ด ๋์์ด ์ผ์ ํ ๋ฉ์๋๋ค์ ๋ฃจํธ ํด๋์ค์ ์ผ๋ฐ ๋ฉ์๋๋ก ์ถ๊ฐ
4. ๋ชจ๋ ํ์ ํด๋์ค์์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ํ๋๋ค๋ ๋ฃจํธ ํด๋์ค๋ก ์ฌ๋ฆฐ๋ค.
5. ๋ฃจํธ ํด๋์ค๋ฅผ ํ์ฅํ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์๋ฏธ๋ณ๋ก ํ๋์ฉ ์ ์ - Figure ํด๋์ค๋ฅผ ํ์ฅํ Circle ํด๋์ค, Rectangle ํด๋์ค
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;
}
}
์ ์ฐ์ฑ, ํ์ฅ์ฑ ์ฆ๊ฐ
- ์ ์ฌ๊ฐํ ์ถ๊ฐ๋ ๊ฒฝ์ฐ
public class Square extends Rectangle{
public Square(double side) {
super(side, side);
}
@Override
public double area() {
return super.area();
}
}
ํต์ฌ ์ ๋ฆฌ
ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ฅผ ์จ์ผ ํ๋ ์ํฉ์ ๊ฑฐ์ ์๋ค. ์๋ก์ด ํด๋์ค๋ฅผ ์์ฑํ๋ ๋ฐ ํ๊ทธ ํ๋๊ฐ ๋ฑ์ฅํ๋ค๋ฉด ํ๊ทธ๋ฅผ ์์ ๊ณ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋์ฒดํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด ๋ณด์. ๊ธฐ์กด ํด๋์ค๊ฐ ํ๊ทธ ํ๋๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋ฆฌํฉํฐ๋ง ํ๋๊ฑธ ๊ณ ๋ฏผํด ๋ณด์.
.์์ดํ 24 - ๋ฉค๋ฒ ํด๋์ค๋ ๋๋๋ก static์ผ๋ก ๋ง๋ค๋ผ
์ค์ฒฉ ํด๋์ค(nested class)๋ ๋ค๋ฅธ ํด๋์ค ์์ ์ ์๋ ํด๋์ค๋ฅผ ๋งํ๋ค. ์ค์ฒฉ ํด๋์จ๋ ์์ ์ ๊ฐ์ผ ๋ฐ๊นฅ ํด๋์ค์์๋ง ์ฐ์ฌ์ผ ํ๋ฉฐ, ๊ทธ ์ธ์ ์ฐ์์๊ฐ ์๋ค๋ฉด ํฑ๋ ๋ฒจ ํด๋์ค๋ก ๋ง๋ค์ด์ผ ํ๋ค. ์ค์ฒฉ ํด๋์ค์ ์ข ๋ฅ๋ ์ ์ ๋ฉค๋ฒ ํด๋์ค, (๋น ์ ์ ) ๋ฉค๋ฒ ํด๋์ค, ์ต๋ช ํด๋์ค, ์ง์ญ ํด๋์ค, ์ด๋ ๊ฒ ๋ค ๊ฐ์ง์ด๋ค. ์ด ์ค ์ฒซ ๋ฒ์งธ๋ฅผ ์ ์ธํ ๋๋จธ์ง๋ ๋ด๋ถ ํด๋์ค(inner class)์ ํด๋นํ๋ค.
1. ์ ์ ๋ฉค๋ฒ ํด๋์ค
- ๋ค๋ฅธ ํด๋์ค ์์ ์ ์ธ๋๊ณ , ๋ฐ๊นฅ ํด๋์ค์ private ๋ฉค๋ฒ์๋ ์ ๊ทผํ ์ ์๋ค๋ ์ ๋ง ์ ์ธํ๊ณ ์ผ๋ฐ ํด๋์ค์ ๋๊ฐ๋ค. private๋ก ์ ์ธํ๋ฉด ๋ฐ๊นฅ ํด๋์ค์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
public class OuterClass {
private static int outerData = 0;
public static class StaticNestedClass {
public void display() {
System.out.println("Outer data: " + outerData);
}
public static void staticMethod() {
System.out.println("Static method in StaticNestedClass");
}
}
}
2. ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค
- ์ ์ ํด๋์ค์ ๊ตฌ๋ฌธ์ static ์ฐจ์ด์ด์ง๋ง ์๋ฏธ์ ์ฐจ์ด๋ ํฌ๋. ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค์ ์ธ์คํด์ค๋ ๋ฐ๊นฅ ํด๋์ค์ ์ธ์คํด์ค์ ์์ฃฝ์ ์ผ๋ก ์ฐ๊ฒฐ๋๋ค. ๊ทธ๋์ค ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์ค๋์์ ์ ๊ทํ๋ this๋ฅผ ์ฌ์ฉํด ๋ฐ๊นฅ ์ธ์คํด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋ ๋ฐ๊นฅ ์ธ์คํด์ค ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
public class OuterClass {
private static int outerData = 0;
public void outerMethod() {
System.out.println("Outer method called");
}
public class InnerClass {
public void innerMethod() {
System.out.println("Inner method called");
// ๋ฐ๊นฅ ์ธ์คํด์ค์ ๋ฉ์๋ ํธ์ถ
outerMethod();
// ๋ฐ๊นฅ ์ธ์คํด์ค์ ์ฐธ์กฐ ๊ฐ์ ธ์ค๊ธฐ
OuterClass.this.outerData = 20;
System.out.println("Updated outer data: " + OuterClass.this.outerData);
}
}
}
public static void main(String[] args) {
OuterClass outerObj = new OuterClass();
OuterClass.InnerClass innerObj = outerObj.new InnerClass();
innerObj.innerMethod();
}
๊ฐ๋ ์ ์ค์ฒฉ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ฐ๊นฅ ์ธ์คํด์ค์ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ ์๋ค๋ฉด ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ก ๋ง๋ค์ด์ผ ํ๋ค. ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค๋ ๋ฐ๊นฅ ์ธ์คํด์ค ์์ด๋ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ, ๋ฉค๋ฒ ํด๋์ค์์ ๋ฐ๊นฅ ์ธ์คํด์ค์ ์ ๊ทผํ ์ผ์ด ์๋ค๋ฉด ๋ฌด์กฐ๊ฑด static์ ๋ถ์ฌ์ ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ก ๋ง๋ค์.
3. ์ต๋ช ํด๋์ค
- ์์ฉ์ ์ ์ฝ์ด ๋ง๊ณ ์ฝ๋๊ฐ ๊ธธ๊ฒ ๋๋ฉด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค. ๋๋ค์ด์ ์๋ ์ฆ์์์ ์์ ํจ์ ๊ฐ์ฒด๋ ์ฒ๋ฆฌ ๊ฐ์ฒด(process object)๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ์ง๋ง. ๋๋ค๊ฐ ๋ฑ์ฅํ๋ฉฐ ๋๋ค์์ ์์ฃผ ์ฌ์ฉ๋๋ค(์์ดํ 42). ๋ ๋ค๋ฅธ ์ฃผ ์ฐ์์ผ๋ก ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋ ๊ตฌํํ ๋๋ค.
public interface Anonymous {
void anonymousMethod();
}
public static void main(String[] args) {
Anonymous anonymous = new Anonymous() {
@Override
public void anonymousMethod() {
System.out.println("Anonymous Method");
}
};
}
4. ์ง์ญ ํด๋์ค
- ๊ฐ์ฅ ๋๋ฌผ๊ฒ ์ฌ์ฉ๋๋ฉฐ ์ง์ญ๋ณ์์ ๋น์ทํ๊ฒ ์ฌ์ฉ. ๊ฐ๋ ์ฑ์ ์ํด ์งง๊ฒ ์์ฑ
public static void main(String[] args) {
class LocalClass {
public void localMethod() {
System.out.println("Local Method");
}
}
}
ํต์ฌ ์ ๋ฆฌ
์ค์ฒฉ ํด๋์ค์๋ ๋ค ๊ฐ์ง๊ฐ ์์ผ๋ฉฐ, ์ฐ์์ด ๊ฐ๊ฐ ๋ค๋ฅด๋ค.
๋ฉ์๋ ๋ฐ์์๋ ์ฌ์ฉํด์ผ ํ๊ฑฐ๋ ๋ฉ์๋ ์์ ์ ์ํ๊ธฐ์ ๋๋ฌด ๊ธธ๋ค๋ฉด ๋ฉค๋ฒ ํด๋์ค๋ก ๋ง๋ ๋ค.
๋ฉค๋ฒ ํด๋์ค์ ์ธ์คํด์ค ๊ฐ๊ฐ์ด ๋ฐ๊นฅ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ค๋ฉด ๋น์ ์ ์ผ๋ก, ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ ์ผ๋ก ๋ง๋ค์.
์ค์ฒฉ ํด๋์ค๊ฐ ํ ๋ฉ์๋ ์์์๋ง ์ฐ์ด๋ฉด์ ๊ทธ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์ง์ ์ด ๋จ ํ ๊ณณ์ด๊ณ ํด๋น ํ์ ์ผ๋ก ์ฐ๊ธฐ์ ์ ํฉํ ํด๋์ค๋ ์ธํฐํ์ด์ค๊ฐ ์ด๋ฏธ ์๋ค๋ฉด ์ต๋ช ํด๋์ค๋ก ๋ง๋ค๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ง์ญ ํด๋์ค๋ก ๋ง๋ค๋ค.
.์์ดํ 25 - ํฑ๋ ๋ฒจ ํด๋์ค๋ ํ ํ์ผ์ ํ๋๋ง ๋ด์ผ๋ผ.
์์ค ํ์ผ ํ๋์ ํฑ๋ ๋ฒจ ํด๋์ค๋ฅผ ์ฌ๋ฌ ๊ฐ ์ ์ธํ๋ฉด ์ด๋ ์์ค ํ์ผ์ ๋จผ์ ์ปดํ์ผ ํ๋์ผ ๋ฐ๋ผ ์ฌ์ฉํ๋ ๊ฒ ๋ฌ๋ผ์ง๋ค.
public static void main(String[] args) {
System.out.println(Utensil.NAME + " " + Dessert.NAME);
}
// ๋ ํด๋์ค๊ฐ ํํ์ผ1 - Dessert.java
class Utensil {
static final String NAME = "pan";
}
class Dessert {
static final String NAME = "cake";
}
// ๋ ํด๋์ค๊ฐ ํํ์ผ2 - Utensil.java
class Utensil {
static final String NAME = "pan";
}
class Dessert {
static final String NAME = "cake";
}
- ์์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ค๋ณต์ ์๋ก ์ปดํ์ผ ์ค๋ฅ ๋ฐ์!
ํด๊ฒฐ ์ฑ ์ ๋จ์ํ ํฑ๋ ๋ฒจ ํด๋์ค๋ค์ ์๋ก ๋ค๋ฅธ ์์คํ์ผ๋ก ๋ถ๋ฆฌํ๋ฉด ๋๋ค.
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";
}
}
ํต์ฌ ์ ๋ฆฌ
์์ค ํ์ผ ํ๋์๋ ๋ฐ๋์ ํฑ๋ ๋ฒจ ํด๋์ค(ํน์ ํฑ๋ ๋ฒจ ์ธํฐํ์ด์ค)๋ฅผ ํ๋๋ง ๋ด์.
๐ ๋๋์ .
ํด๋์ค์ ์ธํฐํ์ด์ค์ ๊ดํ์ฌ ์ฌ๋ฟ ์ง์๋ค์ ์ต๋ํ์๋ค. ์ ์ฌ์ ์์ ์ธํฐํ์ด์ค ์ถ์ํ, ํด๋์ค๋ฑ์ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
'Study > Effective Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Effective Java 3/E] 3์ฅ ๋ชจ๋ ๊ฐ์ฒด์ ๊ณตํต ๋ฉ์๋ (1) | 2023.05.07 |
---|---|
[Effective Java 3/E] 2์ฅ ๊ฐ์ฒด ์์ฑ๊ณผ ํ๊ดด (1) | 2023.04.30 |
[Effective Java 3/E] 1์ฅ ๋ค์ด๊ฐ๊ธฐ (0) | 2023.04.18 |