6μ₯ κ°μ²΄μ μλ£ κ΅¬μ‘°
λ³μλ₯Ό privateλ‘ μ μνλ μ΄μ κ° μλ€.
λ¨λ€μ΄ λ³μμ μμ‘΄νμ§ μκ² λ§λ€κ³ μΆμ΄μ, λ³μ νμ μ΄λ ꡬνμ λ§λλ‘ λ°κΎΈκ³ μΆμ΄μ
κ·Έλ λ€λ©΄ μ λ§μ νλ‘κ·Έλλ¨Έκ° μ‘°ν(get) ν¨μμ μ€μ (set) ν¨μλ₯Ό λΉμ°ν publicμΌλ‘ μ μν΄ private λ³μλ₯Ό μΈλΆμ 곡κ°ν κΉ?
1. μλ£ μΆμν
μλ λ ν΄λμ€ λͺ¨λ 2μ°¨μ μ μ νννλ€.
// ꡬ체μ μΈ Point ν΄λμ€
// ꡬνμ μΈλΆλ‘ λ
ΈμΆνλ€.
// λͺ
ννκ² μ§κ΅ μ’νκ³λ₯Ό μ΄λ€λ κ²μ μ μ μλ€.
public class Point {
public double x; // κ°λ³μ μΌλ‘ μ’νκ°μ μ½κ³ μ€μ νλ€.
public double y;
}
// μΆμμ μΈ Point ν΄λμ€
// ꡬνμ μ¨κ²¨ ν΄λμ€ λ©μλκ° μ κ·Ό μ μ±
μ κ°μ νλ€.
// μ§κ΅ μ’νκ³λ₯Ό μ¬μ©νλμ§ κ·Ήμ’νκ³λ₯Ό μ¬μ©νλμ§ μ μ μλ€.
public interface Point {
double getX();
double getY(); // μ‘°νλ κ°κ° κ°λ₯νμ§λ§
void setCartesian(double x, double y); // μ€μ μ 2κ°μ κ°μ λμμ λ£μ΄μ£Όμ΄μΌ νλ€.
double getR();
double getTheta();
void setPolar(double r, double theta);
}
λ³μ μ¬μ΄μ ν¨μλΌλ κ³μΈ΅μ λ£λλ€κ³ ꡬνμ΄ μ μ λ‘ κ°μΆ°μ§μ§ μμΌλ―λ‘ κ΅¬νμ κ°μΆλ €λ©΄ μΆμνκ° νμνλ€!
κ·Έμ μ‘°ν ν¨μμ μ€μ ν¨μλ‘ λ³μλ₯Ό λ€λ£¬λ€κ³ ν΄λμ€κ° λμ§λ μλλ€.
그보λ€λ μΆμ μΈν°νμ΄μ€λ₯Ό μ κ³΅ν΄ μ¬μ©μκ° κ΅¬νμ λͺ¨λ₯Έ μ± μλ£μ ν΅μ¬μ μ‘°μν μ μμ΄μΌ μ§μ ν μλ―Έμ ν΄λμ€λ€.
// ꡬ체μ μΈ Vehicle ν΄λμ€
// μλμ°¨ μ°λ£ μνλ₯Ό ꡬ체μ μΈ μ«μ κ°μΌλ‘ μλ €μ€λ€.
public interface Vehicle {
public getFuelThankCapacityInGallons();
public getGallonsOfGasoline();
}
// μΆμμ μΈ Vehicle ν΄λμ€
// λ°±λΆμ¨μ΄λΌλ μΆμμ μΈ κ°λ
μΌλ‘ λ°ννκΈ°μ μ΄λμ μ€λμ§ μ¬μ©μμκ² λλ¬λμ§ μλλ€.
public interface Vehicle {
double getPercentFuelRemaining();
}
μλ£λ₯Ό μΈμΈνκ² κ³΅κ°ν기보λ€λ μΆμμ μΈ κ°λ μΌλ‘ νννλ νΈμ΄ μ’λ€.
μΈν°νμ΄μ€λ μ‘°ν ν¨μ, μ€μ ν¨μλ§μΌλ‘λ μΆμνκ° μ΄λ€μ§μ§ μμΌλ―λ‘ κ°λ°μλ κ°μ²΄κ° ν¬ν¨νλ μλ£λ₯Ό ννν κ°μ₯ μ’μ λ°©λ²μ μ¬κ°νκ² κ³ λ―Όν΄μΌ νλ€.
2. μλ£/κ°μ²΄ λΉλμΉ
κ°μ²΄λ μΆμν λ€λ‘ μλ£λ₯Ό μ¨κΈ΄ μ± μλ£λ₯Ό λ€λ£¨λ ν¨μλ§ κ³΅κ°νλ€.
μλ£ κ΅¬μ‘°λ μλ£λ₯Ό κ·Έλλ‘ κ³΅κ°νλ©° λ³λ€λ₯Έ ν¨μλ μ 곡νμ§ μλλ€.
// μ μ°¨μ μΈ λν: μλ£ κ΅¬μ‘°
// κ° λν ν΄λμ€λ κ°λ¨ν μλ£ κ΅¬μ‘°μ΄κ³ λνμ΄ λμνλ λ°©μμ Geometry ν΄λμ€μμ ꡬννλ€.
// ν¨μλ₯Ό μΆκ°νλ€λ©΄? λν ν΄λμ€λ μ무 μν₯λ λ°μ§ μλλ€.
// λνμ μΆκ°νλ€λ©΄? Geometry ν΄λμ€μ λͺ¨λ ν¨μλ₯Ό κ³ μ³μΌ νλ€.
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();
}
}
// λ€νμ μΈ λν(κ°μ²΄ μ§ν₯μ μΈ λν): κ°μ²΄
// 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;
}
}
λ κ°μ ν΄λμ€λ μνΈ λ³΄μμ μΈ νΉμ§μ΄ μλ€.
- μ μ°¨μ μΈ μ½λλ κΈ°μ‘΄ μλ£ κ΅¬μ‘°λ₯Ό λ³κ²½νμ§ μμΌλ©΄μ μ ν¨μλ₯Ό μΆκ°νκΈ° μ½λ€. λ°λ©΄, κ°μ²΄ μ§ν₯ μ½λλ κΈ°μ‘΄ ν¨μλ₯Ό λ³κ²½νμ§ μμΌλ©΄μ μ ν΄λμ€λ₯Ό μΆκ°νκΈ° μ½λ€.
- μ μ°¨μ μΈ μ½λλ λͺ¨λ ν¨μλ₯Ό κ³ μ³μΌ νλ―λ‘ μλ‘μ΄ μλ£κ΅¬μ‘°λ₯Ό μΆκ°νκΈ° μ΄λ ΅λ€. λ°λ©΄, κ°μ²΄ μ§ν₯ μ½λλ λͺ¨λ ν΄λμ€λ₯Ό κ³ μ³μΌ νλ―λ‘ μλ‘μ΄ ν¨μλ₯Ό μΆκ°νκΈ° μ΄λ ΅λ€.
3. λλ―Έν° λ²μΉ
λλ―Έν° λ²μΉμ μμ μ΄ μ‘°μνλ κ°μ²΄μ μμ¬μ μ λͺ°λΌμΌ νλ€λ λ²μΉμ΄λ€.
μ’ λ μ νν νννμλ©΄, μ΄ λ²μΉμ 'ν΄λμ€ Cμ λ©μλ fλ λ€μκ³Ό κ°μ κ°μ²΄μ λ©μλλ§ νΈμΆν΄μΌ νλ€'λΌκ³ μ£Όμ₯νλ€.
- ν΄λμ€ C
- fκ° μμ±ν κ°μ²΄
- f μΈμλ‘ λμ΄μ¨ κ°μ²΄
- C μΈμ€ν΄μ€ λ³μμ μ μ₯λ κ°μ²΄
class Demeter {
private A a;
private int func() { return 0; }
public void example(B b) {
C c = new C();
int f = func(); // 1λ²
b.invert(); // 2λ²
a = new A();
a.setActive(); // 3λ²
c.print(); // 4λ²
}
}
λλ―Έν° λ²μΉμ μ΄κΈ°λ κ²½μ°
- νμ©λ λ©μλκ° λ°ννλ κ°μ²΄μ λ©μλλ₯Ό νΈμΆν κ²½μ°
- μ‘μ’ κ΅¬μ‘°: μ λ°μ κ°μ²΄, μ λ°μ μλ£ κ΅¬μ‘°
- κΈ°μ°¨ μΆ©λ: μ¬λ¬ κ°μ²΄κ° ν μ€λ‘ μ΄μ΄μ§ κΈ°μ°¨μ²λΌ 보μ΄λ μ½λ
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
// μλ λ°©λ²μ ctxt, opts, scratchDirκ° μλ£ κ΅¬μ‘°λΌλ©΄ λλ―Έν° λ²μΉμ μλ°νμ§ μλλ€.
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
// λ§μ½ ctxt, opts, scratchDirκ° κ°μ²΄λΌλ©΄ λλ―Έν° λ²μΉμ μλ°νλ―λ‘ μλ‘μ΄ λ°©λ²μ΄ νμνλ€.
// ctxt κ°μ²΄μ μμ κ°μ²΄λ₯Ό μμ±νλ©΄
// ctxtμ λ΄λΆ ꡬ쑰λ₯Ό λλ¬λ΄μ§ μμΌλ©° λͺ¨λμμ ν΄λΉ ν¨μλ μ¬λ¬ κ°μ²΄λ₯Ό νμν νμκ° μλ€.
BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
4. μλ£ μ λ¬ κ°μ²΄
μλ£ κ΅¬μ‘°μ²΄(μλ£ μ λ¬ κ°μ²΄)μ μ νμ μΈ ννλ κ³΅κ° λ³μλ§ μκ³ ν¨μκ° μλ ν΄λμ€μ΄λ€.
λ°μ΄ν°λ² μ΄μ€μ ν΅μ νκ±°λ μμΌμμ λ°μ λ©μμ§μ ꡬ문μ λΆμν λ μ μ©νλ€.