item 17 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
-
๋ถ๋ณ ํด๋์ค๋ ๊ฐ๋ณ ํด๋์ค๋ณด๋ค ์ค๊ณ, ๊ตฌํ, ์ฌ์ฉํ๊ธฐ ์ฌ์ฐ๋ฉฐ ์ค๋ฅ๋ ์๊ธธ ์ฌ์ง๋ ์ ๊ณ ํจ์ฌ ์์ ํ๋ค.
(ex String, ๊ธฐ๋ณธ ํ์ ์ ๋ฐ์ฑ๋ ํด๋์ค๋ค, BigInteger, BigDecimal ๋ฑ)
- ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋(๋ณ๊ฒฝ์)๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
- ํด๋์ค๋ฅผ ํ์ฅํ ์ ์๋๋ก ํ๋ค.
- ๋ชจ๋ ํ๋๋ฅผ final๋ก ์ ์ธํ๋ค.
- ๋ชจ๋ ํ๋๋ฅผ privated์ผ๋ก ์ ์ธํ๋ค.
- ์์ ์ธ์๋ ๋ด๋ถ์ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
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;
// == ๋์ 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 ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋ ๋ชจ์ต์ ์ฃผ๋ชฉํ์.
- ์ ์ฒ๋ผ
ํผ์ฐ์ฐ์์ ํจ์๋ฅผ ์ ์ฉํด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง๋ง, ํผ์ฐ์ฐ์ ์์ฒด๋ ๊ทธ๋๋ก์ธ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
์ด๋ผ ํ๋ค. - ๋ํ add์ ๊ฐ์ ๋์ฌ ๋์ plus ์ ์น์ฌ๋ฅผ ์ฌ์ฉํ ์ ๋ ์ฃผ๋ชฉํ์. ์ด๋ ๋ฉ์๋๊ฐ ๊ฐ์ฒด์ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์๋๋ค๋ ์ฌ์ค์ ๊ฐ์กฐํ๋ ค๋ ์๋๋ค. ์ฐธ๊ณ ๋ก, ์ด ๋ช ๋ช ๊ท์น์ ๋ฐ๋ฅด์ง ์์ BigInteger์ BigDecimal ํด๋์ค๋ฅผ ์ฌ๋๋ค์ด ์๋ชป ์ฌ์ฉํด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ผ์ด ์์ฃผ ์๋ค.
- ๋ถ๋ณ ๊ฐ์ฒด๋ ๊ทผ๋ณธ์ ์ผ๋ก ์ค๋ ๋์ ์์ ํ์ฌ ๋ฐ๋ก ๋๊ธฐํํ ํ์ ์๋ค. ๋ฐ๋ผ์ ์์ฌํ๊ณ ๊ณต์ ํ ์ ์์์ ๋ฌผ๋ก , ๋ถ๋ณ ๊ฐ์ฒด๋ผ๋ฆฌ๋ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์๋ค.
- ๋ถ๋ณ ๊ฐ์ฒด๋ ๊ทธ ์์ฒด๋ก ์คํจ ์์์ฑ์ ์ ๊ณตํ๋ค. ์ํ๊ฐ ์ ๋ ๋ณํ์ง ์์ผ๋ ์ ๊น์ด๋ผ๋ ๋ถ์ผ์น ์ํ์ ๋น ์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค.
- ์์ฃผ ์ฌ์ฉ๋๋ ์ธ์คํด์ค๋ฅผ ์บ์ฑํ์ฌ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ค๋ณต ์์ฑํ์ง ์๊ฒ ํด์ฃผ๋ ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ ๊ณตํ ์ ์๋ค. ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ํด๋์ค ์ ๋ถ์ BigInteger๊ฐ ์ฌ๊ธฐ ์ํ๋ค.
- ๊ฐ์ด ๋ค๋ฅด๋ฉด ๋ฐ๋์ ๋ ๋ฆฝ๋ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ผ ํ๋ค. ์ด ๋, ์ํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ๊น์ง์ ๋จ๊ณ๊ฐ ๋ง๊ณ , ๊ทธ ์ค๊ฐ ๋จ๊ณ์์ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ค์ด ๋ชจ๋ ๋ฒ๋ ค์ง๋ค๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ ๋ถ๊ฑฐ์ง๋ค.
- final ํด๋์ค๋ก ์ ์ธํ๋ค.
- ๋ชจ๋ ์์ฑ์๋ฅผ private or package-private๋ก ์ ์ธํ๊ณ Public ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค. ๋ค์ ๊ตฌํ ํด๋์ค๋ฅผ ํ์ฉํ ์ ์ฐ์ฑ, ์บ์ฑ ๊ธฐ๋ฅ ๋ฑ ๋ถ๊ฐ ์์ ์ฒ๋ฆฌ๊ฐ ์ฉ์ดํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ๋ฒ์ด ์ต์ ์ผ ๋๊ฐ ๋ง๋ค.
๋ค๋ฅธ ํฉ๋นํ ์ด์ ๊ฐ ์๋ค๋ฉด ๋ชจ๋ ํ๋๋ private final ์ด์ด์ผ ํ๋ค!
์์ฑ์๋ ๋ถ๋ณ์ ์ค์ ์ด ๋ชจ๋ ์๋ฃ๋, ์ด๊ธฐํ๊ฐ ์๋ฒฝํ ๋๋ ์ํ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ค.
ํ์คํ ์ด์ ๊ฐ ์๋ค๋ฉด ์์ฑ์์ ์ ์ ํฉํฐ๋ฆฌ ์ธ์๋ ๊ทธ ์ด๋ค ์ด๊ธฐํ ๋ฉ์๋๋ public์ผ๋ก ์ ๊ณตํด์๋ ์ ๋๋ค.
๊ฐ์ฒด๋ฅผ ์ฌํ์ฉํ ๋ชฉ์ ์ผ๋ก ์ํ๋ฅผ ๋ค์ ์ด๊ธฐํํ๋ ๋ฉ์๋๋ ์ ๋๋ค.