λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ‹œλ„/ꡭ비지원

[D+19] μ˜€λ²„λΌμ΄λ”©κ³Ό 상속관계

by πŸ‡λ°•λ΄‰λ΄‰πŸ‡ 2022. 10. 19.

 

 

ꡭ비지원 D+19

- μ˜€λ²„λΌμ΄λ”©κ³Ό 상속관계 -

 


 

μ˜€λ²„λΌμ΄λ”©κ³Ό 상속관계

μ˜€λ²„λΌμ΄λ”©

- 객체지ν–₯의 νŠΉμ„±μ€‘ λ‹€ν˜•μ„±μ— ν•΄λ‹Ήλœλ‹€.

- λ‹€ν˜•μ„± : λ³Έμ²΄λŠ” ν•˜λ‚˜μΈλ° ν˜•νƒœκ°€ μ—¬λŸ¬κ°œ

- μ˜€λ²„λΌμ΄λ”©μ€ 상속관계에 μžˆλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 이미 μ •μ˜λ˜μ–΄μžˆλŠ” λ©”μ†Œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ 같은 방식을 κ°€μ§€λŠ” λ©”μ†Œλ“œλ‘œ λ‹€μ‹œ μž¬μ •μ˜ ν•˜λŠ” 것이닀.

- 상속받은 λΆ€λͺ¨ 클래슀둜 λΆ€ν„° 받은 λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이닀.

 

상속관계

// λΆ€λͺ¨ 클래슀 : TV
// μžμ‹ 클래슀 : SmartTV

TV tv = new SmartTV(ipAddress, channel);	// O

μƒμ†κ΄€κ³„μ—μ„œ λΆ€λͺ¨ν΄λž˜μŠ€μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μžμ‹ν΄λž˜μŠ€ 접근이 κ°€λŠ₯ν•˜λ‹€.

 

λΆ€λͺ¨ν΄λž˜μŠ€ TV의 μ°Έμ‘°κ°’κ³Ό μƒμ†λœ μžμ‹ 클래슀인 SmartTV의 참쑰값이 λ™μΌν•˜κΈ° λ•Œλ¬Έμ— λΆ€λͺ¨ν΄λž˜μŠ€μ˜ μ°Έμ‘°λ³€μˆ˜μ•ˆμ— μžμ‹ν΄λž˜μŠ€μ˜ 참쑰값이 듀어가도 λ¬Έμ œκ°€ 생기지 μ•ŠλŠ” 것이닀.

 

λ‹€λ§Œ λΆ€λͺ¨ν΄λž˜μŠ€μ˜ μ°Έμ‘°λ³€μˆ˜ μ•ˆμ— μžμ‹ν΄λž˜μŠ€λ₯Ό μ•ˆμ— λ„£μ„μˆ˜λŠ” μžˆκ² μ§€λ§Œ μˆœμˆ˜ν•œ SmartTVκ°μ²΄μ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” λ©”μ†Œλ“œλ‚˜ ν•„λ“œλŠ” μ‚¬μš©ν•  수 μ—†κ³  TV객체 μ•ˆμ—μ„œ μ‚¬μš©λ˜λŠ” ν•„λ“œμ™€ λ©”μ†Œλ“œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

 

μ—¬κΈ°μ„œ μ£Όμ˜ν•΄μ•Όν• μ μ€ SmartTV의 κΈ°λŠ₯을 μ‚¬μš©ν•  수 없을 뿐이지 λ©”μ†Œλ“œλ‚˜ ν•„λ“œλŠ” μ‘΄μž¬ν•œλ‹€λŠ” κ²ƒμ΄λ‹ˆ μžŠμ§€ μ•Šλ„λ‘ ν•œλ‹€.

 

// λΆ€λͺ¨ 클래슀 : TV
// μžμ‹ 클래슀 : SmartTV

SmartTV smtv = new TV(channel);	// X

μžμ‹ν΄λž˜μŠ€μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ λΆ€λͺ¨ν΄λž˜μŠ€ 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€.

 

λ©”μ†Œλ“œ μž¬μ •μ˜

예λ₯Όλ“€μ–΄ 적ꡰ을 λ§Œλ‚˜λ©΄ 곡격을 ν•˜λŠ” μ „μŸλΆ€λŒ€λ₯Ό λ§Œλ“€κ³  μ‹Άλ‹€κ³ ν•˜μž.

 

κ·Έλ ‡λ‹€λ©΄ 탱크, 보λͺ…, μ „νˆ¬κΈ°μ— λŒ€ν•œ 클래슀λ₯Ό λ§Œλ“€κ³  각 κ³΅κ²©ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό λ§Œλ“  λ‹€μŒμ— λ©”μΈμ—μ„œ 싀행될 수 μžˆλ„λ‘ μ½”λ“œλ₯Ό 짜면 될 것이닀.

 

// 메인

public class Tmain {
	
	public static void Attack(Tank[] ts, Fighter[] fs, Footman[] ms)
	{
		for(int i = 0; i < ts.length; i++)
		{
			ts[i].Pung();
		}
		
		for(int i = 0; i < fs.length; i++)
		{
			fs[i].Pyong();
		}
		
		for(int i = 0; i < ms.length; i++)
		{
			ms[i].Tang();
		}
	}
	

	public static void main(String[] args) {
		
		Tank[] ts = new Tank[3];
		Fighter[] fs = new Fighter[2];
		Footman[] ms = new Footman[5];
		
		ts[0] = new Tank();
		ts[1] = new Tank();
		ts[2] = new Tank();
		
		fs[0] = new Fighter();
		fs[1] = new Fighter();
		
		ms[0] = new Footman();
		ms[1] = new Footman();
		ms[2] = new Footman();
		ms[3] = new Footman();
		ms[4] = new Footman();
		
		Attack(ts, fs, ms);
		
	}

}

 

각 νƒ€μž…μ— λŒ€ν•œ 배열은 λ§Œλ“€κ³  λ°°μ—΄μ•ˆμ— 객체λ₯Ό λ§Œλ“€μ–΄ μ€€ λ‹€μŒ Attackμ΄λΌλŠ” λ©”μ†Œλ“œλ₯Ό λ§Œλ“€μ–΄ 배열듀을 νŒŒλΌλ―Έν„°λ‘œ λ°›μ•„λ‚΄ for문을 돌렀 싀행될 수 μžˆλ„λ‘ λ§Œλ“€ 수 μžˆμ„ 것이닀.

 

κ·ΈλŸ¬λ‚˜ 이 μ½”λ“œλŠ” 잘 μ‹€ν–‰λ˜λŠ” 것을 λ³Ό 수 μžˆμ§€λ§Œ μ•ˆνƒ€κΉκ²Œλ„ λ§Œμ•½ 캐릭터가 μˆ˜μ‹­λͺ…이라면 μš°λ¦¬λŠ” Attack에 λŒ€ν•œ 값을 νŒŒλΌλ―Έν„°μ— μˆ˜μ‹­λ²ˆ λ„£μ–΄μ€˜μ•Όν•˜λ©°, νŒŒλΌλ―Έν„°λ‘œ 받은 값을 돌리기 μœ„ν•΄ λ¬΄μˆ˜ν•œ μ–‘μ˜ for문이 μ¦κ°€ν•˜κ²Œ λ˜λŠ” μ•ˆνƒ€κΉŒμš΄ 상황이 λ°œμƒλ˜κ²Œ λ˜λŠ” 것이닀.

 

즉 μˆ˜ν‰ν™•μž₯이 λ°œμƒλ λ•Œλ§ˆλ‹€ μ½”λ“œμ˜ λ³΅μž‘λ„κ°€ μƒμŠΉν•˜κ²Œ λ˜λŠ” 것이닀.

 

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ μš°λ¦¬λŠ” 상속을 μ‚¬μš©ν•΄ 문제λ₯Ό 해결해보도둝 ν•˜κ² λ‹€.

 

λ¨Όμ € Unitμ΄λΌλŠ” 탱크, 보병, μ „νˆ¬κΈ°λ₯Ό 관리해쀄 λΆ€λͺ¨ 클래슀λ₯Ό λ§Œλ“€μ–΄ μ€€λ‹€.

μ΄λ•Œ Unitμ•ˆμ—λŠ” Attackμ΄λΌλŠ” 곡격을 ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό λ§Œλ“€μ–΄ μ€€λ‹€.

이 μ˜λ―ΈλŠ” 이제 μ•žμœΌλ‘œ Unit을 상속받을 ν΄λž˜μŠ€λ“€μ—κ²Œ 곡격은 무쑰건 Attack λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λΌλŠ” μΌμ’…μ˜ κ·œμ•½μ„ κ±Έμ–΄λ†“λŠ” 것이닀.

 

그리고 λ‚˜μ„œ 각 ν΄λž˜μŠ€μ— 상속을 ν•΄μ€€λ’€ κ³΅κ²©ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό Attack에 λ„£μ–΄μ£Όκ²Œλ˜λ©΄ 메인이 훨씬 간결해진 것을 확인할 수 μžˆλ‹€.

μš°λ¦¬λŠ” μ΄λ ‡κ²Œ μžμ‹ν΄λž˜μŠ€μ•ˆμ— λΆ€λͺ¨ν΄λž˜μŠ€κ°€ 가지고 μžˆλŠ” λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ˜ λ‚΄μš©μ„ μž¬μ„€μ •ν•΄μ€€κ²ƒμ„ λ©”μ†Œλ“œμ˜ μž¬μ •μ˜λΌκ³  ν•œλ‹€.

 

// 메인

public class Tmain {
	
	public static void Attack(Unit[] units)
	{
		for(int i = 0; i < units.length; i++)
		{
			units[i].Attack();
		}

	}
	

	public static void main(String[] args) {
		
		Unit[] units = new Unit[12];
		
		units[0] = new Tank();
		units[1] = new Tank();
		units[2] = new Tank();
		
		units[3] = new Fighter();
		units[4] = new Fighter();
		
		units[5] = new Footman();
		units[6] = new Footman();
		units[7] = new Footman();
		units[8] = new Footman();
		units[9] = new Footman();
		
		units[10] = new Medic();
		units[11] = new Medic();
		
		Attack(units);
		
	}

}

μ½”λ“œλ₯Ό 보면 각 캐릭터에 λŒ€ν•œ 객체λ₯Ό Unitsμ΄λΌλŠ” μ°Έμ‘° 배열에 ν•œκΊΌλ²ˆμ— λ„£κ³  Attack을 μ‚¬μš©ν• μ‹œμ— 받을 νŒŒλΌλ―Έν„°λ„ unitsν•˜λ‚˜μ΄λ©°, Attack λ©”μ†Œλ“œ μ•ˆμ— μ‚¬μš©λ˜λŠ” λ°˜λ³΅λ¬Έλ„ ν•˜λ‚˜λ§Œ μ‹€ν–‰λ˜λŠ” 것을 확인할 수 μžˆλ‹€.

 

μš°λ¦¬λŠ” μ΄λ ‡κ²Œ λ©”μ†Œλ“œμ˜ μž¬μ •μ˜λ₯Ό 톡해 μ½”λ“œμ˜ λ³΅μž‘λ„λ₯Ό κ°μ†Œμ‹œν‚€κ³  정확성을 λ†’μ—¬μ€€ μ½”λ“œλ₯Ό λ§Œλ“€κ²Œ 된 것이닀.

 

	public static void main(String[] args) {
		
		Unit[] units = new Unit[12];
		
		units[0] = new Tank();
		units[1] = new Tank();
		units[2] = new Tank();
		
		units[3] = new Fighter();
		units[4] = new Fighter();
		
		units[5] = new Footman();
		units[6] = new Footman();
		units[7] = new Footman();
		units[8] = new Footman();
		units[9] = new Footman();
		
		units[10] = new Medic();
		units[11] = new Medic();
		
		Attack(units);
		
	}

그런데 μ—¬κΈ°μ„œ μš°λ¦¬λŠ” ν•œκ°€μ§€ 의문점이 λ“€ μˆ˜λ„ μžˆμ„ 것이닀.

λΆ„λͺ… λΆ€λͺ¨ν΄λž˜μŠ€ μ°Έμ‘°λ³€μˆ˜λ‘œ μžμ‹ν΄λž˜μŠ€λ₯Ό 참쑰값을 λ„£μ„λ•Œ μ ‘κ·Όν—ˆμš© λ²”μœ„κ°€ λΆ€λͺ¨ν΄λž˜μŠ€λ°–에 μ•ˆλœλ‹€κ³  ν–ˆλŠ”λ° μœ„μ˜ μ½”λ“œμ²˜λŸΌ unitsλΌλŠ” μ°Έμ‘°λ³€μˆ˜μ— μžμ‹ν΄λž˜μŠ€λ“€μ˜ 객체생성에 λŒ€ν•œ 참쑰값이 λ“€μ–΄κ°€κ²Œ 될 경우 units[인덱슀].Attack()을 μ‹€ν–‰ν•  경우 λΆ€λͺ¨ 클래슀의 Attack이 μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜μ§€ μ•Šμ„κΉŒ?

 

μ΄λ•Œ μš°λ¦¬κ°€ μ•Œμ•„μ•Όν• κ²ƒμ€ μžμ‹ν΄λž˜μŠ€μ—μ„œ Attack()을 μž¬μ •μ˜ν•  경우 ν…Œμ΄λΈ”μ„ λ§Œλ“€μ–΄μ„œ μ–΄λ– ν•œ 클래슀의 Attack()을 μ μš©ν• μ§€μ— λŒ€ν•΄ κ³ λ₯΄κ²Œ λ˜λŠ”λ° λ”°λ‘œ 섀정해주지 μ•ŠμœΌλ©΄ μž¬μ •μ˜κ°€ 된 값이 μš°μ„ κΆŒμ„ κ°€μ§€κ²Œ λ˜μ–΄ μžμ‹ν΄λž˜μŠ€μ˜ Attack()이 μ‹€ν–‰λ˜λŠ” 것이라고 일단은 μ•Œμ•„λ‘μž.

 

정리

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€