์šฐ๋ฆฌ๋Š” private์„ ํ†ตํ•ด ๋ณ€์ˆ˜๋ฅผ ์ž์ฃผ ์ •์˜ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ๋‚จ๋“ค์ด ๋ณ€์ˆ˜์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ get, set ํ•จ์ˆ˜๋ฅผ ๋‹น์—ฐํ•˜๊ฒŒ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฒ”ํ•œ๋‹ค.

์ž๋ฃŒ ์ถ”์ƒํ™”

// ๊ตฌ์ฒด์ ์ธ Point ํด๋ž˜์Šค
public class Point { 
  public double x; 
  public double y;
}

์ด ๊ฒฝ์šฐ public์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ฐ’์„ ์ฝ๊ณ  ์„ค์ •ํ•˜๋„๋ก ๊ฐ•์ œํ•œ๋‹ค. ๋˜ Point๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ธ ์ง๊ต์ขŒํ‘œ๊ณ„๋ฅผ ์‚ฌ์šฉํ•จ์„ ์€์—ฐ์ค‘์— ๋‚ดํฌํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿผ ๋งŒ์•ฝ ์—ฌ๊ธฐ์„œ get, set์— ๊ด€ํ•œ ํ•จ์ˆ˜๋งŒ ์ œ๊ณตํ•˜๊ณ  ๋ณ€์ˆ˜๋ฅผ privateํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ๊ฐ์ถฐ์ง€๋Š” ๊ฑธ๊นŒ? ์•„๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๊ตฌํ˜„ ์‚ฌํ•ญ์„ ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ•˜๋Š” ์…ˆ์ด๋‹ค. ๋ณ€์ˆ˜ ์‚ฌ์ด์— ํ•จ์ˆ˜๋ผ๋Š” ๊ณ„์ธต์„ ๋„ฃ๋Š”๋‹ค๊ณ  ๊ตฌํ˜„์ด ๊ฐ์ถฐ์ง€์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ตฌํ˜„์„ ๊ฐ์ถ”๋ ค๋ฉด ์ถ”์ƒํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

// ์ถ”์ƒ์ ์ธ Point ํด๋ž˜์Šค
public interface Point {
  double getX();
  double getY();
  void setCartesian(double x, double y); 
  double getR();
  double getTheta();
  void setPolar(double r, double theta); 
}

์ €์ž๊ฐ€ ์›ํ•˜๋Š” class๋Š” ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์ด๋‹ค. ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌํ˜„์„ ๋ชจ๋ฅธ์ฒด ์ž๋ฃŒ์˜ ํ•ต์‹ฌ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์œ„ ๊ฐ™์€ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ๊ตฌํ˜„์ด ์ง๊ต์ขŒํ‘œ๊ณ„๋กœ ๋˜์–ด ์žˆ๋Š”์ง€ ๊ทน์ขŒํ‘œ๊ณ„๋กœ ๋˜์–ด์žˆ๋Š”์ง€ ์•Œ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

// ๊ตฌ์ฒด์ ์ธ Vehicle ํด๋ž˜์Šค
public interface Vehicle {
  double getFuelTankCapacityInGallons();
  double getGallonsOfGasoline();
}

๋‘ ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด, ๊ทธ๋ƒฅ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ์ฝ์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์Œ์„ ์ง๊ด€์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ฌผ๋ก  ์•„๋‹์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ณ€์ˆ˜๋ช…๋งŒ ๋ณด์•˜์„ ๋•Œ ๊ทธ๋Ÿฌํ•˜๋‹ค๋Š” ์–˜๊ธฐ)

// ์ถ”์ƒ์ ์ธ Vehicle ํด๋ž˜์Šค
public interface Vehicle {
  double getPercentFuelRemaining();
}

๋ฐ˜๋ฉด ์ด ๊ฒฝ์šฐ Percent๋ผ๋Š” ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์œผ๋กœ ์•Œ๋ ค์ฃผ๊ณ  ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ์ •๋ณด๊ฐ€ ์–ด๋””์„œ ์˜ค๋Š”์ง€ ์‚ฌ์šฉ์ž ์ธก์—์„œ๋Š” ์•Œ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

์š”์•ฝ

  • ์ž๋ฃŒ๋ฅผ ์„ธ์„ธํžˆ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค, ๊ฐœ๋…์„ ๋‚ดํฌํ•˜๋Š” ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ํ‘œํ˜„ํ•ด๋ผ.
  • ์ด ๊ณผ์ •์—์„œ ๋‹จ์ˆœํžˆ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์กฐํšŒ/์„ค์ • ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ถ”์ƒํ™”๋ฅผ ์ด๋ฃฐ ์ˆ˜ ์—†๋‹ค.
  • ์•„๋ฌด ์ƒ๊ฐ ์—†์ด ์กฐํšŒ/์„ค์ • ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๋‚˜์˜๋‹ค.

์ž๋ฃŒ / ๊ฐ์ฒด ๋น„๋Œ€์นญ

์ž๋ฃŒ ์ถ”์ƒํ™” ์ ˆ์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜ ๋ณธ์งˆ์€ ๋ฌด์—‡์ผ๊นŒ? ์ด๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์™€ ๊ฐ์ฒด์˜ ์ฐจ์ด๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ž๋ฃŒ ๊ตฌ์กฐ์™€ ๊ฐ์ฒด์˜ ํŠน์ง•๋ถ€ํ„ฐ ์•Œ์•„๋ณด๋Š” ๊ฒƒ์ด ์ˆ˜์ˆœ์— ๋งž์„ ๊ฒƒ์ด๋‹ค.

  • ์ž๋ฃŒ๊ตฌ์กฐ
    • ์ž๋ฃŒ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ณต๊ฐœํ•˜๋ฉฐ ๋ณ„๋‹ค๋ฅธ ํ•จ์ˆ˜๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฐ์ฒด
    • ์ถ”์ƒํ™” ๋’ค๋กœ ์ž๋ฃŒ๋ฅผ ์ˆจ๊ธด ์ฑ„ ์ž๋ฃŒ๋ฅผ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜๋งŒ ๊ณต๊ฐœํ•œ๋‹ค.

์ฆ‰, ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ ์ž๋ฃŒ์— ์ง‘์ค‘ํ•˜๊ณ , ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜์— ์ง‘์ค‘ํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ ๋‘ ๊ฐœ๋…์€ ๊ต‰์žฅํžˆ ์ƒ๋ฐ˜๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

// ์ ˆ์ฐจ์ ์ธ ๋„ํ˜•
public class Square { 
  public Point topLeft; 
  public double side;
}
 
public class Rectangle { 
  public Point topLeft; 
  public double height; 
  public double width;
}
 
public class Circle { 
  public Point center; 
  public double radius;
}
 
public class Geometry {
  public final double PI = 3.141592653589793;
  
  public double area(Object shape) throws NoSuchShapeException {
    if (shape instanceof Square) { 
      Square s = (Square)shape; 
      return s.side * s.side;
    } else if (shape instanceof Rectangle) { 
      Rectangle r = (Rectangle)shape; 
      return r.height * r.width;
    } else if (shape instanceof Circle) {
      Circle c = (Circle)shape;
      return PI * c.radius * c.radius; 
    }
    throw new NoSuchShapeException(); 
  }
}

์ด ์ฝ”๋“œ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์˜ ์ž…์žฅ์—์„œ ๊ฐ ๋‹ค๊ฐํ˜•์˜ ๋„“์ด๋ฅผ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณธ ๊ฒƒ์ด๋‹ค. ์ž๋ฃŒ ๊ตฌ์กฐ์— ๋งž๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋‹ค ๋ณด๋‹ˆ ๊ฐ’์— ๋Œ€ํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๊ณ , ํ•จ์ˆ˜๋Š” ๋งŒ๋“ค์ง€ ์•Š์•˜๋‹ค. ์ด ๊ฒฝ์šฐ, area๋ผ๋Š” ๋™์ž‘์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” if๋ฌธ์„ ํ†ตํ•ด ์ ˆ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ๋‘˜๋ ˆ์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” perimeter()ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–จ๊นŒ? Geometry ๋‚ด๋ถ€์— ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋์ด๋‹ค. ๊ธฐ์กด ์ž๋ฃŒ๊ตฌ์กฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฒˆ์—๋Š” ์ƒˆ๋กœ์šด ๋„ํ˜•์ธ ์˜ค๊ฐํ˜•์„ ๋„ฃ์–ด๋ณธ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์ด ๊ฒฝ์šฐ์—๋Š” Geometry์— ์†ํ•œ ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

// ๋‹คํ˜•์ ์ธ ๋„ํ˜•
public class Square implements Shape { 
  private Point topLeft;
  private double side;
  
  public double area() { 
    return side * side;
  } 
}
 
public class Rectangle implements Shape { 
  private Point topLeft;
  private double height;
  private double width;
 
  public double area() { 
    return height * width;
  } 
}
 
public class Circle implements Shape { 
  private Point center;
  private double radius;
  public final double PI = 3.141592653589793;
 
  public double area() {
    return PI * radius * radius;
  } 
}

์ด๋ฒˆ์—๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค. ๋ณ€์ˆ˜๋ฅผ ๊ฐ์ถ”์—ˆ๊ณ , ํ•จ์ˆ˜๋กœ๋งŒ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋„๋ก ์—ด์–ด์ฃผ์—ˆ๋‹ค.

perimeter() ์ถ”๊ฐ€๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๋ชจ๋“  ํด๋ž˜์Šค์— ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์˜ค๊ฐํ˜•์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋‹จ์ˆœํžˆ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๊ทธ์— ๋งž๋Š” ๋ฉ”์„œ๋“œ๋งŒ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ์‚ฌ์‹ค์ƒ ๋ฐ˜๋Œ€์˜ ์˜์—ญ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๊ทผ๋ณธ์ ์œผ๋กœ ์–‘๋ถ„๋˜๋Š” ์„ฑ์งˆ์„ ์ง€๋‹Œ๋‹ค.

์š”์•ฝ

๋””๋ฏธํ„ฐ ๋ฒ•์น™(Law of Demeter)

๋ชจ๋“ˆ์€ ์ž์‹ ์ด ์กฐ์ž‘ํ•˜๋Š” ๊ฐ์ฒด์˜ ์†์‚ฌ์ •์„ ๋ชฐ๋ผ์•ผ ํ•œ๋‹ค.

๋Œ€ํ‘œ์ ์ธ Heruistic ๋ฐฉ์‹(๊ฒฝํ—˜์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ํ•™์Šตํ•˜๊ฑฐ๋‚˜ ๋ฐœ๊ฒฌํ•ด ๋‚ด๋Š” ๋ฐฉ๋ฒ• == ๊ฐ, ์ง๊ฐ)์ด๋‹ค.

์ข€ ๋” ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด, ํด๋ž˜์Šค C์˜ ๋ฉ”์„œ๋“œ f๋Š” ์œ„์— ํ‘œํ˜„๋œ ๋ฒˆํ˜ธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

  1. Class C
  2. f๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด
  3. f ์ธ์ˆ˜๋กœ ๋„˜์–ด์˜จ ๊ฐ์ฒด
  4. C instance ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ์ฒด

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€, ๋‚ฏ์„  ์‚ฌ๋žŒ์€ ๊ฒฝ๊ณ„ํ•˜๊ณ  ์นœ๊ตฌ๋ž‘๋งŒ ๋†€๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด์„œ ์ดํ•ดํ•ด๋ณด์ž.

๊ธฐ์ฐจ ์ถฉ๋Œ

final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

์‚ฌ์šฉํ•ด๋ณด์•˜๋˜ ๋ฉ”์„œ๋“œ์ด๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ํ•œ ์ค„๋กœ ์ด์–ด์ง„ ๊ธฐ์ฐจ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๊ณ  ํ•ด์„œ ์ด๋Ÿฐ ์ฝ”๋“œ๋ฅผ **๊ธฐ์ฐจ ์ถฉ๋Œ(train wreck)**์ด๋ผ ๋ถ€๋ฅธ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์กฐ์žกํ•˜๋‹ค ์—ฌ๊ฒจ์ง€๋Š” ๋ฐฉ์‹์ด๋ฏ€๋กœ ํ”ผํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค. ์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜๋ˆ„๋Š” ํŽธ์ด ์ข‹๋‹ค.

// ๊ธฐ์ฐจ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•œ ์ฝ”๋“œ
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();

์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž. ์ด ๋…ผ์˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ctxt. opts, scratchDir๊ฐ€ ์ž๋ฃŒ ๊ตฌ์กฐ์ธ์ง€ ๊ฐ์ฒด์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ์•„์•ผ ํ•œ๋‹ค. ๊ฒฐ๊ตญ ๋””๋ฏธํ„ฐ ๋ฒ•์น™ ์—ญ์‹œ ํŠน์ • ๋ชจ๋“ˆ์˜ ์บก์Šํ™”๋ฅผ ํ†ตํ•ด ์ •๋ณด ์€๋‹‰์„ ์ž˜ํ–ˆ๋Š๋ƒ์— ๋Œ€ํ•œ ์–˜๊ธฐ๋กœ ๊ท€๊ฒฐ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งŒ์•ฝ ์ž๋ฃŒ ๊ตฌ์กฐ๋ผ๋ฉด, ๋‹น์—ฐํžˆ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋…ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฏธํ„ฐ ๋ฒ•์น™์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ์ฒด๋ผ๋ฉด ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ๋…ธ์ถœ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—(== ์กฐ์ž‘ํ•˜๋Š” ๊ฐ์ฒด์˜ ์†์‚ฌ์ •์„ ์•Œ๊ณ  ์žˆ์Œ) ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•œ๋‹ค.

final String outputDir = ctxt.options.scratchdir.absoluterPath;

๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์‹ค ์ž๋ฃŒ๊ตฌ์กฐ์ธ ๊ฒฝ์šฐ ์œ„์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์•ž์—์„œ ๋งํ–ˆ๋“ฏ ์˜๋ฏธ์—†๋Š” get, set์€ ํ•„์š”์—†๋‹ค.

์žก์ข… ๊ตฌ์กฐ

๋ง๋กœ๋งŒ ๋“ค์–ด๋„ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์ด๋Ÿฐ ์ƒํ™ฉ์€ ์‹ค์ œ ์ฝ”๋“œ ์–‘์‚ฐ ์‹œ ๋” ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ๋‹ค. ์˜ˆ์ƒํ–ˆ๊ฒ ์ง€๋งŒ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ๊ฐ์ฒด๊ฐ€ ์„ž์ธ ์žก์ข… ๊ตฌ์กฐ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์„ž์ธ ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜
  • ๊ณต๊ฐœ ๋ณ€์ˆ˜
  • ๊ณต๊ฐœ ์กฐํšŒ/์„ค์ • ๋ณ€์ˆ˜ (get, set)

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

์ด๋Ÿฐ ๊ตฌ์กฐ๋Š” ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋Š” ๋ฌผ๋ก ์ด๊ณ  ์ƒˆ๋กœ์šด ์ž๋ฃŒ ๊ตฌ์กฐ๋„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์–‘์ชฝ ์„ธ์ƒ์—์„œ ๋‹จ์ ๋งŒ ๋ชจ์•„๋†“์€ ๊ตฌ์กฐ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋˜๋„๋ก ์ด๋Ÿฐ ๊ตฌ์กฐ๋Š” ํ”ผํ•˜๋„๋ก ํ•˜์ž. ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ•จ์ˆ˜๋‚˜ ํƒ€์ž…์„ ๋ณดํ˜ธํ• ์ง€ ๊ณต๊ฐœํ• ์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ด (๋” ๋‚˜์˜๊ฒŒ๋Š” ๋ฌด์ง€ํ•ด) ์–ด์ค‘๊ฐ„ํ•˜๊ฒŒ ๋‚ด๋†“์€ ์„ค๊ณ„์— ๋ถˆ๊ณผํ•˜๋‹ค.

๊ตฌ์กฐ์ฒด ๊ฐ์ถ”๊ธฐ

final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

๊ทธ๋Ÿผ ctxt. opts, scratchDir ์ด ๊ฐ์ฒด๋ผ๋ฉด ์–ด๋–จ๊นŒ? ์ผ๋‹จ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์€ ์œ„๋ฐฐํ•œ ๊ฒƒ์€ ์•Œ๊ฒ ๊ณ , ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝํ• ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๋ฉด ์ข‹์„๊นŒ?

// ctxt ๊ฐ์ฒด์— ๊ณต๊ฐœํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Œ: ๋„ˆ๋ฌด ์ถ”์ƒํ™”ํ•จ
ctxt.getAbsolutePathOfScratchDirectoryOption();
// ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Š๋‚Œ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.
ctxt.getScratchDirectoryOption().getAbsolutePath()

์ด ๊ฒฝ์šฐ ๋‘˜๋‹ค ๋งˆ์Œ์— ์•ˆ๋“ ๋‹ค. ์›๋ก ์ ์œผ๋กœ ์™œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ํ•„์š”ํ•œ์ง€ ํ™•์ธํ•ด๋ณด์ž.

String outFile = outputDir + "/" + className.replace('.', '/') + ".class"; 
FileOutputStream fout = new FileOutputStream(outFile); 
BufferedOutputStream bos = new BufferedOutputStream(fout);

์ž„์‹œ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์–ป์œผ๋ ค๋Š” ์ด์œ ๊ฐ€ ์ž„์‹œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, ์ด ์ž„์‹œ ํŒŒ์ผ ์ž์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฑ…์ž„์„ ctxt ์— ๋„˜๊ธฐ๋ฉด ์–ด๋–จ๊นŒ?

BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);

๋ณด๋‹ค ์ ๋‹นํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋“œ๋Ÿฌ๋‚ด์ง€ ์•Š์œผ๋ฉฐ ๋ชจ๋“ˆ์€ ๋ชฐ๋ผ์•ผํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ์ฒด๋ฅผ ํƒ์ƒ‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋””๋ฏธํ„ฐ ๋ฒ•์น™๋„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ๋ฐฉ์‹์„ ๋งŒ๋“ค์—ˆ๋‹ค.

์ž๋ฃŒ ์ „๋‹ฌ ๊ฐ์ฒด

public class Address { 
    public String street; 
    public String streetExtra; 
    public String city; 
    public String state; 
    public String zip;
}

์ž๋ฃŒ ๊ตฌ์กฐ์ฒด์˜ ์ „ํ˜•์ ์ธ ํ˜•ํƒœ๋Š” ๊ณต๊ฐœ ๋ณ€์ˆ˜๋งŒ ์žˆ๊ณ  ํ•จ์ˆ˜๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค์ด๋‹ค. ์ด๋ฅผ **์ž๋ฃŒ ์ „๋‹ฌ ๊ฐ์ฒด(Data Transfer Object)**๋ผ ํ•œ๋‹ค.

ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ

ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ๋Š” DTO์˜ ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ๋‹ค. ๊ณต๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๋น„๊ณต๊ฐœ ๋ณ€์ˆ˜์— getter/setter๊ฐ€ ์žˆ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ง€๋งŒ, ๋Œ€๊ฒŒ save๋‚˜ find์™€ ๊ฐ™์€ ํƒ์ƒ‰ ํ•จ์ˆ˜๋„ ์ œ๊ณตํ•œ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ์— ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ด๋Ÿฐ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๊ฒŒ ๋˜๋ฉด ์žก์ข… ๊ตฌ์กฐ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์€ ๋‹น์—ฐํ•˜๋‹ค. ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ๋‹ด์œผ๋ฉด์„œ ๋‚ด๋ถ€ ์ž๋ฃŒ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฐ์ฒด๋Š” ๋”ฐ๋กœ ์ƒ์„ฑํ•œ๋‹ค. (์—ฌ๊ธฐ์„œ ๋‚ด๋ถ€ ์ž๋ฃŒ๋Š” ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ์˜ ์ธ์Šคํ„ด์Šค์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.)

๊ฒฐ๋ก 

||์ž๋ฃŒ ๊ตฌ์กฐ ์‚ฌ์šฉ ๋ฐฉ์‹|๊ฐ์ฒด ์‚ฌ์šฉ ๋ฐฉ์‹| |::|:--------------------------|:-------------------| |์—ฐ๊ด€๋œ ํŒจ๋Ÿฌ๋‹ค์ž„|์ ˆ์ฐจ์ |๊ฐ์ฒด์ง€ํ–ฅ์ | |ํŠน์ง•|์ž๋ฃŒ๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ๋‚˜ํƒ€๋ƒ„|๋™์ž‘์„ ๊ณต๊ฐœํ•˜๊ณ  ์ž๋ฃŒ๋ฅผ ์ˆจ๊น€| |์žฅ์ |์ž๋ฃŒ๊ตฌ์กฐ ๋ณ€ํ™” ์—†์ด ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ถ”๊ฐ€ ์‰ฌ์›€|๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๋ณ€ํ˜•ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฌ์›€| |๋‹จ์ |์ƒˆ๋กœ์šด ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ค์›€. ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ๊ณ ์ณ์•ผ ํ•จ|์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ค์›€. ๋ชจ๋“  ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•จ| |์„ ํƒ ๊ธฐ์ค€|์ƒˆ๋กœ์šด ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๋Š” ์œ ์—ฐ์„ฑ ํ•„์š”์‹œ|์ƒˆ๋กœ์šด ์ž๋ฃŒ ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•˜๋Š” ์œ ์—ฐ์„ฑ ํ•„์š”์‹œ|

  • ๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ์—์„œ ์–ด๋ ค์šด ๋ณ€๊ฒฝ์€ ์ ˆ์ฐจ์  ์ฝ”๋“œ์—์„œ ์‰ฌ์šฐ๋ฉฐ, ์ ˆ์ฐจ์  ์ฝ”๋“œ์—์„œ ์–ด๋ ค์šด ๋ณ€๊ฒฝ์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ์—์„œ ์‰ฝ๋‹ค. (Trade-Off)
  • ์ƒํ™ฉ์—์„œ ๋งž๊ฒŒ ๋‘ ๋ฐฉ์‹์„ ์„ ํƒํ•˜์—ฌ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด๋ผ๋Š” ์ƒ๊ฐ์€ ๋ฏธ์‹ ์ด๋‹ค.
  • ๊ฐ์ฒด ํ˜ธ์ถœ์€ ๋‚˜์™€ ๊ฐ€๊นŒ์šด ์นœ๊ตฌ๋“ค๊ณผ ํ•˜์ž. ์™ธ๋ถ€์ธ์€ ๊ฑฐ๋ฆฌ๋ฅผ ๋‘์ž.

Reference