[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item17. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™” ํ•˜๋ผ. (๋ถˆ๋ณ€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ณ ๋ คํ•  ๊ฒƒ)

2023. 2. 28. 11:02ใ†JAVA/Effective JAVA

728x90

 

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item17. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๋ผ. 

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item17. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™” ํ•˜๋ผ. (๋ถˆ๋ณ€ ํด๋ž˜์Šค์˜ ์žฅ์ ๊ณผ ๋‹จ์ ) (tistory.com)

 

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item17. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™” ํ•˜๋ผ. (๋ถˆ๋ณ€ ํด๋ž˜์Šค์˜ ์žฅ์ ๊ณผ ๋‹จ์ )

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item17. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๋ผ. [์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item17. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™” ํ•˜๋ผ. (๋ถˆ๋ณ€ ํด๋ž˜์Šค) (tistory.com) [์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item17. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™” ํ•˜๋ผ. (๋ถˆ๋ณ€ ํด๋ž˜์Šค) [

hyejin.tistory.com

์ €๋ฒˆ ๊ธ€์—์„œ ๋ถˆ๋ณ€ ํด๋ž˜์Šค์˜ ๊ฐœ๋…๊ณผ  ๋งŒ๋“œ๋Š” ๋‹ค์„ฏ๊ฐ€์ง€ ๊ทœ์น™, ๊ทธ๋ฆฌ๊ณ  ๋ถˆ๋ณ€ ํด๋ž˜์Šค์˜ ์žฅ์ ๊ณผ ๋‹จ์ ์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ๋‹ค. 

๋ถˆ๋ณ€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ๋‹ค์„ฏ๊ฐ€์ง€ ๊ทœ์น™์— ๋”ํ•ด์„œ ์˜ค๋Š˜์€  ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ ์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ–ˆ๋‹ค. 

 

 

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

ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์—†๋„๋ก ํ•ด์•ผํ•œ๋‹ค๊ณ  ํ–ˆ๊ณ , ์ƒ์†์„ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์œผ๋กœ 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์œผ๋กœ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค! 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90