2023. 2. 28. 11:02ใJAVA/Effective JAVA
[์ดํํฐ๋ธ ์๋ฐ] Item17. ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ต์ํํ๋ผ.
์ ๋ฒ ๊ธ์์ ๋ถ๋ณ ํด๋์ค์ ๊ฐ๋ ๊ณผ ๋ง๋๋ ๋ค์ฏ๊ฐ์ง ๊ท์น, ๊ทธ๋ฆฌ๊ณ ๋ถ๋ณ ํด๋์ค์ ์ฅ์ ๊ณผ ๋จ์ ์ ๋ํด์ ๋ฐฐ์ ๋ค.
๋ถ๋ณ ํด๋์ค๋ฅผ ๋ง๋ค ๋ ๋ค์ฏ๊ฐ์ง ๊ท์น์ ๋ํด์ ์ค๋์ ๋ถ๋ณ ํด๋์ค๋ฅผ ๋ง๋ค ๋ ๊ณ ๋ คํด์ผ ํ ์ ์ ๋ํด์ ํ์ตํ๋ค.
๋ถ๋ณ ํด๋์ค๋ฅผ ๋ง๋๋ ๋ค์ฏ๊ฐ์ง ๊ท์น์์
ํด๋์ค๋ฅผ ํ์ฅํ ์ ์๋๋ก ํด์ผํ๋ค๊ณ ํ๊ณ , ์์์ ํ์ง ๋ชปํ๊ฒ ํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก final ํด๋์ค๋ก ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๋ค.
๊ทธ๋ฐ๋ฐ final ํด๋์ค๋ก ์ ์ธํด ์์์ ๋ง๋ ๋ฐฉ๋ฒ ์ธ์๋ ๋ ์ ์ฐํ ๋ฐฉ๋ฒ๋ค์ด ์๋ค.
-> ๋ชจ๋ ์์ฑ์๋ฅผ private ๋๋ package-private ๋ก ๋ง๋ค๊ณ public ์ ์ ํฉํฐ๋ฆฌ๋ก ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ด๋ค.
public /*final*/ class Complex
{
private final double re;
private final double im;
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);
private Complex(double re, double im) // private ๋๋ package-private ์์ฑ์๋ฅผ ์ฌ์ฉํด์๋ ์์์ ๋ง์ ์ ์๋ค.
{
this.re = re;
this.im = im;
}
/** private ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๋๋ฐ.. ๊ทธ๋ ๋ค๋ฉด ์ด ํด๋์ค๋ ์ด๋ป๊ฒ ์ฌ์ฉํ๋๊ฐ?
* -> ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ฌ์ฉ
*/
public static Complex valueOf(double re, double im)
{
return new Complex(re, im);
}
}
์ด๋ ๊ฒ ์์ฑ์๋ฅผ private๋ก ๋ง๋ค์ด์ฃผ๊ณ ๋๋ฉด ์ด ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ผํ๋๋ฐ private๋ก ์์ฑ์๋ฅผ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ์ด ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.. ๋ฐ๋ผ์ public ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ํตํด์ ํด๋น ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
public static void main(String[] args)
{
/** private ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๋๋ฐ.. ๊ทธ๋ ๋ค๋ฉด ์ด ํด๋์ค๋ ์ด๋ป๊ฒ ์ฌ์ฉํ๋๊ฐ?
* -> ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ฌ์ฉ
* ์ฅ์ : final ํด๋์ค๋ ์์์ ์์ ๋ง์๋ฒ๋ฆฌ์ง๋ง private ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฑ์๋ฅผ ์ขํ ์ํ์์๋ ์์์ด ๊ฐ๋ฅํ๋ค.
*/
Complex complex = Complex.valueOf(1, 0.22);
}
private ์์ฑ์ + public ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ฉด ํจํค์ง ๋ฐ๊นฅ์ ํด๋ผ์ด์ธํธ์์ ๋ฐ๋ผ๋ณธ ์ด ๋ถ๋ณ ๊ฐ์ฒด๋ ์ฌ์ค์ final ์ด๋ค.
์๋ํ๋ฉด public์ด๋ protected ์์ฑ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํจํค์ง์์๋ ์ด ํด๋์ค๋ฅผ ํ์ฅํ๋๊ฒ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์ ํฉํฐ๋ฆฌ ๋ฐฉ์์ ๋ค์์ ๊ตฌํ ํด๋์ค๋ฅผ ํ์ฉํ ์ ์ฐ์ฑ์ ์ ๊ณตํ๊ณ , ์ด์ ๋ํด ๋ค์ ๋ฆด๋ฆฌ์ค์์ ๊ฐ์ฒด ์บ์ฑ ๊ธฐ๋ฅ์ ์ถ๊ฐํด ์ฑ๋ฅ์ ๋์ด์ฌ๋ฆด ์ ์๋ค.
private static class MyComplex extends Complex
{
private MyComplex(double re, double im)
{
super(re, im);
}
}
final๋ก ํด๋์ค๋ฅผ ์ ์ธํด ์์์ ๋ง์๋ฒ๋ฆฌ๋ ๊ฒ๋ณด๋ค private ๋๋ package-private ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ํด๋์ค ๋ด์์๋ ์์์ด ๊ฐ๋ฅํด ์ข ๋ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์๋ค!
โ BigInteger์ BigDecimal ์ฃผ์์ฌํญ
BigInteger์ BigDecimal์ ์ค๊ณํ ๋น์์๋ ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ์ฌ์ค์ final ์ด์ด์ผ ํ๋ค๋ ์๊ฐ์ด ๋๋ฆฌ ํผ์ง์ง ์์๋ค๊ณ ํ๋ค.
๊ทธ๋์ BigInteger์ BigDecimal์ ์์ํด ์ฌ์ ์ํ ์ ์๊ฒ ์ค๊ณ๋์๊ณ ,... ๋ฐ๋ผ์ ์ง๊ธ๊น์ง๋ ํ์ํธ์์ฑ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋ค..!
public static BigInteger safeInstance(BigInteger val)
{
return val.getClass() == BigInteger.class ? val : new BigInteger(val.toByteArray());
}
๋ฐ๋ผ์ BigInteger์ BigDecimal์ ์ธ์คํด์ค์ ์ธ์๋ก ๋ฐ๋๋ค๋ฉด ์ฃผ์ ํด์ผ ํ๋ค!!
์ด ๊ฐ์ด ๋ถ๋ณ์ด์ด์ผ ํด๋์ค์ ๋ณด์์ ์งํฌ ์ ์๋ค๋ฉด ์ธ์๋ก ๋ฐ์ ๊ฐ์ฒด๊ฐ '์ง์ง' BigInteger ํน์ BigDecmal์ธ์ง ๋ฐ๋์ ํ์ธํด์ผ ํ๋ค.
-> ์ ๋ขฐํ ์ ์๋ ํ์ ํด๋์ค์ ์ธ์คํด์ค๋ผ๊ณ ํ์ธ๋๋ฉด ์ด ์ธ์๋ค์ ๊ฐ๋ณ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ๋ฐฉ์ด์ ๋ณต์ฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค!!
๐ฎ ๋ชจ๋ "์ธ๋ถ์ ๊ณต๊ฐํ๋" ํ๋๊ฐ final ์ด์ด์ผ ํ๋ค.
๋ถ๋ณ ํด๋์ค๋ฅผ ๋ง๋๋ ๋ค์ฏ๊ฐ์ง ๊ท์น์ ๋ํด์ ํ์ตํ ๋๋ ๋ชจ๋ ํ๋๊ฐ final์ด๊ณ ์ด๋ค ๋ฉ์๋๋ ๊ทธ ๊ฐ์ ์์ ํ ์ ์์ด์ผ ํ๋ค๊ณ ํ์ง๋ง ์ฑ๋ฅ์ ์ํด ์ด์ง ์ํํ ์ ์๋ค. -> "์ด๋ค ๋ฉ์๋๋ ๊ฐ์ฒด์ ์ํ ์ค ์ธ๋ถ์ ๋น์น๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค"
์ด๋ค ๋ถ๋ณ ํด๋์ค๋ ๊ณ์ฐ ๋น์ฉ์ด ํฐ ๊ฐ์ ๋์ค์ ๊ณ์ฐํด์ final์ด ์๋ ํ๋์ ์บ์ํด๋๊ธฐ๋ ํ๋ค.
๋๊ฐ์ ๊ฐ์ ๋ค์ ์์ฒญํ๋ฉด ์บ์ํด๋ ๊ฐ์ ๋ฐํํ์ฌ ๊ณ์ฐ ๋น์ฉ์ ์ ๊ฐํ๋ ๊ฒ์ด๋ค!
๐ ์ ๋ฆฌ
- getter ๊ฐ ์๋ค๊ณ ํด์ ๋ฌด์กฐ๊ฑด setter๋ฅผ ๋ง๋ค์ง ๋ง์!
: ํด๋์ค๋ ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋ถ๋ณ์ด์ด์ผ ํ๋ค. ๋ถ๋ณ ํด๋์ค๋ ์ฅ์ ์ด ๋ง๊ณ ๋จ์ ์ด๋ผ๊ณ ํ ๊ฑด ํน์ ์ํฉ์์์ ์ ์ฌ์ ์ฑ๋ฅ ์ ํ๋ฟ์ด๋ค. (๊ฐ์ด ๋ค๋ฅด๋ฉด ๋ฐ๋์ ๋ณ๋์ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ผํจ)
- ๋ถ๋ณ์ผ๋ก ๋ง๋ค ์ ์๋ ํด๋์ค๋ผ๋ ๋ณ๊ฒฝํ ์ ์๋ ๋ถ๋ถ์ ์ต์ํ์ผ๋ก ์ค์ด์.
: ๋ชจ๋ ํด๋์ค๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋ค ์๋ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๊ฐ ๊ฐ์ง ์ ์๋ ์ํ์ ์๋ฅผ ์ค์ด๋ฉด ๊ทธ ๊ฐ์ฒด๋ฅผ ์์ธกํ๊ธฐ ์ฌ์์ง๊ณ ์ค๋ฅ๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ผญ ๋ณ๊ฒฝํด์ผ ํ ํ๋๋ฅผ ๋บ ๋๋จธ์ง๋ ๋ชจ๋ final๋ก ์ ์ธํ์!!
- ๋ค๋ฅธ ํฉ๋นํ ์ด์ ๊ฐ ์๋ค๋ฉด ๋ชจ๋ ํ๋๋ private final์ด์ด์ผ ํ๋ค.
- ์์ฑ์๋ ๋ถ๋ณ์ ์ค์ ์ด ๋ชจ๋ ์๋ฃ๋, ์ด๊ธฐํ๊ฐ ์๋ฒฝํ ๋๋ ์ํ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ค.
: ํ์คํ ์ด์ ๊ฐ ์๋ค๋ฉด ์์ฑ์์ ์ ์ ํฉํฐ๋ฆฌ ์ธ์๋ ๊ทธ ์ด๋ค ์ด๊ธฐํ ๋ฉ์๋๋ public์ผ๋ก ์ ๊ณตํด์๋ ์๋๋ค!