item 17 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ต์ํํ๋ผ
- ๋ถ๋ณ ํด๋์ค
์ธ์คํด์ค์ ๋ด๋ถ ๊ฐ์ ์์ ํ ์ ์๋ ํด๋์ค
String, ๊ธฐ๋ณธ ํ์ ์ ๋ฐ์ฑ๋ ํด๋์ค, BigInteger, BicDecimal
ํด๋์ค๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋ค๊ธฐ ์ํ ๋ค์ฏ ๊ฐ์ง ๊ท์น
- ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋(๋ณ๊ฒฝ์)๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
- ํด๋์ค๋ฅผ ํ์ฅํ ์ ์๋๋ก ํ๋ค.
- ์์์ ๋ง๋ final๋ก ์ ์ธ
- ๋ชจ๋ ํ๋๋ฅผ final๋ก ์ ์ธํ๋ค.
- ์๋ก ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๋๊ธฐํ ์์ด ๋ค๋ฅธ ์ค๋ ๋๋ก ๊ฑด๋ค๋ ๋ฌธ์ ์์ด ๋์ํ๊ฒ๋ ๋ณด์ฅํ๋ ๋ฐ๋ ํ์ํ๋ค. - ์๋ฐ ์ธ์ด ๋ช ์ธ์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ ๋ถ๋ถ ์ฐธ๊ณ
- ๋ชจ๋ ํ๋๋ฅผ private์ผ๋ก ์ ์ธํ๋ค.
- ํ๋๊ฐ ์ฐธ์กฐํ๋ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ํด๋ผ์ด์ธํธ์์ ์ง์ ์ ๊ทผํด ์์ ํ๋ ์ผ์ ๋ง์์ค๋ค.
- ๊ธฐ์ ์ ์ผ๋ก๋ ๊ธฐ๋ณธ ํ์ ํ๋๋ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ํ๋๋ฅผ Public final๋ก๋ง ์ ์ธํด๋ ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ๋์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ๋ค์์ ๋ด๋ถ ํํ์ ๋ฐ๊พธ์ง ๋ชปํ๋ฏ๋ก ๊ถํ์ง ์์(์์ดํ 15, 16)
- ์์ ์ธ์๋ ๋ด๋ถ์ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
- ํด๋์ค์ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ํ๋๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด ํด๋ผ์ด์ธํธ์์ ๊ทธ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ์ป์ ์ ์๋๋ก ํด์ผ ํ๋ค.
- ์์ฑ์, ์ ๊ทผ์ readObject ๋ฉ์๋(์์ดํ 88) ๋ชจ๋์์ ๋ฐฉ์ด์ ๋ณต์ฌ๋ฅผ ์ํํ๋ผ.
๋ถ๋ณ ๋ณต์์ ํด๋์ค
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);
public Complex(double re, double im) {
this.re = re;
this.im = im;
}
// ์ค์๋ถ์ ํ์๋ถ ๊ฐ์ ๋ฐํํ๋ ์ ๊ทผ์ ๋ฉ์๋
public double realPart() { return re; }
public double imaginaryPart() { return im; }
// ์ฌ์น์ฐ์ฐ ๋ฉ์๋ (plus, minus, times, dividedBy)
// plus ๋ผ๋ ๋ฉ์๋ ์ด๋ฆ - ๊ฐ์ฒด์ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์๋๋ค๋ ์๋
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;
// == ๋์ compare๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ 63์ชฝ์ ํ์ธํ๋ผ.
return Double.compare(c.re, re) == 0
&& Double.compare(c.im, im) == 0;
}
@Override public int hashCode() {
return 31 * Double.hashCode(re) + Double.hashCode(im);
}
@Override public String toString() {
return "(" + re + " + " + im + "i)";
}
}
- ์ฌ์น์ฐ์ฐ ๋ฉ์๋๋ค์ด ์ธ์คํด์ค ์์ ์ ์์ ํ์ง ์๊ณ ์๋ก์ด Complex ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋ ๋ชจ์ต์ ์ฃผ๋ชฉ
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
์ด์ฒ๋ผ ํผ ์ฐ์ฐ์์ ํจ์๋ฅผ ์ ์ฉํด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง๋ง ํผ์ฐ์ฐ์ ์์ฒด๋ ๊ทธ๋๋ก์ธ ํ๋ก๊ทธ๋๋ฐ ํจํด
๋ถ๋ณ ๊ฐ์ฒด๋ ๋จ์ํ๋ค.
๋ถ๋ณ ๊ฐ์ฒด๋ ๊ทผ๋ณธ์ ์ผ๋ก ์ค๋ ๋ ์์ ํ์ฌ ๋ฐ๋ก ๋๊ธฐํํ ํ์ ์๋ค.
์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ฌ์ฉํด๋ ์ ๋ ํผ์๋์ง ์๋๋ค.
- ๋ถ๋ณ ๊ฐ์ฒด์ ๋ํด์๋ ๊ทธ ์ด๋ค ์ค๋ ๋๋ ๋ค๋ฅธ ์ค๋ ๋์ ์ํฅ์ ์ค ์ ์์ผ๋ ๋ถ๋ณ ๊ฐ์ฒด๋ ์์ฌํ๊ณ ๊ณต์ ํ ์ ์๋ค.
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)์ ์ ๊ณตํ ์ ์๋ค.
// ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์
ํด๋์ค ์ ๋ถ์ BigInteger๊ฐ ์ฌ๊ธฐ ์ํ๋ค.
// ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ๊ฐ๋น์ง ์ปฌ๋ ์
๋น์ฉ์ด ์ค์ด๋ ๋ค.
- ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ ์ ์๋ค๋ ์ ์ ๋ฐฉ์ด์ ๋ณต์ฌ(์์ดํ 50)๋ ํ์ ์๋ค๋ ๊ฒฐ๋ก
- ๋ณต์ฌ๋ฅผ ํด๋ ์๋ณธ๊ฐ ๋๊ฐ์ผ๋ ์๋ฏธ๊ฐ ์๋ค.
- clone ๋ฉ์๋๋ ๋ณต์ฌ ์์ฑ์(์์ดํ 13)์ ์ ๊ณตํ์ง ์๋๊ฒ ์ข๋ค.
- String ํด๋์ค์ ๋ณต์ฌ ์์ฑ์๋ ๋๋๋ก ์ฌ์ฉํ์ง ๋ง์์ผํ๋ค. (์์ดํ 6)
๋ถ๋ณ ๊ฐ์ฒด๋ Set์ ์์๋ก ์ฐ๊ธฐ์ ์์ฑ๋ง์ถค
๋ถ๋ณ ๊ฐ์ฒด์ ๋จ์
- ๊ฐ์ด ๋ค๋ฅด๋ฉด ๋ฐ๋์ ๋ ๋ฆฝ๋ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ผ ํ๋ค.
BigInteger moby = ...;
moby = moby.flipBit(0);
// BigInteger์์ ๋นํธ ํ๋๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ค๊ณ ํ ๊ฒฝ์ฐ
BitSet moby = ...;
moby = moby.flip(0);
// BitSet์ ๊ฐ๋ณ์ด๋ค. ์ํ๋ ๋นํธ ํ๋๋ง ์์ ์๊ฐ์์ ๋ฐ๊ฟ์ฃผ๋ ๋ฉ์๋๋ฅผ ์ ๊ณต
๋ค๋จ๊ณ ์ฐ์ฐ๋ค์ ์์ธกํ์ฌ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ผ๋ก ์ ๊ณต
- String์ ๊ฐ๋ณ ๋๋ฐ ํด๋์ค - StringBuilder, StringBuffer
๋ถ๋ณ ํด๋์ค๋ฅผ ๋ง๋๋ ์ค๊ณ ๋ฐฉ๋ฒ
- ๋ชจ๋ ์์ฑ์๋ฅผ private ํน์ package-private์ผ๋ก ๋ง๋ค๊ณ public ์ ์ ํฉํ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ
public final class Complex {
private final double re;
private final double im;
**private** Complex(double re, double im) {
this.re = re;
this.im = im;
}
// ์ฝ๋ 17-2 ์ ์ ํฉํฐ๋ฆฌ(private ์์ฑ์์ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋ค.) (110-111์ชฝ)
public static Complex valueOf(double re, double im) {
return new Complex(re, im);
}
}
// ํจํค์ง ๋ฐ๊นฅ์ ํด๋ผ์ด์ธํธ์์ ๋ฐ๋ผ๋ณธ ์ด ๋ถ๋ณ ๊ฐ์ฒด๋ ์ฌ์ค์ final์ด๋ค.
// ์ ์ ํฉํฐ๋ฆฌ ๋ฐฉ์์ ๋ค์์ ๊ตฌํ ํด๋์ค๋ฅผ ํ์ฉํ ์ ์ฐ์ฑ์ ์ ๊ณตํ๊ณ ๊ฐ์ฒด ์บ์ฑ ๊ธฐ๋ฅ์ ์ถ๊ฐํด ์ฑ๋ฅ์ ๋์ด์ฌ๋ฆด ์๋ ์๋ค.
์ด๋ค ๋ฉ์๋๋ ๊ฐ์ฒด์ ์ํ์ค ์ธ๋ถ์ ๋น์น๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
ํต์ฌ ์ ๋ฆฌ
- getter๊ฐ ์๋ค๊ณ ํด์ ๋ฌด์กฐ๊ฑด setter๋ฅผ ๋ง๋ค์ง๋ ๋ง์.
- ํด๋์ค๋ ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋ถ๋ณ์ด์ด์ผ ํ๋ค.
- ๋จ์ํ ๊ฐ ๊ฐ์ฒด๋ ํญ์ ๋ถ๋ณ์ผ๋ก ๋ง๋ค์.
- ์ฑ๋ฅ ๋๋ฌธ์ ์ด์ฉ ์ ์๋ค๋ฉด ๋ถ๋ณ ํด๋์ค์ ์์ ์ด๋ฃจ๋ ๊ฐ๋ณ ๋๋ฐ ํด๋์ค๋ฅผ public ํด๋์ค๋ก ์ ๊ณตํ๋๋ก ํ์.