๐Ÿ“š [Java] - ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading), ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)

CodeByHanยท2025๋…„ 11์›” 7์ผ

์ž๋ฐ”

๋ชฉ๋ก ๋ณด๊ธฐ
9/13

๋งค๋ฒˆ ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading), ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)โ€ฆ ์†”์งํžˆ ๊ฐœ๋… ์ž์ฒด๋Š” ์•Œ๊ณ  ์žˆ์—ˆ๊ณ , ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ๋„ ํ•ด๋ดค๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฑธ ๋†“์น˜๊ณ  ์žˆ์—ˆ๋‹ค. โ€˜์™œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ? ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์จ์•ผ ํ•˜๋Š”๋ฐ?โ€™
์ด ์งˆ๋ฌธ์ด ๋‚˜์˜ค๋ฉด ํ•ญ์ƒ ํ—‰โ€ฆ ํ•˜๋ฉด์„œ ๋‹นํ™ฉํ–ˆ๋‹ค.
๊ฐ์ฒด์ง€ํ–ฅ์˜ 4๊ฐ€์ง€ ํ•ต์‹ฌ ์›์น™(์บก์Аํ™”, ๋‹คํ˜•์„ฑ, ์ถ”์ƒํ™”, ์ƒ์†)๋„ ๋‹จ์ˆœํžˆ โ€œ์•Œ๊ณ  ์žˆ๋‹คโ€ ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ผ, โ€˜์™œ(Why) ์‚ฌ์šฉํ•˜๋Š”์ง€โ€™์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ์ œ๋Œ€๋กœ ํ•ด๋ณธ ์ ์ด ์—†๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
์ด๋ฒˆ ๊ธฐํšŒ์— ๊ทธ ๋ถ€๋ถ„๊นŒ์ง€ ํ™•์‹คํžˆ ์ •๋ฆฌํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ณด๋ ค ํ•œ๋‹ค.

๐Ÿ“š ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)

๋จผ์ € ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP, Object-Oriented Programming)์ด ๋ฌด์—‡์ธ์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด์ž.

๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๋ณ€์ˆ˜์™€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋Šฅ(๋ฉ”์„œ๋“œ)์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด '๊ฐ์ฒด'๋กœ ๋งŒ๋“ค๊ณ , ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋“ค์ด ์„œ๋กœ ํ˜‘๋ ฅํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹

์‰ฝ๊ฒŒ ๋งํ•ด์„œ, โ€œํ˜„์‹ค ์„ธ๊ณ„์˜ ์‚ฌ๋ฌผ์ด๋‚˜ ๊ฐœ๋…์„ ์ฝ”๋“œ ์•ˆ์—์„œ ๊ฐ์ฒด ๋‹จ์œ„๋กœ ๋งŒ๋“ค์–ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•โ€์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด์ง€ํ–ฅ์„ ์ด์•ผ๊ธฐํ•  ๋•Œ๋Š” ํ•ญ์ƒ 4๊ฐ€์ง€ ํ•ต์‹ฌ ์›์น™(์บก์Аํ™”, ์ƒ์†, ๋‹คํ˜•์„ฑ, ์ถ”์ƒํ™”)์ด ํ•จ๊ป˜ ๋‚˜์˜จ๋‹ค.

์ด 4๊ฐ€์ง€ ์›์น™์ด ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ๊ธฐ์ค€์ด ๋œ๋‹ค.

๐Ÿ“Œ 1. ์บก์Аํ™”(Encapsulation)

์บก์Аํ™”๋Š” ๋ฐ์ดํ„ฐ(๋ณ€์ˆ˜)์™€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋Šฅ(๋ฉ”์„œ๋“œ)์„ ํ•˜๋‚˜๋กœ ๋ฌถ๊ณ , ์™ธ๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ˆจ๊ธฐ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์ฆ‰, ์ •๋ณด ์€๋‹‰(Information Hiding)์„ ํ†ตํ•ด ๊ฐ์ฒด ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ , ์ž˜๋ชป๋œ ์ ‘๊ทผ์ด๋‚˜ ๋ณ€๊ฒฝ์„ ๋ง‰๋Š” ๊ฒƒ์ด๋‹ค.

class Person {
    private String name;  // ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€
    private int age;

    // Getter ๋ฉ”์„œ๋“œ
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // Setter ๋ฉ”์„œ๋“œ
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        if (age > 0) { // ์ž˜๋ชป๋œ ๊ฐ’ ๋ฐฉ์ง€
            this.age = age;
        }
    }
}

๐Ÿค” ์™œ ์บก์Аํ™”(Encapsulation)๋ฅผ ์‚ฌ์šฉํ•ด?

1. ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ

  • ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์™ธ๋ถ€์—์„œ ๋งˆ์Œ๋Œ€๋กœ ๋ฐ”๋€Œ๋Š” ๊ฑธ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
    ์˜ˆ: ๋‚˜์ด(age)๋ฅผ ์Œ์ˆ˜๋กœ ์„ค์ •ํ•˜๋Š” ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€
    2. ์ฝ”๋“œ ์•ˆ์ •์„ฑ ํ–ฅ์ƒ
  • ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰์œผ๋ฏ€๋กœ, ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    3. ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด
  • ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ๋ฐ”๋€Œ์–ด๋„ getter/setter ๊ฐ™์€ ๊ณต๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์œ ์ง€ํ•˜๋ฉด ์™ธ๋ถ€ ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ฆ‰, ์ฝ”๋“œ ์ˆ˜์ • ์‹œ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
    4. ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™ ์ค€์ˆ˜
  • ์ •๋ณด ์€๋‹‰(Information Hiding)์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ์‘์ง‘๋„๋ฅผ ๋†’์ธ๋‹ค.

๐Ÿ“Œ 2. ์ถ”์ƒํ™” (Abstraction)

์ถ”์ƒํ™”๋Š” ๋ถˆํ•„์š”ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์ˆจ๊ธฐ๊ณ , ์ค‘์š”ํ•œ ํŠน์ง•์ด๋‚˜ ๊ณตํ†ต๋œ ๊ฐœ๋…๋งŒ ๋ฝ‘์•„๋‚ด๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์ฆ‰, ๊ฐ์ฒด์˜ ํ•ต์‹ฌ ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ๋งŒ ์ •์˜ํ•˜๊ณ , ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์€ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.

// ์ถ”์ƒ ํด๋ž˜์Šค
abstract class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }

    // ๊ณตํ†ต ๊ธฐ๋Šฅ์€ ์„ ์–ธ๋งŒ (์ถ”์ƒ ๋ฉ”์„œ๋“œ)
    abstract void sound();
}

// ๊ตฌ์ฒด ํด๋ž˜์Šค
class Dog extends Animal {
    Dog(String name) {
        super(name);
    }

    @Override
    void sound() {
        System.out.println(name + " : ๋ฉ๋ฉ!");
    }
}

class Cat extends Animal {
    Cat(String name) {
        super(name);
    }

    @Override
    void sound() {
        System.out.println(name + " : ์•ผ์˜น!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog("์ฒ ์ˆ˜");
        Animal cat = new Cat("๋‚˜๋น„");

        dog.sound(); // ์ฒ ์ˆ˜ : ๋ฉ๋ฉ!
        cat.sound(); // ๋‚˜๋น„ : ์•ผ์˜น!
    }
}

๐Ÿค” ์™œ ์ถ”์ƒํ™”(Abstraction)๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

1. ๋ณต์žก์„ฑ ๊ฐ์†Œ

  • ๋ถˆํ•„์š”ํ•œ ์„ธ๋ถ€ ๊ตฌํ˜„์€ ์ˆจ๊ธฐ๊ณ , ์ค‘์š”ํ•œ ํŠน์ง•๊ณผ ๋™์ž‘๋งŒ ๋ฝ‘์•„๋‚ด๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ

  • ๊ณตํ†ต๋œ ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์„ ์ถ”์ถœํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐ์ฒด์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
    ์˜ˆ: Animal ์ถ”์ƒ ํด๋ž˜์Šค์—์„œ sound()๋ฅผ ์ •์˜ํ•˜๋ฉด, Dog, Cat ๋“ฑ ๋‹ค์–‘ํ•œ ๋™๋ฌผ ํด๋ž˜์Šค์—์„œ ๊ทธ๋Œ€๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅ

3. ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด

  • ์„ธ๋ถ€ ๊ตฌํ˜„์ด ๋ฐ”๋€Œ๋”๋ผ๋„ ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค(๋ฉ”์„œ๋“œ)๋งŒ ์œ ์ง€ํ•˜๋ฉด, ์™ธ๋ถ€ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

4. ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™ ์ค€์ˆ˜

  • ํ•ต์‹ฌ ๊ฐœ๋… ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ, ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ธ๋‹ค.
  • ์ฆ‰, ์„ค๊ณ„๊ฐ€ ๋” ๊น”๋”ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

๐Ÿ“Œ 3. ์ƒ์†(Inheritance)

์ƒ์†์€ ๊ธฐ์กด ํด๋ž˜์Šค(๋ถ€๋ชจ ํด๋ž˜์Šค, Superclass)์˜ ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์„ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค(์ž์‹ ํด๋ž˜์Šค, Subclass)๊ฐ€ ๋ฌผ๋ ค๋ฐ›์•„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์ฆ‰, ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์„ ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์ •์˜ํ•˜๊ณ , ์ž์‹ ํด๋ž˜์Šค์—์„œ ํ•„์š”์— ๋”ฐ๋ผ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ๋ถ€๋ชจ ํด๋ž˜์Šค
class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }

    void eat() {
        System.out.println(name + "๊ฐ€ ๋ฐฅ์„ ๋จน๋Š”๋‹ค");
    }
}

// ์ž์‹ ํด๋ž˜์Šค
class Dog extends Animal {
    Dog(String name) {
        super(name);
    }

    void play() {
        System.out.println(name + "๊ฐ€ ๊ณต๋†€์ด๋ฅผ ํ•œ๋‹ค");
    }
}

class Cat extends Animal {
    Cat(String name) {
        super(name);
    }

    void sleep() {
        System.out.println(name + "๊ฐ€ ์ž ์„ ์ž”๋‹ค");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("์ฒ ์ˆ˜");
        Cat cat = new Cat("๋‚˜๋น„");

        // ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
        dog.eat(); // ์ฒ ์ˆ˜๊ฐ€ ๋ฐฅ์„ ๋จน๋Š”๋‹ค
        cat.eat(); // ๋‚˜๋น„๊ฐ€ ๋ฐฅ์„ ๋จน๋Š”๋‹ค

        // ์ž์‹ ํด๋ž˜์Šค ๊ณ ์œ  ๊ธฐ๋Šฅ
        dog.play(); // ์ฒ ์ˆ˜๊ฐ€ ๊ณต๋†€์ด๋ฅผ ํ•œ๋‹ค
        cat.sleep(); // ๋‚˜๋น„๊ฐ€ ์ž ์„ ์ž”๋‹ค
    }
}

๐Ÿค” ์™œ ์ƒ์†(Inheritance)๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

1. ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ

  • ์ด๋ฏธ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ  ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์„ ๋†’์ธ๋‹ค.

2. ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด

  • ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•˜๋ฉด, ์ด๋ฅผ ์ƒ์†๋ฐ›์€ ๋ชจ๋“  ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์ ์šฉ๋œ๋‹ค.

3. ๊ณ„์ธต์  ๊ตฌ์กฐ ํ‘œํ˜„

  • ํ˜„์‹ค ์„ธ๊ณ„์˜ โ€œ~์€ ~์ด๋‹คโ€ ๊ด€๊ณ„๋ฅผ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์˜ˆ: Dog์€ Animal์ด๋‹ค โ†’ Dog extends Animal

4. ๋‹คํ˜•์„ฑ๊ณผ ์—ฐ๊ณ„ ๊ฐ€๋Šฅ

  • ์ƒ์†์„ ํ†ตํ•ด ๊ณตํ†ต ๋ถ€๋ชจ ํƒ€์ž…์œผ๋กœ ๋‹ค์–‘ํ•œ ์ž์‹ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด, ๋‹คํ˜•์„ฑ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ“Œ 4. ๋‹คํ˜•์„ฑ(Polymorphism)

๋‹คํ˜•์„ฑ์€ ํ•˜๋‚˜์˜ ํƒ€์ž…(์ฃผ๋กœ ๋ถ€๋ชจ ํด๋ž˜์Šค)์œผ๋กœ ์—ฌ๋Ÿฌ ์ž์‹ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์„ฑ์งˆ์„ ๋งํ•œ๋‹ค.

์ฆ‰, ๊ฐ™์€ ์ฝ”๋“œ์ง€๋งŒ ์‹ค์ œ ๊ฐ์ฒด ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ.

์˜ค๋ฒ„๋กœ๋”ฉ(Overloading)๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)์„ ํ†ตํ•ด ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

// ๋ถ€๋ชจ ํด๋ž˜์Šค
class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }

    // ๊ธฐ๋ณธ ์†Œ๋ฆฌ
    void sound() {
        System.out.println(name + "๊ฐ€ ์†Œ๋ฆฌ๋ฅผ ๋‚ธ๋‹ค");
    }

    // ์˜ค๋ฒ„๋กœ๋”ฉ ์˜ˆ์‹œ: ๊ฐ™์€ ์ด๋ฆ„, ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜
    void sound(int times) {
        for (int i = 0; i < times; i++) {
            sound();
        }
    }
}

// ์ž์‹ ํด๋ž˜์Šค 1
class Dog extends Animal {
    Dog(String name) {
        super(name);
    }

    // ์˜ค๋ฒ„๋ผ์ด๋”ฉ: ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜
    @Override
    void sound() {
        System.out.println(name + " : ๋ฉ๋ฉ!");
    }
}

// ์ž์‹ ํด๋ž˜์Šค 2
class Cat extends Animal {
    Cat(String name) {
        super(name);
    }

    @Override
    void sound() {
        System.out.println(name + " : ์•ผ์˜น!");
    }
}

public class Main {
    public static void main(String[] args) {
        // ๋ถ€๋ชจ ํƒ€์ž…์œผ๋กœ ์—ฌ๋Ÿฌ ์ž์‹ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋‹คํ˜•์„ฑ
        Animal a1 = new Dog("์ฒ ์ˆ˜");
        Animal a2 = new Cat("๋‚˜๋น„");

        a1.sound();       // ์ฒ ์ˆ˜ : ๋ฉ๋ฉ!
        a2.sound();       // ๋‚˜๋น„ : ์•ผ์˜น!

        // ์˜ค๋ฒ„๋กœ๋”ฉ ํ™œ์šฉ
        a1.sound(3);      // ์ฒ ์ˆ˜ : ๋ฉ๋ฉ! x3
        a2.sound(2);      // ๋‚˜๋น„ : ์•ผ์˜น! x2

        // ๋ฐฐ์—ด๊ณผ ๋‹คํ˜•์„ฑ
        Animal[] animals = {new Dog("๋ฝ€์‚"), new Cat("์ฝ”์ฝ”"), new Dog("๋ฐ”๋‘‘์ด")};
        for (Animal a : animals) {
            a.sound();    // ๊ฐ ๊ฐ์ฒด ํƒ€์ž…์— ๋งž๋Š” ์†Œ๋ฆฌ ์ถœ๋ ฅ
        }
    }
}

๐Ÿค” ์™œ ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

1. ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ

  • ๋ถ€๋ชจ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ์—ฌ๋Ÿฌ ์ž์‹ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๋‹ค์–‘ํ•œ ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์˜ˆ: Animal[] animals ๋ฐฐ์—ด์— Dog, Cat, Bird ๋“ฑ์„ ํ•œ ๋ฒˆ์— ๋‹ด๊ณ  ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ชจ๋‘ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ

2.์œ ์—ฐํ•œ ์„ค๊ณ„ ๊ฐ€๋Šฅ

  • ํ”„๋กœ๊ทธ๋žจ ์ˆ˜์ •์ด๋‚˜ ํ™•์žฅ์ด ์‰ฝ๋‹ค.
  • ์ƒˆ๋กœ์šด ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋˜์–ด๋„ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ฑฐ์˜ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

3. ์ค‘๋ณต ์ฝ”๋“œ ๊ฐ์†Œ

  • ๊ณตํ†ต ๊ธฐ๋Šฅ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์ •์˜ โ†’ ์ž์‹ ํด๋ž˜์Šค์—์„œ ํ•„์š” ์‹œ ์žฌ์ •์˜(overriding)
  • ๋ฐ˜๋ณต์ ์ธ if/else ๋˜๋Š” switch๋ฌธ ์—†์ด ์—ฌ๋Ÿฌ ๊ฐ์ฒด ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

4. ๋™์  ๋ฐ”์ธ๋”ฉ(Dynamic Binding) ํ™œ์šฉ

  • ์‹คํ–‰ ์‹œ์ ์— ์‹ค์ œ ๊ฐ์ฒด ํƒ€์ž…์— ๋งž๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ, ์ฝ”๋“œ๊ฐ€ ๋” ์ง๊ด€์ ์ด๊ณ  ์•ˆ์ „ํ•ด์ง„๋‹ค.

๐Ÿ“š ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading)

๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜(Method Signature)

๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ(Method Overloading)์˜ ํ•ต์‹ฌ์€ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜(Method Signature)์— ์žˆ๋‹ค.

๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜(Method Signature)๋ž€ ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด, ์ฆ‰ ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๋‘ ๋ฉ”์„œ๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์˜ค๋ฒ„๋กœ๋”ฉ ๋ฉ”์„œ๋“œ๊ฐ€ ๋˜๋ ค๋ฉด ๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค.

  1. ๋ฉ”์„œ๋“œ ์ด๋ฆ„

  2. ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆ˜

  3. ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์˜ ์ˆœ์„œ

โš ๏ธ ์ฃผ์˜: ๋ฆฌํ„ดํƒ€์ž…์€ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆฌํ„ดํƒ€์ž…๋งŒ ๋‹ค๋ฅด๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ฐ™์œผ๋ฉด ์˜ค๋ฒ„๋กœ๋”ฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์˜ˆ์‹œ

public class Calculator {

    // ๊ฐ€๋Šฅ: ๊ธฐ๋ณธ ๋ง์…ˆ
    public int add(int a, int b) {
        return a + b;
    }

    // ๊ฐ€๋Šฅ: ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์ฒ˜๋ฆฌ
    public int add(int a) {
        return a;
    }

    // ๊ฐ€๋Šฅ: ์‹ค์ˆ˜ ํƒ€์ž… ๋ง์…ˆ
    public double add(double a, double b) {
        return a + b;
    }

    // ๊ฐ€๋Šฅ: ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ
    public String add(String a, String b) {
        return a + b;
    }

    // ๋ถˆ๊ฐ€๋Šฅ: ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜์™€ ํƒ€์ž…์ด ๊ธฐ์กด ๋ฉ”์„œ๋“œ์™€ ๋™์ผ
    // public void add(int x, int y) { }

    // ๋ถˆ๊ฐ€๋Šฅ: ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜์™€ ํƒ€์ž…์ด ๊ธฐ์กด ๋ฉ”์„œ๋“œ์™€ ๋™์ผ
    // public int add(int a, int b) { return 0; }
}

๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ(Method Overloading)

์ž๋ฐ”์—์„œ๋Š” ํ•œ ํด๋ž˜์Šค ๋‚ด์— ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ค‘๋ณตํ•ด์„œ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋‚˜ ํƒ€์ž…, ์ˆœ์„œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜๋ฉด, ํ•˜๋‚˜์˜ ์ด๋ฆ„์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ(Method Overloading)์€ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ทธ๋‹ˆ์ฒ˜(Signature)๋กœ ์—ฌ๋Ÿฌ ๊ฐœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ๋Š” println() ๋ฉ”์„œ๋“œ๋ฅผ ๋“ค ์ˆ˜ ์žˆ๋‹ค.
PrintStream ํด๋ž˜์Šค์—๋Š” ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์•ฝ 10๊ฐ€์ง€ ์ด์ƒ์˜ ์˜ค๋ฒ„๋กœ๋”ฉ๋œ println() ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

public void println() {
    newLine();
}

public void println(boolean x) {
    synchronized (this) {
        print(x);
        newLine();
    }
}

public void println(char x) {
    synchronized (this) {
        print(x);
        newLine();
    }
}

public void println(int x) {
    synchronized (this) {
        print(x);
        newLine();
    }
}

public void println(String s) {
    synchronized (this) {
        print(s);
        newLine();
    }
}

private void print(boolean b) {
    System.out.print(b);
}

private void print(char c) {
    System.out.print(c);
}

private void print(int i) {
    System.out.print(i);
}

private void print(String s) {
    System.out.print(s);
}

private void newLine() {
    System.out.println();
}

์˜ค๋ฒ„๋กœ๋”ฉ(Overloading)์€ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์ด ์•„๋‹Œ ๋ฉ”์†Œ๋“œ๋“ค์„ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด, ํ˜‘์—… ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค๋ผ๋ฆฌ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์˜ค๋ฒ„๋กœ๋”ฉ(Overloading)์„ ์ž˜๋ชป ์‚ฌ์šฉํ•œ๋‹ค๋ฉด?

import java.util.*;

public class Main {

    public static void main(String[] args) {

        Collection<?>[] collections = {
            new LinkedHashSet<Integer>(),
            new LinkedList<String>(),
            new ArrayList<Double>(),
            new TreeSet<Character>()
        };

        for (Collection<?> c : collections) {
            System.out.println(classify(c));
        }
    }

    public static String classify(Set<?> s) {
        return "Set";
    }

    public static String classify(List<?> l) {
        return "List";
    }

    public static String classify(Collection<?> c) {
        return "Other Collection";
    }
}

์ถœ๋ ฅ ๊ฒฐ๊ณผ

Other Collection
Other Collection
Other Collection
Other Collection

์˜ค๋ฒ„๋กœ๋”ฉ์€ ์ปดํŒŒ์ผ ์‹œ์ ์— ์ฐธ์กฐ ํƒ€์ž… ๊ธฐ์ค€์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค. ์ฆ‰, ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ LinkedHashSet์ด๋“ , LinkedList๋“  ์ƒ๊ด€์—†์ด Collection ํƒ€์ž…์ด๋ฏ€๋กœ `classify(Collection c)`๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ• ๋ ค๋ฉด instanceof ๋ฅผ ํ™œ์šฉํ•ด์•ผํ•œ๋‹ค.

 public static String classify(Collection<?> c) {
        if (c instanceof Set) return "Set";
        if (c instanceof List) return "List";
        return "Other Collection";
    }

๐Ÿ“š ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)

์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง„ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฉ”์†Œ๋“œ๋„ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ์ƒ์†๋˜์–ด ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ํ•„์š”์— ๋”ฐ๋ผ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋Š” ํด๋ž˜์Šค์—์„œ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)์ด๋ผ๊ณ  ํ•œ๋‹ค.

์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding) ์กฐ๊ฑด

  • ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋ ค๋ฉด ๋ฉ”์†Œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜(๋ฆฌํ„ด ํƒ€์ž…, ๋ฉ”์†Œ๋“œ ์ด๋ฆ„, ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ)๊ฐ€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

  • ์ ‘๊ทผ ์ œ์–ด์ž๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ๋ณด๋‹ค ์ข์€ ๋ฒ”์œ„๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
    -> ์˜ˆ: ๋ถ€๋ชจ ๋ฉ”์†Œ๋“œ๊ฐ€ protected๋ผ๋ฉด, ์ž์‹ ํด๋ž˜์Šค์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋ฉ”์†Œ๋“œ๋Š” protected๋‚˜ public์ด์–ด์•ผ ํ•œ๋‹ค.
    ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ฐ™์€ ๋ฒ”์œ„์˜ ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ณด๋‹ค ๋” ๋งŽ์€ ์˜ˆ์™ธ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.

์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding) ์‚ฌ์šฉ ์ด์œ 

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

๋งŒ์•ฝ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ฉด, ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋Š” ์—ฌ์ „ํžˆ ๊ทธ๋Œ€๋กœ ์กด์žฌํ•˜๊ฒŒ ๋˜์–ด ์˜๋„์น˜ ์•Š์€ ๊ธฐ๋Šฅ์ด ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค.

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

๊ธฐ์กด ๊ธฐ๋Šฅ ์ œํ•œ ๋˜๋Š” ์ˆ˜์ •
๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๊ฐ€ ์ž์‹ ํด๋ž˜์Šค์— ์ ํ•ฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋ถ€์ ์ ˆํ•œ ๊ธฐ๋Šฅ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์˜ˆ์ƒ ์งˆ๋ฌธ

์บก์Аํ™”๋Š” ์™œ ์‚ฌ์šฉํ•˜๋‚˜์š”?

์บก์Аํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€์—์„œ ๋งˆ์Œ๋Œ€๋กœ ๋ฐ”๊พธ์ง€ ๋ชปํ•˜๊ฒŒ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Person ํด๋ž˜์Šค์˜ age๋ฅผ private์œผ๋กœ ์„ ์–ธํ•˜๊ณ , setAge() ๋ฉ”์„œ๋“œ์—์„œ ์Œ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ๊ฒ€์ฆํ•˜๋ฉด, ์ž˜๋ชป๋œ ๊ฐ’์œผ๋กœ ๊ฐ์ฒด ์ƒํƒœ๊ฐ€ ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ๋ฐ”๋€Œ๋”๋ผ๋„ ์™ธ๋ถ€ ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.

์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ์™œ ์‚ฌ์šฉํ•˜๋‚˜์š”?

์˜ค๋ฒ„๋กœ๋”ฉ์€ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, add(int a, int b)์™€ add(double a, double b)์ฒ˜๋Ÿผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์ •์ˆ˜์™€ ์‹ค์ˆ˜๋ฅผ ๋”ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์“ฐ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋Šฅ์€ ๊ฐ™์•„๋„ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ์ง€์–ด์•ผ ํ•ด์„œ ์ฝ”๋“œ๊ฐ€ ์‚ฐ๋งŒํ•ด์ง€๊ณ , ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

๋ฐ˜๋ฉด, ์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค ์ƒํ™ฉ์— ๋งž๊ฒŒ ๋ฐ”๊ฟ”์„œ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Animal ํด๋ž˜์Šค์— sound() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๊ณ , Cat ํด๋ž˜์Šค์—์„œ ์ด๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋ฉด Cat ๊ฐ์ฒด๊ฐ€ sound()๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ โ€˜์•ผ์˜นโ€™์ด๋ผ๊ณ  ์ถœ๋ ฅ๋œ๋‹ค. ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ๋Œ€๋กœ ๋™์ž‘ํ•ด์„œ ์ž์‹ ๊ฐ์ฒด์— ๋งž๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค.

profile
๋…ธ๋ ฅ์€ ๋ฐฐ์‹ ํ•˜์ง€ ์•Š์•„ ๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€