์•ˆ๋…•! ์ด๋ฏธ Java ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด์— ๋Œ€ํ•ด ๋งŽ์ด ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ์žฌ์ •์˜ ์ž‘๋™ ๋ฐฉ์‹ - 1์ด๋ฆ„์€ ๊ฐ™์ง€๋งŒ ์ธ์ˆ˜ ๋ชฉ๋ก์ด ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ณธ ์ ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์— ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ๋‹ค๋ฅธ ์ƒํ™ฉ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ํ˜ธ์ถœ๋˜๋Š” ํด๋ž˜์Šค์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์ด ๋™์ž‘์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๊นŒ? ์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด Animal๋™๋ฌผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  speak๊ทธ ์•ˆ์— ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค.

public class Animal {
  
   public void speak() {

       System.out.println("Hello!");
   }
}
์ด์ œ ๋ง‰ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ์•„๋งˆ๋„ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ธ์ƒ์€ ๋งŽ์€ ๋™๋ฌผ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ๊ณ  ๋ชจ๋‘ ๋‹ค๋ฅด๊ฒŒ "๋งํ•ฉ๋‹ˆ๋‹ค": ๊ณ ์–‘์ด ์•ผ์˜น, ์˜ค๋ฆฌ ๊ฝฅ๊ฝฅ, ๋ฑ€ ์‰ฟ์‰ฟ ์†Œ๋ฆฌ ๋“ฑ. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค ๋ฉ”์„œ๋“œ ์žฌ์ •์˜ ์ž‘๋™ ๋ฐฉ์‹ - 2. ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ๋งŒ๋“ค์ง€ ์•Š์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. meow()์•ผ์˜น, ์‰ญ์‰ญ๊ฑฐ๋ฆฌ๋Š” ๋“ฑ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  hiss()๋•Œ ๋ฑ€์ด ์‰ญ์‰ญ๋Œ€๊ณ  ๊ณ ์–‘์ด๊ฐ€ ์•ผ์˜นํ•˜๊ณ  ๊ฐœ๊ฐ€ ์ง–๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค . ๋ฉ”์„œ๋“œ ์žฌ์ •์˜speak() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . Wikipedia์—์„œ๋Š” ์ด ์šฉ์–ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ์žฌ์ •์˜๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ•˜์œ„ ํด๋ž˜์Šค ๋˜๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค ๋˜๋Š” ์ƒ์œ„ ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜์—์„œ ์ด๋ฏธ ์ œ๊ณตํ•œ ๋ฉ”์„œ๋“œ์˜ ํŠน์ • ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์–ธ์–ด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งž์Šต๋‹ˆ๋‹ค. ์žฌ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ๊ฐ ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ๊ณ ์œ ํ•œ ๊ตฌํ˜„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ƒˆ ๊ตฌํ˜„์€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๊ตฌํ˜„์„ "๋Œ€์ฒด"ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ๋ด…์‹œ๋‹ค. ์šฐ๋ฆฌ ํด๋ž˜์Šค์˜ ์ž์† 4๋ช…์„ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค Animal.

public class Bear extends Animal {
   @Override
   public void speak() {
       System.out.println("Growl!");
   }
}
public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void speak() {
       System.out.println("Woof!");
   }
}


public class Snake extends Animal {

   @Override
   public void speak() {
       System.out.println("Hiss!");
   }
}
๋‹ค์Œ์€ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ์ž‘์€ ์ƒํ™œ ๊ฟ€ํŒ์ž…๋‹ˆ๋‹ค. ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๋ฉด IntelliJ IDE ์—์„œ ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๋กœ ์ด๋™ํ•˜๊ณ  Ctrl+O๋ฅผ ๋ˆ„๋ฅด๊ณ  ๋ฉ”๋‰ด์—์„œ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜...๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค . ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹จ์ถ•ํ‚ค ์‚ฌ์šฉ์— ์ต์ˆ™ํ•ด์ง€์‹ญ์‹œ์˜ค. ๊ทธ๋“ค์€ ์ฝ”๋”ฉ ์†๋„๋ฅผ ๋†’์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์›ํ•˜๋Š” ๋™์ž‘์„ ์–ป๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
  1. ๊ฐ ์ž์† ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ์šฐ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ์— ๋ถ€๋ชจ ํด๋ž˜์Šค์™€ ๋™์ผํ•œ ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ ๋™์ž‘์„ ์žฌ์ •์˜ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ์— ์•Œ๋ ธ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ์ด "๋ฉ”์‹œ์ง€"๋Š” @Override ์ฃผ์„์„ ํ†ตํ•ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    ๋ฉ”์„œ๋“œ ์œ„์˜ @Override ์ฃผ์„์€ ์ปดํŒŒ์ผ๋Ÿฌ(๋ฐ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ)์—๊ฒŒ "๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ์‹ค์ˆ˜๋‚˜ ์‹ค์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ์žฌ์ •์˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. .

  3. ์šฐ๋ฆฌ๋Š” ๊ฐ ์ž์† ํด๋ž˜์Šค์— ํ•„์š”ํ•œ ๊ตฌํ˜„์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ ๋˜๋ฉด speak()๋ฑ€์€ ์‰ญ์‰ญ๊ฑฐ๋ฆฌ๊ณ  ๊ณฐ์€ ์œผ๋ฅด๋ ๊ฑฐ๋ฆฝ๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ํ”„๋กœ๊ทธ๋žจ์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ด…์‹œ๋‹ค:

public class Main {

   public static void main(String[] args) {

       Animal animal1 = new Dog();
       Animal animal2 = new Cat();
       Animal animal3 = new Bear();
       Animal animal4 = new Snake();
      
       animal1.speak();
       animal2.speak();
       animal3.speak();
       animal4.speak();
   }
}
์ฝ˜์†” ์ถœ๋ ฅ:

Woof! 
Meow! 
Growl! 
Hiss!
์ข‹์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ์œ ํ˜•์ด ์ƒ์œ„ ํด๋ž˜์Šค์ธ ์ฐธ์กฐ ๋ณ€์ˆ˜ 4๊ฐœ๋ฅผ ์ƒ์„ฑ Animalํ•˜๊ณ  ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ์ฒด 4๊ฐœ๋ฅผ ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ ๊ฐœ์ฒด๋Š” ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํŒŒ์ƒ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์žฌ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค ์˜ speak()๊ธฐ์กด ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค (๋‹จ์ˆœํžˆ ์ฝ˜์†”์— "Speaking: " ํ‘œ์‹œ). ๋ฉ”์„œ๋“œ ์žฌ์ •์˜์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. speak()Animal๋ฉ”์„œ๋“œ ์žฌ์ •์˜ ์ž‘๋™ ๋ฐฉ์‹ - 3
  1. ์žฌ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•œ ์ธ์ˆ˜๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    speak๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ a๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ String์ž์† ํด๋ž˜์Šค์˜ ์žฌ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋„ a๋ฅผ String์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    
    public class Animal {
    
       public void speak(String s) {
    
           System.out.println("Speaking: " + s);
       }
    }
    
    public class Cat extends Animal {
    
       @Override // Error!
       public void speak() {
           System.out.println("Meow!");
       }
    }
    

  2. ์žฌ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•œ ๋ฐ˜ํ™˜ ํ˜•์‹์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    
    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    
    public class Cat extends Animal {
    
       @Override
       public String speak() {         // Error!
           System.out.println("Meow!");
           return "Meow!";
       }
    }
    

  3. ์žฌ์ •์˜๋œ ๋ฉ”์„œ๋“œ์˜ ์•ก์„ธ์Šค ํ•œ์ •์ž๋„ ์›๋ณธ๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    
    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    public class Cat extends Animal {
    
       @Override
       private void speak() {      // Error!
           System.out.println("Meow!");
       }
    }
    
Java์—์„œ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜๋Š” ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ฃผ์š” ์ด์ ์€ ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ์œ ์—ฐ์„ฑ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค์˜ ๊ฐ„๋‹จํ•˜๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ฐ speak()ํด๋ž˜์Šค๋Š” ํŠน์ • ๋™์ž‘ (๊ฐœ ์ง–๋Š” ์†Œ๋ฆฌ, ๊ณ ์–‘์ด ์šธ์Œ ์†Œ๋ฆฌ)์„ ๊ฐ–์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹จ์ผ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.bark()meow()