Day09 - jeremy0405/Codesquad_CS GitHub Wiki

λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙

멀버듀과 이번 λ―Έμ…˜μ— λŒ€ν•΄μ„œ κ°„λ‹¨ν•œ 리뷰λ₯Ό ν•˜λ˜ 쀑 ν›„κ°€ μ‚Όκ°ν˜•κ³Ό μ‚¬κ°ν˜•μ€ λ‹€κ°ν˜•μ„ μƒμ†λ°›μ•„μ„œ κ΅¬ν˜„ν•  수 μžˆμ§€ μ•Šμ„κΉŒ? λΌλŠ” μ˜κ²¬μ„ λƒˆλ‹€. κ°€λ§Œνžˆ μƒκ°ν•΄λ³΄λ‹ˆ κ°€λŠ₯ ν•  것 κ°™μ•˜λ‹€. 이 κ³Όμ •μ—μ„œ μ˜ˆμ „μ— κ³΅λΆ€ν•œ μ •μ‚¬κ°ν˜• - μ§μ‚¬κ°ν˜• 예제둜 λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙이 생각이 λ‚˜μ„œ ν•œλ²ˆ λ‹€μ‹œ 정리해보렀고 ν•œλ‹€.

is kind of ν˜Ήμ€ is a 관계가 μ„±λ¦½ν•˜λ©΄ 상속을 ν•  수 μžˆλ‹€κ³  μ•Œκ³  μžˆλ‹€.

μ •μ‚¬κ°ν˜• is a μ§μ‚¬κ°ν˜•, μ •μ‚¬κ°ν˜• is kind of μ§μ‚¬κ°ν˜•

μ‚Όκ°ν˜• is a λ‹€κ°ν˜•, μ‚Όκ°ν˜• is kind of λ‹€κ°ν˜•

μ§μ‚¬κ°ν˜• is a λ‹€κ°ν˜•, μ§μ‚¬κ°ν˜• is kind of λ‹€κ°ν˜•

λͺ¨λ‘ λ‹€ 일반적으둜 μƒκ°ν–ˆμ„ λ•Œ λ§žλŠ” 말이닀. 즉 상속이 κ°€λŠ₯ν•΄ 보인닀.

λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙

  • μƒμœ„ νƒ€μž…μ˜ 객체λ₯Ό ν•˜μœ„ νƒ€μž…μ˜ 객체둜 μΉ˜ν™˜ν•΄λ„ μƒμœ„ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ€ μ •μƒμ μœΌλ‘œ λ™μž‘ν•΄μ•Ό ν•œλ‹€.
  • μƒμœ„ 클래슀의 행동 κ·œμ•½μ„ ν•˜μœ„ ν΄λž˜μŠ€κ°€ μœ„λ°˜ν•˜λ©΄ μ•ˆ λœλ‹€.

일반적으둜 λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙을 μ§€ν‚€λ©΄μ„œ 상속을 ν•˜λ©΄ λ¬Έμ œκ°€ μ—†μ§€λ§Œ λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙을 μœ„λ°˜ν•˜κ²Œ λœλ‹€λ©΄ 잘λͺ»λœ 상속을 ν•˜κ²Œ λœλ‹€.

ν•˜μœ„ν˜•(ν•˜μœ„ 클래슀)이 λ§Œμ‘±ν•΄μ•Ό ν•˜λŠ” 쑰건 3κ°€μ§€

  • ν•˜μœ„ν˜•μ—μ„œ μ„ ν–‰ 쑰건은 강화될 수 μ—†λ‹€.
  • ν•˜μœ„ν˜•μ—μ„œ ν›„ν–‰ 쑰건은 약화될 수 μ—†λ‹€.
  • ν•˜μœ„ν˜•μ—μ„œ μƒμœ„ν˜•μ˜ λΆˆλ³€ 쑰건은 λ°˜λ“œμ‹œ μœ μ§€λ˜μ–΄μ•Ό ν•œλ‹€.

-> κ·Έλƒ₯ κ°„λ‹¨νžˆ λ§ν•˜μžλ©΄ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©μ„ ν•  λ•Œ μƒμœ„ ν΄λž˜μŠ€μ— μžˆλŠ” ν˜•μ‹κ³Ό μΌμΉ˜ν•˜λ„λ‘ μ˜€λ²„λΌμ΄λ”©μ„ ν•΄μ•Ό ν•œλ‹€λŠ” 것이닀. κ°„λ‹¨ν•˜κ²Œ μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•  λ•Œμ™€ 같이 λ™μž‘ν•˜λ„λ‘ μ˜€λ²„λΌμ΄λ”©μ„ μ§„ν–‰ν•˜λ©΄ λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙을 λ§Œμ‘±μ‹œν‚¬ 수 μžˆλ‹€.

κ°€μž₯ 유λͺ…ν•œ λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙을 μœ„λ°˜ν•œ 예λ₯Ό 보자 (μ§μ‚¬κ°ν˜•, μ •μ‚¬κ°ν˜• 예제)

public class Rectangle {
	private int width;
	private int height;

	public Rectangle(int width, int height) {
		this.width = width;
		this.height = height;
	}

	public int getArea() {
		return width * height;
	}

	public int getWidth() {
		return width;
	}
	
	public int getHeight() {
		return height;
	}

	public void increaseWidth(int num) {
		this.width += num;
	}

	public void increaseHeight(int num) {
		this.height += num;
	]

}
public class Square extends Rectangle {  
  
	public Square(int length) {  
		super(length, length);  
	}  
  
	@Override  
	public void increaseWidth(int num) {  
		super.increaseWidth(num);  
		super.increaseHeight(num);  
	}  
  
	@Override  
	public void increaseHeight(int num) {  
		super.increaseWidth(num);  
		super.increaseHeight(num);  
	}  
}
Rectangle rec = new Square(10);  
System.out.println(rec.getWidth());  
System.out.println(rec.getHeight());  
rec.increaseWidth(10);  
System.out.println(rec.getWidth());
System.out.println(rec.getHeight());

///
10
10
20
20

μœ„μ˜ μ½”λ“œλŠ” Rectangle rec = new Rectangle(10, 10) 둜 μ„ μ–Έν–ˆμ„ λ•Œμ™€ λ‹€λ₯΄κ²Œ λ™μž‘ν•œλ‹€. μƒμœ„ ν΄λž˜μŠ€μ—μ„œ increaseWidth(10) 을 ν–ˆμ„ λ•Œμ™€ κΈ°λŒ€κ°’μ΄ μ „ν˜€ λ‹€λ₯΄λ‹€. 즉 'μƒμœ„ νƒ€μž…μ˜ 객체λ₯Ό ν•˜μœ„ νƒ€μž…μ˜ 객체둜 μΉ˜ν™˜ν•΄λ„ μƒμœ„ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ€ μ •μƒμ μœΌλ‘œ λ™μž‘ν•΄μ•Ό ν•œλ‹€.' λŠ” λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 법칙을 μœ„λ°˜ν•˜κ³  μžˆλ‹€. ν•˜μœ„ν˜•μ—μ„œ μ„ ν–‰ 쑰건이 κ°•ν™”λœ 예인데 이와 같이 상속을 μ§„ν–‰ν•˜κ²Œ 되면 λ‚˜μ€‘μ— μ½”λ“œμ˜ ν™•μž₯이 μ–΄λ €μ›Œμ§€κ³  κΈ°λŠ₯ ν™•μž₯을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” 훨씬 더 λ§Žμ€ 뢀뢄을 고쳐야 ν•œλ‹€.

μ§μ‚¬κ°ν˜• is kind of λ‹€κ°ν˜• , μ‚Όκ°ν˜• is kind of λ‹€κ°ν˜•

그럼 λ‚΄ μ½”λ“œμ—μ„œ μ§μ‚¬κ°ν˜•κ³Ό μ‚Όκ°ν˜•μ„ λ‹€κ°ν˜•μ„ μƒμ†ν•΄μ„œ κ΅¬ν˜„ν•œλ‹€λ©΄ λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 법칙을 μ§€ν‚€λ©΄μ„œ κ΅¬ν˜„μ„ ν•  수 μžˆλŠ” κ²ƒμΌκΉŒ? λ‚˜λŠ” κ°€λŠ₯ν•˜λ‹€κ³  νŒλ‹¨μ„ ν–ˆλ‹€. μƒμœ„ 클래슀(λ‹€κ°ν˜•) μ—μ„œ κΈ°λŒ€λ˜λŠ” ν–‰μœ„λ“€μ„ ν•˜μœ„ 클래슀(μ§μ‚¬κ°ν˜•, μ‚Όκ°ν˜•)μ—μ„œ κΈ°λŒ€λ˜λŠ” ν–‰μœ„κ°€ κ°™μ•˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ˜€κ³  κ·Έ κ²°κ³Ό λ§Žμ€ μ€‘λ³΅λœ μ½”λ“œλ₯Ό 거둬낼 수 μžˆμ—ˆλ‹€.

λ‹€κ°ν˜• 클래슀

상속 μ „ μ§μ‚¬κ°ν˜•

상속 ν›„ μ§μ‚¬κ°ν˜•

상속 μ „ μ‚Όκ°ν˜•

상속 ν›„ μ‚Όκ°ν˜•