item 17 hyowon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
[item17] λ³κ²½ κ°λ₯μ±μ μ΅μννλΌ
λΆλ³ν΄λμ€λ?
μΈμ€ν΄μ€μ λ΄λΆ κ°μ μμ ν μ μλ ν΄λμ€
λ§₯λ½μ ν΄λμ€ μμμ΄ λΆκ°λ₯ final classλ₯Ό λ§νλκ² κ°μ§λ§, κ·Έλ³΄λ€ λ μμμ κ°λ μ΄λ€.
final ν΄λμ€λ λΆλ³ν΄λμ€ κ΅¬ν λ°©μ μ€ νλμ΄λ€.
λΆλ³ ν΄λμ€μ μ
String, κΈ°λ³Έ νμ μ λ°μ± ν΄λμ€, BigInteger, BigDecimal
item11μ PhoneNumber ν΄λμ€λ λΆλ³μ΄λ€.
μ₯μ
- λ¨μνλ€
- μμ±λ μμ μ μνλ₯Ό νκ΄΄λ λκΉμ§ κ·Έλλ‘ κ°μ§νλ―λ‘, λ΄λΆ κ°μ²΄μ λκ° λ€μμμ§ λͺ νν μ μ μλ€.
- κ°λ³ κ°μ²΄λ μμμ 볡μ‘ν μνμ λμΌ μ μμ΄, λ³κ²½μ λ©μλκ° μΌμΌν€λ μν μ μ΄λ₯Ό μ λ°νκ² λ¬Έμλ‘ λ¨κ²¨λμ§ μμΌλ©΄ λ―Ώκ³ μ¬μ©νκΈ° μ΄λ ΅λ€.
- μ€λ λ μμ νμ¬ λ°λ‘ λκΈ°νν νμκ° μλ€.
- μ¬λ¬ μ€λ λκ° λμμ μ¬μ©ν΄λ μ λ νΌμλμ§ μμΌλ, μμ¬νκ³ κ³΅μ ν μ μλ€. λ°λΌμ λΆλ³ ν΄λμ€λ ν λ² λ§λ μΈμ€ν΄μ€λ₯Ό μ΅λν μ¬νμ©νκΈ°λ₯Ό κΆνλ€. κ°μ₯ μ¬μ΄ μλ κ°μ μμ(public static final)λ‘ μ 곡νλ κ²μ΄λ€.
- λ°©μ΄μ 볡μ¬λ νμ μλ€.
- λΆλ³ κ°μ²΄λΌλ¦¬ λ΄λΆ λ°μ΄ν°λ₯Ό 곡μ ν μ μλ€.
- BigInteger ν΄λμ€ λ΄λΆμμ κ°μ λΆνΈμ ν¬κΈ°λ₯Ό λ°λ‘ νννλ€. λΆνΈλ int λ³μλ₯Ό, ν¬κΈ°λ int λ°°μ΄μ μ¬μ©νλ€. ν΄λΉ ν΄λμ€ λ΄λΆμ negate λ©μλλ ν¬κΈ°κ° κ°κ³ λΆνΈλ§ λ°λμΈ μλ‘μ΄ BigIntegerλ₯Ό μμ±νλλ° μ΄ λ μλ³Έ μΈμ€ν΄μ€μ int λ°°μ΄μ 곡μ νλ€.
- κ°μ²΄λ₯Ό λ§λ€ λ λ€λ₯Έ λΆλ³ κ°μ²΄λ€μ ꡬμ±μμλ‘ μ¬μ©νλ©΄ λΆλ³μμ μ μ§νκΈ° μμνλ€.
- λΆλ³ κ°μ²΄λ 맡μ ν€μ μ§ν©(Set)μ μμλ‘ μ°κΈ° μμ±λ§μΆ€μ΄λ€. 맡μ΄λ μ§ν©μ μμ λ΄κΈ΄ κ°μ΄ λ°λλ©΄ λΆλ³μμ΄ νλ¬Όμ΄μ§λλ°, λΆλ³ κ°μ²΄λ₯Ό μ¬μ©νλ©΄ κ·Έλ΄ μΌμ΄ μλ€.
λ¨μ
- κ°μ΄ λ€λ₯΄λ©΄ λ°λμ λ
립λ κ°μ²΄λ‘ λ§λ€μ΄μΌ νλ€.
- κ°μ κ°μ§μκ° λ§μΌλ©΄ μ΄λ€μ λͺ¨λ λ§λλλ° μκ°, 곡κ°μ μΌλ‘ ν° λΉμ©μ μΉλ¬μΌ νλ€.
- λμ²λ²μΌλ‘λ νν μ°μΌ λ€λ¨κ³ μ°μ°λ€μ μμΈ‘νμ¬ κΈ°λ³Έ κΈ°λ₯μΌλ‘ μ 곡νλ λ°©λ²μ μ¬μ©νλ©΄ λλλ°, 1) ν΄λΌμ΄μΈνΈκ° μνλ 볡μ‘ν μ°μ°μ μ νν μμΈ‘ν μ μλ€λ©΄ package-privateμ κ°λ³ λλ° ν΄λμ€λ‘ μΆ©λΆνκ³ , 2) κ·Έλ μ§ μλ€λ©΄ publicμΌλ‘ ν΄λμ€λ₯Ό μ 곡ν΄μΌ νλ€.
final ν€μλ
ν΄λμ€ μμμ
ν΄λΉ ν΄λμ€μ μμμ λ§λλ€.
λ©μλ μμμ
ν΄λΉ λ©μλμ μ€λ²λΌμ΄λ©, μ¦ μμν΄λμ€μμ μ¬μ μνλ κ²μ λ§λλ€.
λΆλ³ ν΄λμ€λ₯Ό λ§λλ κ·μΉ - P/F μ»΄λ³μ
- κ°μ²΄μ μνλ₯Ό λ³κ²½νλ λ©μλ(λ³κ²½μ)λ₯Ό μ 곡νμ§ μλλ€
- μμ λΆκ°λ₯νκ² λ§λ λ€
- μμλ°μ μ’μ§ μμ μλλ‘ λ©μλλ₯Ό λ³κ²½νλ κ²μ λ§λλ€.
- κ°λ¨νκ²λ final ν΄λμ€λ₯Ό μ μΈνλ λ°©λ²μ΄ μλ€.
- μ’λ μ μ°ν λ°©λ²μΌλ‘λ λͺ¨λ μμ±μλ₯Ό private νΉμ package-privateλ‘ λ§λ€κ³ public μ μ ν©ν°λ¦¬λ₯Ό μ 곡νλ€. (μ μ ν©ν°λ¦¬?)
- λͺ¨λ νλλ₯Ό finalλ‘ μ μΈνλ€
- λͺ¨λ νλλ₯Ό privateλ‘ μ μΈνλ€.
- public finalμ μ¬μ©ν΄λ λμ§λ§, κ·Έλ κ² λλ©΄ λ΄λΆ ννμ λ°κΏ μ μκ² λλ―λ‘, privateλ₯Ό μ¬μ©
- μμ μΈμλ λ΄λΆμ κ°λ³ μ»΄ν¬λνΈμ μ κ·Όν μ μλλ‘ νλ€.
- μ»΄ν¬λνΈλ?
- κ°κ° λ 립μ μΌλ‘ κΈ°λ₯νλ λͺ¨λ
- μ»΄ν¬λνΈ λ΄λΆκ° λλ¬λμ μλκ³ , κΉλ³΄λ € ν΄μλ μλ¨
- λ€λ§, ν΄λΉ μ»΄ν¬λνΈλ₯Ό μ¬μ©νκ² ν΄μ£Όλ 'μ₯μΉ'λ νμνλ€.
- νλμ¨μ΄ μͺ½μμ μ€λ§νΈν°μ λ°°ν°λ¦¬κ° λͺ»μ°κ² λλ©΄ λ€λ₯Έ κ±Έλ‘ κ°μλ μ μμ
- λ¨, λ°°ν°λ¦¬λ μ€λ§νΈν° λ¨μμ λ°°ν°λ¦¬ λ¨μμ λ§λ¬Όλ €μΌ μ¬μ©κ°λ₯νλ°, μ΄ λ λ°°ν°λ¦¬ λ¨μκ° 'μ₯μΉ'μ ν΄λΉνλ€.
- OOPμ class κ°λ κ³Όλ λ€λ₯΄λ€. μ»΄ν¬λνΈμ μ μλ§ μΆ©μ‘±νλ€λ©΄ νλμ μ»΄ν¬λνΈ μμ ν΄λμ€κ° μ¬λ¬κ° λ€μ΄κ° μλ μλ€.
λΆλ³ν΄λμ€μ λ€λ₯Έ μ
public final class Complex { // 2. μμ λΆκ°λ₯
private final double re;
private final double im; // 3,4. λͺ¨λ νλλ₯Ό private final μ μΈ
// 1. λ³κ²½μ λ©μλ μμ
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(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)";
}
}
-
μ ν΄λμ€λ 볡μμ(μ€μλΆ νμλΆ)λ₯Ό νννλ€. Object λ©μλλ₯Ό μ¬μ μνκ³ , μ€μλΆ νμλΆ κ°μ λ°ννλ μ κ·Όμ λ©μλμ μ¬μΉμ°μ° λ©μλλ₯Ό μ μνλ€.
-
μ¬μΉμ°μ° λ©μλλ€μ΄ μΈμ€ν΄μ€ μμ μ μμ νμ§ μκ³ μλ‘μ΄ Complex μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄ λ°ννλ λͺ¨μ΅μ μ£Όλͺ©
-
μ΄μ²λΌ νΌμ°μ°μμ ν¨μλ₯Ό μ μ©ν΄ κ·Έ κ²°κ³Όλ₯Ό λ°ννμ§λ§, νΌμ°μ°μ μ체λ κ·Έλλ‘μΈ νλ‘κ·Έλλ° ν¨ν΄μ
ν¨μν νλ‘κ·Έλλ°
μ΄λΌ νλ€.
(μμ λ¬λ¦¬ μ μ°¨μ , λͺ λ Ήν νλ‘κ·Έλλ°μμλ λ©μλμμ νΌμ°μ°μμΈ μμ μ μμ ν΄ μμ μ μνκ° λ³νλ€.) -
λ©μλ μ΄λ¦μΌλ‘ λμ¬(add) λμ μ μΉμ¬(plus)λ₯Ό μ¬μ©ν μ μλ μ£Όλͺ©νμ. μ΄λ ν΄λΉ λ©μλκ° κ°μ²΄μ κ°μ λ³κ²½νμ§ μλλ€λ μ¬μ€μ κ°μ‘°νλ €λ μλ. μ°Έκ³ λ‘, μ΄ λͺ λͺ κ·μΉμ λ°λ₯΄μ§ μμ
BigInteger
μBigDecimal
ν΄λμ€λ₯Ό μ¬λλ€μ΄ μλͺ» μ¬μ©ν΄ μ€λ₯κ° λ°μνλ μΌμ΄ μμ£Ό μλ€.BigDecimal test = new BigDecimal("1.111"); // test1 test.add(new BigDecimal("2.222")); System.out.println("test : " + test); // 1.111 // test2 test = test.add(new BigDecimal("2.222")); System.out.println("test : " + test); // 3.333
-
λμ¬ add λ‘ λͺ λͺ λμ΄ μμ΄, λ§μΉ νΌμ°μ°μμΈ μμ μ΄ λ³κ²½λ κ² κ°μ§λ§, κ·Έλ μ§ μλ€. addλΌλ μ΄λ¦λ³΄λ€λ plusκ° λ μ΄μΈλ¦¬λ λ©μλμ΄λ€.
( κ·Έλ¬λ μ΄λ―Έ plusλΌλ λ€λ₯Έ λ©μλκ° μ‘΄μ¬νλ©°, λ€λ₯Έ κΈ°λ₯μ μννλ€.)
μ BigIntegerκ° λΆλ³μΌκΉ?
- BigDecimalμ addλ©μλλ₯Ό μννλ©΄ 1.111μ λ΄μ κ°μ²΄κ° λ³κ²½λμ§ μμ΅λλ€. νΌμ°μ°μλ₯Ό κ°μ§κ³ μλ‘ BigInteger κ°μ²΄λ₯Ό μμ±νκ² λ©λλ€.
μ 리
- ν΄λμ€λ κΌ νμν κ²½μ°κ° μλλΌλ©΄ λΆλ³μ΄μ΄μΌ νλ€.
- λΆλ³ ν΄λμ€λ μ₯μ μ΄ λ§μΌλ©°, λ¨μ μ΄λΌκ³€ νΉμ μν©μμμ μ μ¬μ μ±λ₯ μ νλΏμ΄λ€.
- λ§μ½ λΆλ³μΌλ‘ λ§λ€ μ μλ ν΄λμ€λΌλ λ³κ²½ν μ μλ λΆλΆμ μ΅μνμΌλ‘ μ€μ΄μ. λ€λ₯Έ ν©λΉν μ΄μ κ° μλ€λ©΄ λͺ¨λ νλλ private finalμ΄μ΄μΌ νλ€.
- μμ±μλ λΆλ³μ μ€μ μ΄ λͺ¨λ μλ£λ, μ΄κΈ°νκ° μλ²½ν λλ μνμ κ°μ²΄λ₯Ό μμ±ν΄μΌ νλ€.