0. πŸšΆλ“€μ–΄κ°€λ©°

 λ‹€ν˜•μ„±μ— λŒ€ν•΄ κ³΅λΆ€ν•˜λ‹€κ°€ μ‰½κ²Œ 이해가 λ˜μ§€ μ•ŠλŠ” 뢀뢄이 생겼고 이에 λŒ€ν•΄ μ•Œκ²Œ 된 점에 λŒ€ν•΄ 글을 μž‘μ„±ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.


1. 문제 ❓❓❓

 λ¬Έμ œ 상황은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 λ‹€ν˜•μ„±μ„ μ΄μš©ν•  λ•Œ λΆ€λͺ¨ 클래슀의 μ°Έμ‘° λ³€μˆ˜μ— μžμ‹ μΈμŠ€ν„΄μŠ€λ₯Ό ν• λ‹Ήν•΄μ€€ 경우 μ™œ 이 μ°Έμ‘° λ³€μˆ˜κ°€ μžμ‹ 클래슀만 가지고 μžˆλŠ” λ©”μ†Œλ“œλŠ” μ‚¬μš©ν•˜μ§€ λͺ»ν•˜λƒμ— λŒ€ν•œ 물음이 μƒκ²ΌμŠ΅λ‹ˆλ‹€. μ’€ 더 μžμ„Έν•œ 상황 μ„€λͺ…을 μœ„ν•΄ μ•„λž˜ μ½”λ“œλ₯Ό μ²¨λΆ€ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

public class Test {
    public static void main(String[] args) {
        Parent p = new Child();
        p.childMethod(); // 컴파일 μ—λŸ¬κ°€ λ‚˜λŠ” λΆ€λΆ„
    }
}

class Parent {} // λΆ€λͺ¨ 클래슀

class Child extends Parent { // μžμ‹ 클래슀
    public void childMethod(){
        System.out.println("Hi I'm Child!");
    }
}

 μœ„ μ½”λ“œμ— λŒ€ν•΄ μžλ°”μ— μ΅μˆ™ν•˜μ‹  뢄듀은 컴파일 μ—λŸ¬κ°€ λ‚˜λŠ” 것이 λ‹Ήμ—°ν•˜λ‹€κ³  생각할 수 μžˆκ² μ§€λ§Œ 이λ₯Ό 처음보고 μ œκ°€ λ“  생각은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.  

  1. μ°Έμ‘° λ³€μˆ˜κ°€ 가지고 μžˆλŠ” μ •λ³΄λŠ” νž™ μ˜μ—­μ— μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ˜ 참쑰값이닀.
  2. pκ°€ 가리킀고 μžˆλŠ” μΈμŠ€ν„΄μŠ€λŠ” Child μΈμŠ€ν„΄μŠ€μ΄λ‹€.
  3. λ”°λΌμ„œ p.childMethod()λ₯Ό ν•˜λ©΄ p에 λ‹΄κΈ΄ 참쑰값을 λ”°λΌκ°€μ„œ λ°œκ²¬ν•œ Child μΈμŠ€ν„΄μŠ€μ˜ childMethod() λ©”μ†Œλ“œλ₯Ό μ°Ύμ•„ ν˜ΈμΆœν•˜λ©΄ λœλ‹€.

 μœ„와 같은 둜직으둜 μž‘λ™ν•œλ‹€λ©΄ p.childMethod()κ°€ μ—λŸ¬κ°€ λ‚  μ΄μœ κ°€ μ—†λ‹€κ³  μƒκ°ν–ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€. μžλ°”μ˜ κΈ°λ³Έμ„œμ—μ„œλŠ” λΆ€λͺ¨ μ°Έμ‘° λ³€μˆ˜μ— ν• λ‹Ήν–ˆλ‹€λ©΄ λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•œ λ©€λ²„λ‚˜ λ©”μ†Œλ“œλ§Œ μ‚¬μš©ν•  수 있고 μžμ‹ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ ν˜•λ³€ν™˜μ„ ν•΄μ•Όν•œλ‹€. 라고 λ‚˜μ™€ μžˆμ§€λ§Œ 이 μ •λ³΄λ§Œ κ°€μ§€κ³ λŠ” μ œκ°€ μƒκ°ν•œ λΆ€λΆ„μ—μ„œ μ–΄λ–€ 뢀뢄이 잘λͺ»λœ 생각인지 νŒŒμ•…ν•˜κΈ°κ°€ μ–΄λ €μ› μŠ΅λ‹ˆλ‹€. 


2. ν•΄κ²° πŸ˜€

 μœ„ 사항과 κ΄€λ ¨ν•˜μ—¬ κ°œλ…μ„ λ°”λ‘œ 작기 μœ„ν•΄  μ—¬λŸ¬ 글듀을 μ‚΄νŽ΄λ³΄λ‹€ κ°€μž₯ 도움이 λ˜μ—ˆλ˜ κΈ€μ˜ 링크λ₯Ό μ²¨λΆ€ν•˜κ² μŠ΅λ‹ˆλ‹€. λ˜ν•œ 이λ₯Ό 제 상황에 맞게 μž¬κ΅¬μ„±ν•˜μ—¬ 글을 써보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.
 
 

Superclass reference not able to call subclass method in Java

I have a basic doubt in polymorphism in Java. I have written the code below in one file named AnimalTestDrive.java. According to me the code below should work specially the line in bold but unfortu...

stackoverflow.com

 

 μ»΄νŒŒμΌ νƒ€μž„μ— p의 νƒ€μž…μ€ Parent μž…λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬λŠ” p에 할당될 μΈμŠ€ν„΄μŠ€κ°€ λŸ°νƒ€μž„μ— μ–΄λ–€ 값을 κ°€μ§ˆ 것인지에 λŒ€ν•œ κ³ λ €λŠ” ν•˜μ§€ μ•ŠμœΌλ©° 였직 μ„ μ–Έν•œ νƒ€μž…(Parent)에 λŒ€ν•œ μ •λ³΄λ§Œμ„ κ³ λ €ν•˜κ²Œ λ©λ‹ˆλ‹€. 

 

 λ”°λΌμ„œ p.childMethod()λΌλŠ” μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•  λ•Œ p의 contextμ—μ„œ, 즉 type인 Parent에 κ΄€ν•΄μ„œ childMethodλΌλŠ” 정보λ₯Ό 찾게 λ©λ‹ˆλ‹€. λ§Œμ•½ Parent에 childMethod 정보가 μ—†λ‹€λ©΄ 상속 관계인 ν΄λž˜μŠ€λ“€μ—μ„œ 이λ₯Ό 찾게 λ©λ‹ˆλ‹€. Parent 같은 경우 λͺ…μ‹œμ μœΌλ‘œ 상속받은 ν΄λž˜μŠ€κ°€ μ—†μœΌλ―€λ‘œ Object ν΄λž˜μŠ€μ—μ„œ μ°Ύμ•„λ³Ό κ²ƒμž…λ‹ˆλ‹€. 거기에도 λ‹Ήμ—°νžˆ μ—†κ² μ£ ,,

 

 λ°”λ‘œ 이 μ‹œμ μ—μ„œ μ»΄νŒŒμΌλŸ¬λŠ” 컴파일 μ—λŸ¬λ₯Ό λ˜μ Έλ²„λ¦¬κ²Œ λ©λ‹ˆλ‹€. μ•„λž˜λŠ” 문제 μ½”λ“œλ₯Ό μ‹€ν–‰ μ‹œν‚¨ 경우 μ—λŸ¬ λ©”μ„Έμ§€μž…λ‹ˆλ‹€.

그런 ν•¨μˆ˜ μ—†μ–΄,,

 μ—λŸ¬ 메세지λ₯Ό 봐도 childMethodλΌλŠ” ν•¨μˆ˜λ₯Ό 찾지 λͺ»ν–ˆμŒμ„ μ•Œ 수 μžˆλ„€μš”,, μ—­μ‹œ μ—λŸ¬λŠ” μ•Œκ³ λ³΄λ©΄ μ°Έ μΉœμ ˆν•˜κ²Œ μ„€λͺ…ν•΄μ£Όκ³  μžˆμ—ˆλ‹€λŠ” 사싀을 κΉ¨λ‹«κ²Œ λ©λ‹ˆλ‹€.

 

 μ¦‰, μ‹€μ œ λŸ°νƒ€μž„μ— pκ°€ 가리킀고 μžˆλŠ” μΈμŠ€ν„΄μŠ€μ— childMethod μœ λ¬΄μ— λŒ€ν•΄μ„œλŠ” 컴파일 νƒ€μž„μ— κ³ λ € λŒ€μƒμ΄ μ•„λ‹ˆλΌλŠ” 것 μž…λ‹ˆλ‹€. 컴파일 νƒ€μž„μ—λŠ” νƒ€μž…μ— λŒ€ν•œ μ •λ³΄λ§Œ 가지고 childMethodλ₯Ό bind ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μœ„μ—μ„œ 봀던 κ²ƒμ²˜λŸΌ Parent ν΄λž˜μŠ€μ— λŒ€ν•œ μ •λ³΄λ§Œμ„ κ°€μ§€κ³ λŠ” childMethodλ₯Ό bind ν•  수 μ—†μ£ .. 

 

 μΆ”κ°€λ‘œ λŸ°νƒ€μž„μ— κ²°μ •ν•˜λŠ” 것은 λ‹¨μˆœ μ–΄λ–€ λ©”μ†Œλ“œμ˜ κ΅¬ν˜„μ„ μ‚¬μš©ν•  것이냐 μž…λ‹ˆλ‹€. λ§Œμ•½ μ•„λž˜μ™€ 같은 μ½”λ“œκ°€ μžˆλ‹€κ³  κ°€μ •ν•΄ λ΄…μ‹œλ‹€.

@Override // μžμ‹ν΄λž˜μŠ€μ—μ„œμ˜ toString λ©”μ„œλ“œ
public String toString(){
	return "I'm Child!!!"
}

 μœ„와 같은 경우 p.toString()을 μ‚¬μš©ν•˜μ—¬λ„ toString λ©”μ†Œλ“œκ°€ Object ν΄λž˜μŠ€μ—μ„œ 찾아지고 λ”°λΌμ„œ toString을 p에 bind ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬λŠ” 이λ₯Ό 톡해 λ©”μ†Œλ“œ 호좜이 valid ν•˜κ΅¬λ‚˜! 정도λ₯Ό νŒŒμ•…ν•˜κ²Œ λ©λ‹ˆλ‹€. κ·Έ ν›„ λŸ°νƒ€μž„μ—μ„œ μ‚¬μš©ν•˜λŠ” 것은 Child ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•œ toString이 λ˜κ² μŠ΅λ‹ˆλ‹€!

 

μ§€κΈˆμ™€μ„œ 글을 λ‹€μ‹œ μ½μ–΄λ³΄λ‹ˆ 이 뢀뢄이 λ°”λ‘œ  λ‹€μ΄λ‚˜λ―Ή λ©”μ†Œλ“œ λ””μŠ€νŒ¨μΉ˜μ— κ΄€ν•œ λΆ€λΆ„μ΄μ—ˆκ΅°μš”!  ν•΄λ‹Ή 뢀뢄이 κΆκΈˆν•˜μ‹œλ‹€λ©΄  μ•„λž˜ μ˜μƒμ„ μ°Έκ³ ν•˜μ‹œλ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€! (2022.09.05)

ν† λΉ„μ˜ λ΄„ TV 1회 - μž¬μ‚¬μš©μ„±κ³Ό λ‹€μ΄λ‚˜λ―Ή λ””μŠ€νŒ¨μΉ˜, 더블 λ””μŠ€νŒ¨μΉ˜
 
 μ •λ¦¬ν•΄λ³΄λ©΄ μ œκ°€ ν–ˆλ˜ μ˜€ν•΄λŠ” 컴파일 νƒ€μž„μ—μ„œ ν•˜λŠ” 일과 λŸ°νƒ€μž„μ—μ„œ ν•˜λŠ” 일의 차이점을 κ΅¬λΆ„ν•˜μ§€ λͺ»ν•΄ 생긴 κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. 

3. λ‚˜κ°€λ©°πŸ–

컴파일러 곡뢀해보고 μ‹Άλ‹€,,

 

 

 

λ°˜μ‘ν˜•
λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€!