item 17 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

์•„์ดํ…œ17 ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๋ผ

  • ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋Š” ๊ฐ€๋ณ€ ํด๋ž˜์Šค๋ณด๋‹ค ์„ค๊ณ„, ๊ตฌํ˜„, ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ ์˜ค๋ฅ˜๋„ ์ƒ๊ธธ ์—ฌ์ง€๋„ ์ ๊ณ  ํ›จ์”ฌ ์•ˆ์ „ํ•˜๋‹ค. (ex String, ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ•์‹ฑ๋œ ํด๋ž˜์Šค๋“ค, BigInteger, BigDecimal ๋“ฑ)

๋ถˆ๋ณ€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” 5๊ฐ€์ง€ ๊ทœ์น™

  • ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ(๋ณ€๊ฒฝ์ž)๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์—†๋„๋ก ํ•œ๋‹ค.
  • ๋ชจ๋“  ํ•„๋“œ๋ฅผ 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๊ฐ€ ์—ฌ๊ธฐ ์†ํ•œ๋‹ค.

๋‹จ์ 

  • ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด ๋ฐ˜๋“œ์‹œ ๋…๋ฆฝ๋œ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์ด ๋–„, ์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์™„์„ฑํ•˜๊ธฐ๊นŒ์ง€์˜ ๋‹จ๊ณ„๊ฐ€ ๋งŽ๊ณ , ๊ทธ ์ค‘๊ฐ„ ๋‹จ๊ณ„์—์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋“ค์ด ๋ชจ๋‘ ๋ฒ„๋ ค์ง„๋‹ค๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋” ๋ถˆ๊ฑฐ์ง„๋‹ค.

๋ถˆ๋ณ€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋˜ ๋‹ค๋ฅธ ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋“ค

  1. final ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•œ๋‹ค.
  2. ๋ชจ๋“  ์ƒ์„ฑ์ž๋ฅผ private or package-private๋กœ ์„ ์–ธํ•˜๊ณ  Public ์ •์  ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋‹ค์ˆ˜ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•œ ์œ ์—ฐ์„ฑ, ์บ์‹ฑ ๊ธฐ๋Šฅ ๋“ฑ ๋ถ€๊ฐ€ ์ž‘์—… ์ฒ˜๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•์ด ์ตœ์„ ์ผ ๋•Œ๊ฐ€ ๋งŽ๋‹ค.

ํ•ต์‹ฌ์ •๋ฆฌ

๋‹ค๋ฅธ ํ•ฉ๋‹นํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด ๋ชจ๋“  ํ•„๋“œ๋Š” private final ์ด์–ด์•ผ ํ•œ๋‹ค!
์ƒ์„ฑ์ž๋Š” ๋ถˆ๋ณ€์‹ ์„ค์ •์ด ๋ชจ๋‘ ์™„๋ฃŒ๋œ, ์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฒฝํžˆ ๋๋‚œ ์ƒํƒœ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
ํ™•์‹คํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด ์ƒ์„ฑ์ž์™€ ์ •์  ํŒฉํ„ฐ๋ฆฌ ์™ธ์—๋Š” ๊ทธ ์–ด๋–ค ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ๋„ public์œผ๋กœ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.
๊ฐ์ฒด๋ฅผ ์žฌํ™œ์šฉํ•  ๋ชฉ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋„ ์•ˆ ๋œ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ