Skip to content

Latest commit

ย 

History

History
106 lines (77 loc) ยท 3.93 KB

File metadata and controls

106 lines (77 loc) ยท 3.93 KB

๊ทœ์น™5. ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด๋Š” ๋งŒ๋“ค์ง€ ๋ง๋ผ

๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•œ ๊ฐ์ฒด๋Š” ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ์žฌ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค.

1. ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ(immutable) ๊ฐ์ฒด๋Š” ์–ธ์ œ๋‚˜ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

String s = new String("stringette");
String s = "stringette"; // ๋ฐ”๋žŒ์ง
  • ์ˆœํ™˜๋ฌธ์ด๋‚˜ ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ ์•ˆ์— ์žˆ์„ ๊ฒฝ์šฐ ์ฐจ์ด.
  • ์•„๋ž˜์˜ ๊ฒฝ์šฐ ๊ฐ€์ƒ ๋จธ์‹ (virtual machine)์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ํ•ด๋‹น String ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉ.
new Boolean("true");
Boolean.valueOf("true"); // ๋Œ€์ฒด๋กœ ๋” ๋ฐ”๋žŒ์ง
  • ์ƒ์„ฑ์ž์™€ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ
    ์ƒ์„ฑ์ž ๋Œ€์‹  ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊ฐ€ ๋งŽ๋‹ค.

2. ๋ณ€๊ฒฝํ•  ์ผ์ด ์—†๋‹ค๋ฉด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

public class Person {
  private final Date birthDate;

  public boolean isBabyBoomer() {
    Calendar gmtCal = 
      Calendar.getInstance(TimeZone.getTimeZone("GMT"));
      
    gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
    Date boomStart = gmtCal.getTime();

    gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
    Date boomEnd = gmtCal.getTime();

    return birthDate.compareTo(boomStart) >= 0 &&
      birthDate.compareTo(boomEnd) < 0;
  }
}
  • ์œ„ ์ฝ”๋“œ๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋งˆ๋‹ค Calendar ๊ฐ์ฒด ํ•˜๋‚˜, TimeZone ๊ฐ์ฒด ํ•˜๋‚˜, Date ๊ฐ์ฒด ๋‘ ๊ฐœ๋ฅผ ์“ธ๋ฐ์—†์ด ๋งŒ๋“ ๋‹ค.
public class Person {
  private final Date birthDate;

  /**
   * ๋ฒ ์ด๋น„ ๋ถ ์‹œ๋Œ€์˜ ์‹œ์ž‘๊ณผ ๋
   */
   private static final Date BOOM_START;
   private static final Date BOOM_END;

   static {
     Calendar gmtCal = 
       Calendar.getInstance(TimeZone.getTimeZone("GMT"));
       
     gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
     BOOM_START = gmtCal.getTime();
 
     gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
     BOOM_END = gmtCal.getTime();
   }

  public boolean isBabyBoomer() {
    return birthDate.compareTo(BOOM_START) >= 0 &&
      birthDate.compareTo(BOOM_END) < 0;
  }
}
  • ์ •์  ์ดˆ๊ธฐํ™” ๋ธ”๋ก(static initializer)์„ ํ†ตํ•ด ๊ฐœ์„ .
  • boomStart์™€ boomEnd๋ฅผ static final ํ•„๋“œ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ƒ์ˆ˜์ž„์„ ๋ถ„๋ช…ํžˆ ํ•จ.

- Person ํด๋ž˜์Šค๊ฐ€ ์ดˆ๊ธฐํ™”๋„๋‹ˆ ๋‹ค์Œ isBabyBoomer ๋ฉ”์„œ๋“œ๊ฐ€ ํ•œ ๋ฒˆ๋„ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์“ธ๋ฐ์—†๋Š” ์ดˆ๊ธฐํ™”์ด๋‹ค. - ์ดˆ๊ธฐํ™” ์ง€์—ฐ(lazy initialization) ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,
๊ตฌํ˜„์ด ๋ณต์žกํ•ด์งˆ ๋ฟ๋”๋Ÿฌ ์•ž์„œ ๋‹ฌ์„ฑํ•œ ๊ฒƒ ์ด์ƒ์œผ๋กœ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ๋„ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š”๋‹ค.

3. ์ž๋™ ๊ฐ์ฒดํ™”(autoboxing)์„ ์œ ์˜ํ•ด๋ผ.

public static void main(String[] args) {
  Long sum = 0L; // long์ด ์•„๋‹ˆ๋ผ Long์œผ๋กœ ์„ ์–ธ๋จ.
  for (long i = 0; i < Integer.MAX_VALUE; i++) {
    sum += i;
  }
  System.out.println(sum);
}
  • Long sum์ด ๋”ํ•ด์งˆ ๋•Œ ๋งˆ๋‹ค Long ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • ๊ฐ์ฒด ํ‘œํ˜„ํ˜• ๋Œ€์‹  ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•˜๊ณ , ์ƒ๊ฐ์ง€๋„ ๋ชปํ•œ ์ž๋™ ๊ฐ์ฒดํ™”๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์œ ์˜.
  • ํ•˜์ง€๋งŒ ์ฝ”๋“œ์˜ ๋ช…ํ™•์„ฑ๊ณผ ๋‹จ์ˆœ์„ฑ์„ ๋†’์ด๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

4. ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด ํ’€(object pool)์„ ๋งŒ๋“ค์–ด ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ”ผํ•˜๋Š” ๊ธฐ๋ฒ•

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ฐ™์€ ๊ฐ์ฒด ์ƒ์„ฑ ๋น„์šฉ์ด ๊ทน๋‹จ์ ์œผ๋กœ ๋†’์ง€ ์•Š๋‹ค๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ์ตœ์‹  JVM์€ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ ์“ฐ๋ ˆ๊ธฐ ์ˆ˜์ง‘๊ธฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์„œ,
    ๊ฐ€๋ฒผ์šด(lightweight) ๊ฐ์ฒด๋ผ๋ฉด ๊ฐ์ฒด ํ’€๋ณด๋‹ค ์›”๋“ฑํ•œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค€๋‹ค.

5. ๋ฐฉ์–ด์  ๋ณต์‚ฌ(defensive copy)

  • ๋ฐฉ์–ด์  ๋ณต์‚ฌ๊ฐ€ ์š”๊ตฌ๋˜๋Š” ์ƒํ™ฉ์—์„œ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ์€
    ์“ธ๋ฐ์—†์ด ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๋ฒŒ ๋งŒ๋“œ๋Š” ๋น„์šฉ๋ณด๋‹ค ํ›จ์”ฌ ๋†’๋‹ค.
  • ๊ณจ์น˜ ์•„ํ”ˆ ๋ฒ„๊ทธ๋‚˜ ๋ณด์•ˆ ๊ฒฐํ•จ์ด ์ƒ๊ธธ ์ˆ˜ ๋„ ์žˆ์œผ๋‹ˆ ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ณธ์—๋Š” ์žฌ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.