[Book] ν΄λ¦°μ½”λ“œ - 6μž₯ 객체와 자료 ꡬ쑰

2021. 1. 6. 16:29Β·πŸ“ Book/✏ Clean Code

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. 자료 전달 객체

자료 ꡬ쑰체(자료 전달 객체)의 μ „ν˜•μ μΈ ν˜•νƒœλŠ” 곡개 λ³€μˆ˜λ§Œ 있고 ν•¨μˆ˜κ°€ μ—†λŠ” ν΄λž˜μŠ€μ΄λ‹€.

λ°μ΄ν„°λ² μ΄μŠ€μ™€ ν†΅μ‹ ν•˜κ±°λ‚˜ μ†ŒμΌ“μ—μ„œ 받은 λ©”μ‹œμ§€μ˜ ꡬ문을 뢄석할 λ•Œ μœ μš©ν•˜λ‹€.

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Book/✏ Clean Code' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Book] ν΄λ¦°μ½”λ“œ - 8μž₯ 경계
  • [Book] ν΄λ¦°μ½”λ“œ - 7μž₯ 였λ₯˜ 처리
  • [Book] ν΄λ¦°μ½”λ“œ - 5μž₯ ν˜•μ‹ λ§žμΆ”κΈ°
  • [Book] ν΄λ¦°μ½”λ“œ - 4μž₯ 주석
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
[Book] ν΄λ¦°μ½”λ“œ - 6μž₯ 객체와 자료 ꡬ쑰
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”