artIST - developer/SSAFY๐Ÿ’Ž

[JAVA] Override ์ดํ•ดํ•˜๊ธฐ

ssunj 2024. 4. 29. 19:30

 

๋ฌธ์ œ

class A extends Alphabet์ผ ๋•Œ,
Alphabet a = new A() ํ•˜๋ฉด... ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์งˆ๊นŒ์š”??
 
์˜ค๋Š˜ ์•Œ์•„๋ด…์‹œ๋‹ค.. (์ •์ฒ˜๊ธฐ ์‹œํ—˜์œผ๋กœ ์ธํ•œ ๋ฐ˜์„ฑ๊ณผ ๋ณต์Šต ์ค‘ ^___^)
 
 
`Alphabet a = new A()` ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ, ์ด ํ•œ ์ค„ ๋‚ด์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์‹คํ–‰์ด ์ด๋ค„์ง‘๋‹ˆ๋‹ค.
 
1. new A()

  • new๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ ๊ฐ์ฒด์˜ ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ณ ,
  • A() :์ƒ์„ฑ์ž๊ฐ€ non-staticํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋””ํดํŠธ ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋•Œ ์ƒ์„ฑ์ž ์•ˆ์— ๋“ค์–ด์žˆ๋Š” super()๋ฅผ ํƒ€๊ณ  ์Šˆํผํด๋ž˜์Šค๋ฅผ ํƒ€๊ณ ํƒ€๊ณ  ์˜ฌ๋ผ๊ฐ€๋ฉฐ, ์ฒ˜์Œ ๋ณด๋Š” ํด๋ž˜์Šค๋ฉด ๋กœ๋“œํ•ด์˜ค๊ณ , ์ด๋ฏธ ๋กœ๋“œ๋˜์–ด ์žˆ์œผ๋ฉด ๋ฉ”์„œ๋“œ ์—๋ฆฌ์–ด์—์„œ ์ฐพ์•„์„œ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋’ค ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ƒ์œ„ ํด๋ž˜์Šค์ธ Object์—์„œ ๋‹ซํ˜€์„œ ์•„๋ž˜๋กœ ๋‚ด๋ ค์˜ค๋ฉฐ ์žฌ๊ท€์ ์œผ๋กœ ๋ช…์‹œ์  ์ดˆ๊ธฐํ™”๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

2. Alphabet a
3. a = ๋ช…์‹œ์  ์ดˆ๊ธฐํ™”
 
 
์—ฌ๊ธฐ์„œ ํƒ€์ž…์€ Alphabet์ด๊ณ , ๊ฐ์ฒด(์˜ค๋ธŒ์ ํŠธ)๋Š” A์ž…๋‹ˆ๋‹ค. (๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ž๋ฅผ ๋ณด๊ณ  ์ •ํ•˜๊ณ , ํƒ€์ž…์€ ๋งจ ์•ž์— ์„ ์–ธํ•œ ๊ฒƒ์„ ๋ณด๊ณ  ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.)
A ๊ฐ์ฒด๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์€ ์ž์‹ ๊ณผ ๋™์ผํ•œ ํƒ€์ž…์ด๊ฑฐ๋‚˜, ๊ทธ ์œ„์˜ ์Šˆํผ ํƒ€์ž…๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” A, Alphabet, Object๊ฐ€ ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์ด๊ฒ ์ง€์š”!
 
ํ•˜์ง€๋งŒ Alphabet a= new A()๋ผ ์„ ์–ธํ–ˆ์œผ๋‹ˆ.. A๊ฐ์ฒด์˜ ๋Œ€ํ‘œํƒ€์ž…์€ Alphabet์ด๋ผ๊ณ  ์„ ์–ธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค!
์—ฌ๊ธฐ์„œ ๋Œ€ํ‘œํƒ€์ž…์ด๋ž€, ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์ด ๊ฐ์ฒด๋ฅผ ๋Œ€ํ•  ๊ฒƒ์ธ๊ฐ€?๋ผ๋Š” ๊ฐœ๋ฐœ์ž์˜ ์˜์ง€์ž…๋‹ˆ๋‹ค .
๋”ฐ๋ผ์„œ JVM์€ ๊ฐœ๋ฐœ์ž์˜ ์˜์ง€๋ฅผ ์ด์–ด๋ฐ›์•„, A๊ฐ์ฒด๋ฅผ Aํƒ€์ž…์ด ์•„๋‹Œ ๋Œ€ํ‘œํƒ€์ž…์œผ๋กœ ๋ถ€๋ฅด๊ฒ ๋‹ค๊ณ  ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
 
๊ทธ๋ž˜์„œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋ƒ๋ฉด, 
Alphabet์—๋Š” ์—†๊ณ  A์—๋งŒ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ๋ณ€์ˆ˜์—๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (์ด๊ฑธ shadowing์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.)
ํ•˜์ง€๋งŒ!!!
์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ๊ฐ€๋ ค์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค (<-- ์ด๊ฒŒ ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค๐Ÿ˜™)
 
 
์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
๋ณธ์ธ์ด ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ–ˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”์„œ๋“œ ์œ„์— @Override ์–ด๋…ธํ…Œ์ด์…˜์„ ์จ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.
 
์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•˜๊ฒŒ ๋˜๋ฉด JVM์˜ shadowing ์ฒ˜๋ฆฌ์—์„œ ์ œ์™ธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
์›๋ž˜๋Š” ๊ฐ์ฒด์˜ ๋Œ€ํ‘œํƒ€์ž…์„ ๋ฐ”๊พธ๋ฉด ๋ฐ”๋€ ํƒ€์ž…์œผ๋กœ ์ทจ๊ธ‰ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, ์˜ˆ์™ธ์ ์œผ๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ ๊ฒƒ๋“ค์€ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
 
๊ทธ๋Ÿผ ๋Œ€์ฒด ์™œ? ์ด๋Ÿฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฑธ๊นŒ์š”?
์ด๊ฑด ๊ฐ์ฒด์ง€ํ–ฅ์  ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.... ์ด์œ ๋ฅผ ์•Œ๊ณ  ๋ณด๋ฉด ๋ฌด๋ฆŽ์„ ํŒ..! ๋จธ๋ฆฌ๋ฅผ ํŒ..! ์น˜๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์„ธ๊ณ„.... ๐Ÿ˜
(์กด๊ฒฝ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค...!)
 
์•„๋ฌดํŠผ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด shadowing์—์„œ ์ œ์™ธ๋˜๋ฉด์„œ ์–ป๋Š” ์ด์ ์„ ์•Œ์•„๋ด…์‹œ๋‹ค.
 
๊ฐ ์•ŒํŒŒ๋ฒณ๋งˆ๋‹ค ์ด๋ฆ„์„ ๋ถˆ๋Ÿฌ์ค˜์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทผ๋ฐ ์•ŒํŒŒ๋ฒณ์€ 26์ž๋ฆฌ์ง€์š”?

๋งŒ์•ฝ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ์—†๋‹ค๋ฉด ๊ฐ๊ฐ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ†ตํ•ด ๊ฐ ์•ŒํŒŒ๋ฒณ์˜ ์ด๋ฆ„์„ ๋ถˆ๋Ÿฌ์ค˜์•ผํ–ˆ์„ ๊ฒ๋‹ˆ๋‹ค. 26๊ฐœ๋ฅผ ๊ฐ๊ฐ.. ํ•˜๋‚˜ํ•˜๋‚˜...

public void info(A word){
   System.out.println("Aa");
}

public void info(B word){
   System.out.println("Bb");
}

public void info(C word){
   System.out.println("Cc");
}

   ...

 
ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ์†์„ ์ง€ํ–ฅํ•œ ์ฝ”๋“œ๋ฅผ ์“ฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

public void info(Alphabet word){
   if(word instance.of(A)){
      System.out.println("Aa");
   } else if(word instance.of(B)){
      System.out.println("Bb");
    } else if(word instance.of(C)){
      System.out.println("Cc");
    } else 
     ...
}

 
ํ•˜์ง€๋งŒ ์ƒ์†์„ ํ•˜๋‹ค๋ณด๋ฉด ์Šˆํผ ํƒ€์ž…์œผ๋กœ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ๋ฐ–์— ์—†๊ณ , ์ผ๊ด€์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.
 
์Šˆํผํƒ€์ž…์œผ๋กœ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์—๋Š” ์Šˆํผํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋„๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ฐ ํƒ€์ž…๋ณ„๋กœ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๋„๋ก ๋งŒ๋“œ๋ ค๋ฉด ๋งค๋ฒˆ ํƒ€์ž…์ฒดํ‚น์„ ํ•  ์ˆ˜ ๋ฐ–์— ์—†๊ณ , ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ์•ˆ์ •์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ž๋ฐ”์˜ ๋‹คํ˜•์„ฑ๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ™œ์šฉํ•˜๋ฉด ์ด ์ฝ”๋“œ๋ฅผ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ ์“ฐ๋Š” ๊ฒƒ์ด ๊ฐ์ฒด์ง€ํ–ฅ์ž…๋‹ˆ๋‹ค!

class Alphabet{
   public void info(){}
}

class A extends Alphabet{
   @Override
   public void info(){
      System.out.println("Aa");
   }
}

class B extends Alphabet{
   @Override
   public void info(){
      System.out.println("Bb");
   }
}

...

public void info(Alphabet word){
   word.info();
}

 
๋‹จ์ˆœํžˆ Alphabet ์Šˆํผํƒ€์ž…์œผ๋กœ ๋ฐ›๊ณ  ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœํ–ˆ์Œ์—๋„, word๊ฐ€ A๊ฐ์ฒด๋ผ๋ฉด Aa๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  B๊ฐ์ฒด๋ผ๋ฉด Bb๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค!


์ด๊ฒŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๊ณ  ์ด์ ์ด์ง€์š”๐Ÿ˜Ž

 
๊ทธ ์•ˆ์— ์•„๋ฌด๋Ÿฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋”๋ผ๋„ ํด๋ž˜์Šค/์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋Š” ๊ฒƒ ์ž์ฒด์— ๊ฐ€์น˜๋ฅผ ์•„๋Š” ๊ฒƒ์ด ์ง„์ •ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋‹ฌ๋ผ์ง€๊ณ , ๊ทธ์— ๋”ฐ๋ผ ์‚ถ์˜ ํ€„๋ฆฌํ‹ฐ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ !
์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ†ตํ•ด ๋ฐฐ์šฐ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ฐ€์น˜...๐Ÿ˜‡ ์ฐธ ๋ฉ‹์ ธ์š”
 

๊ฒฐ๋ก 

์ด์ œ ๋‹ค์‹œ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ๊ฒฐ๋ก !
 
class A extends Alphabet์ผ ๋•Œ,
Alphabet a = new A() ํ•˜๋ฉด
 
A๋ฅผ Alphabet ์ทจ๊ธ‰ํ•˜์ง€๋งŒ,
A๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ ๊ฒƒ์€ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ A์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค!!!
 
 
* ์ด๋ฒˆ ๊ธฐ์‚ฌ๋Š” 1ํ•™๊ธฐ ๋•Œ ๋ฐฐ์› ๋˜ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค๐Ÿ˜ 19๋ฐ˜์˜ ์ž๋ž‘ JES ๊ต์ˆ˜๋‹˜๊ป˜ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฌ๋ฉฐ...๐Ÿ’ž