๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿญ Chapter 6: ๊ฐ์ฒด์™€ ์ž๋ฃŒ ๊ตฌ์กฐ

๋ณ€์ˆ˜๋ฅผ ๋น„๊ณต๊ฐœ(private)๋กœ ์ •์˜ํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ๋‹ค. ๋‚จ๋“ค์ด ๋ณ€์ˆ˜์— ์˜์กดํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์–ด์„œ๋‹ค. ์ถฉ๋™์ด๋“  ๋ณ€๋•์ด๋“ , ๋ณ€์ˆ˜ ํƒ€์ž…์ด๋‚˜ ๊ตฌํ˜„์„ ๋ง˜๋Œ€๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์–ด์„œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด์งธ์„œ ์ˆ˜๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์กฐํšŒ(get) ํ•จ์ˆ˜์™€ ์„ค์ •(set) ํ•จ์ˆ˜๋ฅผ ๋‹น์—ฐํ•˜๊ฒŒ ๊ณต๊ฐœ(public)ํ•ด ๋น„๊ณต๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœํ• ๊นŒ?

๐ŸŽƒ ์ž๋ฃŒ ์ถ”์ƒํ™”โ€‹

๋‹ค์Œ ๋‘ ์˜ˆ์ œ์˜ ์ฐจ์ด๋ฅผ ์‚ดํŽด๋ณด์ž. ๋‘ ํด๋ž˜์Šค ๋ชจ๋‘ 2์ฐจ์› ์ ์„ ํ‘œํ˜„ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ•œ ํด๋ž˜์Šค๋Š” ๊ตฌํ˜„์„ ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ•˜๊ณ  ๋‹ค๋ฅธ ํด๋ž˜์Šค๋Š” ๊ตฌํ˜„์„ ์™„์ „ํžˆ ์ˆจ๊ธด๋‹ค.

public class Point {
public double x;
public double y;
}
public interface Point {
double getX();
double getY();
void setCartesian(double x, double y);
double getR();
double getTheta();
void setPolar(double r, double theta);
}

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

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

๋‹ค์Œ ๋‘ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž. ์ฒซ ๋ฒˆ์งธ ์˜ˆ์ œ๋Š” ์ž๋™์ฐจ ์—ฐ๋ฃŒ ์ƒํƒœ๋ฅผ ๊ตฌ์ฒด์ ์ธ ์ˆซ์ž ๊ฐ’์œผ๋กœ ์•Œ๋ ค์ค€๋‹ค. ๋‘ ๋ฒˆ์งธ ์˜ˆ์ œ๋Š” ์ž๋™์ฐจ ์—ฐ๋ฃŒ ์ƒํƒœ๋ฅผ ๋ฐฑ๋ถ„์œจ์ด๋ผ๋Š” ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์œผ๋กœ ์•Œ๋ ค์ค€๋‹ค. ์ฒซ ๋ฒˆ์งธ ์˜ˆ์ œ๋Š” ๋‘ ํ•จ์ˆ˜๊ฐ€ ๋ณ€์ˆ˜๊ฐ’์„ ์ฝ์–ด ๋ฐ˜ํ™˜ํ•  ๋ฟ์ด๋ผ๋Š” ์‚ฌ์‹ค์ด ๊ฑฐ์˜ ํ™•์‹คํ•˜๋‹ค. ๋‘ ๋ฒˆ์งธ ์˜ˆ์ œ๋Š” ์ •๋ณด๊ฐ€ ์–ด๋””์„œ ์˜ค๋Š”์ง€ ์ „ํ˜€ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค.

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

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

๐ŸŽƒ ์ž๋ฃŒ/๊ฐ์ฒด ๋น„๋Œ€์นญโ€‹

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

๋‹ค์Œ ์˜ˆ์ œ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋„ํ˜• ํด๋ž˜์Šค๋‹ค. ์—ฌ๊ธฐ์„œ area()๋Š” ๋‹คํ˜• ๋ฉ”์„œ๋“œ๋‹ค. ์„ธ ๋„ํ˜•์„ ์ถ”๊ฐ€ํ•ด๋„ ๊ธฐ์กด ํ•จ์ˆ˜์— ์•„๋ฌด๋Ÿฐ ํ˜•ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

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;
}
}

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

์ ˆ์ฐจ์ ์ธ ์ฝ”๋“œ๋Š” ์ƒˆ๋กœ์šด ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๊ทธ๋Ÿฌ๋ ค๋ฉด ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ๊ณ ์ณ์•ผ ํ•œ๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ ์ฝ”๋“œ๋Š” ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๊ทธ๋Ÿฌ๋ ค๋ฉด ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ๊ณ ์ณ์•ผ ํ•œ๋‹ค.

๋‹ค์‹œ ๋งํ•ด, ๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ์—์„œ ์–ด๋ ค์šด ๋ณ€๊ฒฝ์€ ์ ˆ์ฐจ์ ์ธ ์ฝ”๋“œ์—์„œ ์‰ฌ์šฐ๋ฉฐ, ์ ˆ์ฐจ์ ์ธ ์ฝ”๋“œ์—์„œ ์–ด๋ ค์šด ๋ณ€๊ฒฝ์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ์—์„œ ์‰ฝ๋‹ค!

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

๐ŸŽƒ ๋””๋ฏธํ„ฐ ๋ฒ•์น™โ€‹

๋””๋ฏธํ„ฐ ๋ฒ•์น™์€ ์ž˜ ์•Œ๋ ค์ง„ ํœด๋ฆฌ์Šคํ‹ฑ์œผ๋กœ, ๋ชจ๋“ˆ์€ ์ž์‹ ์ด ์กฐ์ž‘ํ•˜๋Š” ๊ฐ์ฒด์˜ ์†์‚ฌ์ •์„ ๋ชฐ๋ผ์•ผ ํ•œ๋‹ค๋Š” ๋ฒ•์น™์ด๋‹ค. ๊ฐ์ฒด๋Š” ์ž๋ฃŒ๋ฅผ ์ˆจ๊ธฐ๊ณ  ํ•จ์ˆ˜๋ฅผ ๊ณต๊ฐœํ•œ๋‹ค. ์ฆ‰, ๊ฐ์ฒด๋Š” ์กฐํšŒ ํ•จ์ˆ˜๋กœ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ณต๊ฐœํ•˜๋ฉด ์•ˆ ๋œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ (์ˆจ๊ธฐ์ง€ ์•Š๊ณ ) ๋…ธ์ถœํ•˜๋Š” ์…ˆ์ด๋‹ˆ๊นŒ. ์ข€ ๋” ์ •ํ™•ํžˆ ํ‘œํ˜„ํ•˜์ž๋ฉด, ๋””๋ฏธํ„ฐ ๋ฒ•์น™์€ "ํด๋ž˜์Šค C์˜ ๋ฉ”์„œ๋“œ f๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค"๊ณ  ์ฃผ์žฅํ•œ๋‹ค.

  • ํด๋ž˜์Šค C
  • f๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด
  • f ์ธ์ˆ˜๋กœ ๋„˜์–ด์˜จ ๊ฐ์ฒด
  • C ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ์ฒด

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

๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์–ด๊ธฐ๋Š” ๋“ฏ์ด ๋ณด์ธ๋‹ค. getOptions() ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด์˜ getScratchDir() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ getScratchDir() ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด์˜ getAbsolutePath() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

๐ŸŽˆ ๊ธฐ์ฐจ ์ถฉ๋Œโ€‹

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

Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();

์œ„ ์˜ˆ์ œ๊ฐ€ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ctxt, Options, ScratchDir์ด ๊ฐ์ฒด์ธ์ง€ ์•„๋‹ˆ๋ฉด ์ž๋ฃŒ ๊ตฌ์กฐ์ธ์ง€์— ๋‹ฌ๋ ธ๋‹ค. ๊ฐ์ฒด๋ผ๋ฉด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ˆจ๊ฒจ์•ผ ํ•˜๋ฏ€๋กœ ํ™•์‹คํžˆ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•œ๋‹ค. ๋ฐ˜๋ฉด, ์ž๋ฃŒ ๊ตฌ์กฐ๋ผ๋ฉด ๋‹น์—ฐํžˆ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋…ธ์ถœํ•˜๋ฏ€๋กœ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

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

final String outputDir = ctxt.options.scratchDir.absolutePath;

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

๐ŸŽˆ ์žก์ข… ๊ตฌ์กฐโ€‹

์ด๋Ÿฐ ํ˜ผ๋ž€์œผ๋กœ ๋ง๋ฏธ์•”์•„ ๋•Œ๋•Œ๋กœ ์ ˆ๋ฐ˜์€ ๊ฐ์ฒด, ์ ˆ๋ฐ˜์€ ์ž๋ฃŒ ๊ตฌ์กฐ์ธ ์žก์ข… ๊ตฌ์กฐ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์žก์ข… ๊ตฌ์กฐ๋Š” ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋„ ์žˆ๊ณ , ๊ณต๊ฐœ ๋ณ€์ˆ˜๋‚˜ ๊ณต๊ฐœ ์กฐํšŒ/์„ค์ • ํ•จ์ˆ˜๋„ ์žˆ๋‹ค. ๊ณต๊ฐœ ์กฐํšŒ/์„ค์ • ํ•จ์ˆ˜๋Š” ๋น„๊ณต๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœํ•œ๋‹ค. ๋•ํƒ์— ๋‹ค๋ฅธ ์ ˆ์ฐจ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ž๋ฃŒ ๊ตฌ์กฐ ์ ‘๊ทผ ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋น„๊ณต๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ํ”ˆ ์œ ํ˜น์— ๋น ์ง€๊ธฐ ์‹ญ์ƒ์ด๋‹ค.

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

๐ŸŽˆ ๊ตฌ์กฐ์ฒด ๊ฐ์ถ”๊ธฐโ€‹

๋งŒ์•ฝ ctxt, options, scratchDir์ด ์ง„์งœ ๊ฐ์ฒด๋ผ๋ฉด? ์•ž์„œ ์ฝ”๋“œ ์˜ˆ์ œ์ฒ˜๋Ÿผ ์ค„์ค„์ด ์‚ฌํƒ•์œผ๋กœ ์—ฎ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๊ฐ์ฒด๋ผ๋ฉด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ถฐ์•ผ ํ•˜๋‹ˆ๊นŒ. ๊ทธ๋ ‡๋‹ค๋ฉด ์ž„์‹œ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋Š” ์–ด๋–ป๊ฒŒ ์–ป์–ด์•ผ ์ข‹์„๊นŒ?

ctxt.getAbsolutePathOfScratchDirectoryOption();
ctx.getScratchDirectoryOption().getAbsolutePath();

์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ctxt ๊ฐ์ฒด์— ๊ณต๊ฐœํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ getScratchDirectoryOption()์ด ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์–ด๋Š ๋ฐฉ๋ฒ•๋„ ์ฉ ๋‚ดํ‚ค์ง€ ์•Š๋Š”๋‹ค.

ctxt๊ฐ€ ๊ฐ์ฒด๋ผ๋ฉด ๋ญ”๊ฐ€๋ฅผ ํ•˜๋ผ๊ณ  ๋งํ•ด์•ผ์ง€ ์†์„ ๋“œ๋Ÿฌ๋‚ด๋ผ๊ณ  ๋งํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋‹ค์Œ์€ ๊ฐ™์€ ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ๋‹ค.

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

์ถ”์ƒํ™” ์ˆ˜์ค€์„ ๋’ค์„ž์–ด ๋†“์•„ ๋‹ค์†Œ ๋ถˆํŽธํ•˜๋‹ค. ์ , ์Šฌ๋ž˜์‹œ, ํŒŒ์ผ ํ™•์žฅ์ž, File ๊ฐ์ฒด๋ฅผ ๋ถ€์ฃผ์˜ํ•˜๊ฒŒ ๋งˆ๊ตฌ ๋’ค์„ž์œผ๋ฉด ์•ˆ ๋œ๋‹ค. ์–ด์ฐŒ ๋˜์—ˆ๊ฑฐ๋‚˜, ์œ„ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ์ž„์‹œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์–ป์œผ๋ ค๋Š” ์ด์œ ๊ฐ€ ์ž„์‹œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด๋ผ๋Š” ์‚ฌ์‹ค์ด ๋“œ๋Ÿฌ๋‚œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ctxt ๊ฐ์ฒด์— ์ž„์‹œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ผ๊ณ  ์‹œํ‚ค๋ฉด ์–ด๋–จ๊นŒ?

BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);

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

๐ŸŽƒ ์ž๋ฃŒ ์ „๋‹ฌ ๊ฐ์ฒดโ€‹

์ž๋ฃŒ ๊ตฌ์กฐ์ฒด์˜ ์ „ํ˜•์ ์ธ ํ˜•ํƒœ๋Š” ๊ณต๊ฐœ ๋ณ€์ˆ˜๋งŒ ์žˆ๊ณ  ํ•จ์ˆ˜๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค๋‹ค. ์ด๋Ÿฐ ์ž๋ฃŒ ๊ตฌ์กฐ์ฒด๋ฅผ ๋–„๋กœ๋Š” ์ž๋ฃŒ ์ „๋‹ฌ ๊ฐ์ฒด(Data Transfer Object, DTO)๋ผ ํ•œ๋‹ค. DTO๋Š” ๊ต‰์žฅํžˆ ์œ ์šฉํ•œ ๊ตฌ์กฐ์ฒด๋‹ค. ํŠนํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•˜๊ฑฐ๋‚˜ ์†Œ์ผ“์—์„œ ๋ฐ›์€ ๋ฉ”์‹œ์ง€์˜ ๊ตฌ๋ฌธ์„ ๋ถ„์„ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

์ข€ ๋” ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ๋Š” ๋นˆ(bean) ๊ตฌ์กฐ๋‹ค. ๋นˆ์€ ๋น„๊ณต๊ฐœ(private) ๋ณ€์ˆ˜๋ฅผ ์กฐํšŒ/์„ค์ • ํ•จ์ˆ˜๋กœ ์กฐ์ž‘ํ•œ๋‹ค. ์ผ์ข…์˜ ์‚ฌ์ด๋น„ ์บก์Šํ™”๋กœ, ์ผ๋ถ€ OO ์ˆœ์ˆ˜์ฃผ์˜์ž๋‚˜ ๋งŒ์กฑ์‹œํ‚ฌ ๋ฟ ๋ณ„๋‹ค๋ฅธ ์ด์ต์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐ŸŽˆ ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œโ€‹

ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ๋Š” DTO์˜ ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ๋‹ค. ๊ณต๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๋น„๊ณต๊ฐœ ๋ณ€์ˆ˜์— ์กฐํšŒ/์„ค์ • ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ง€๋งŒ, ๋Œ€๊ฒŒ save๋‚˜ find์™€ ๊ฐ™์€ ํƒ์ƒ‰ ํ•จ์ˆ˜๋„ ์ œ๊ณตํ•œ๋‹ค. ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์ด๋‚˜ ๋‹ค๋ฅธ ์†Œ์Šค์—์„œ ์ž๋ฃŒ๋ฅผ ์ง์ ‘ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋‹ค.

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

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

๐ŸŽƒ ๊ฒฐ๋ก โ€‹

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

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