๊ด€๋ฆฌ ๋ฉ”๋‰ด

<Hello Hosung๐Ÿ˜Ž/>

[Java] ์ƒ์†์— ๋Œ€ํ•ด ์‰ฝ๊ฒŒ ์•Œ์•„๋ณด์ž๐Ÿง ๋ณธ๋ฌธ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[Java] ์ƒ์†์— ๋Œ€ํ•ด ์‰ฝ๊ฒŒ ์•Œ์•„๋ณด์ž๐Ÿง

์ขŒ์ถฉ์šฐ๋Œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ผ๊ธฐ๐Ÿง 2024. 11. 11. 07:49

์ž๋ฐ”๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP) ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜๋Š” "์ƒ์†"์ž…๋‹ˆ๋‹ค. ์ƒ์†์„ ํ™œ์šฉํ•˜๋ฉด ๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๋ธ”๋กœ๊ทธ์—์„œ๋Š” ์ž๋ฐ” ์ƒ์†์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ์‹ค์ œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๋ช… ๋“œ๋ฆด๊ฒŒ์š”๐Ÿ˜€

1. ์ƒ์†์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?


**์ƒ์†(Inheritance)**์€ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฌผ๋ ค๋ฐ›๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋ถ€๋ชจ ํด๋ž˜์Šค(์ƒ์œ„ ํด๋ž˜์Šค)์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค(ํ•˜์œ„ ํด๋ž˜์Šค)์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฏ€๋กœ, ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ํšจ์œจ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์†์˜ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ

class ๋ถ€๋ชจํด๋ž˜์Šค {
    // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์†์„ฑ(ํ•„๋“œ)๊ณผ ๋ฉ”์„œ๋“œ
}

class ์ž์‹ํด๋ž˜์Šค extends ๋ถ€๋ชจํด๋ž˜์Šค {
    // ์ž์‹ ํด๋ž˜์Šค์˜ ์ถ”๊ฐ€์ ์ธ ์†์„ฑ(ํ•„๋“œ)๊ณผ ๋ฉ”์„œ๋“œ
}

extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค.

2. ๊ฐ„๋‹จํ•œ ์ƒ์† ์˜ˆ์ œ


๋‹ค์Œ์€ ๋™๋ฌผ๊ณผ ๊ณ ์–‘์ด ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ƒ์†์„ ์„ค๋ช…ํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

2.1. ๋ถ€๋ชจ ํด๋ž˜์Šค: Animal

class Animal {
    // ํ•„๋“œ
    String name;

    // ์ƒ์„ฑ์ž
    public Animal(String name) {
        this.name = name;
    }

    // ๋ฉ”์„œ๋“œ
    public void sound() {
        System.out.println("๋™๋ฌผ์ด ์†Œ๋ฆฌ๋ฅผ ๋‚ธ๋‹ค.");
    }
}


2.2. ์ž์‹ ํด๋ž˜์Šค: Cat

class Cat extends Animal {
    // ์ƒ์„ฑ์ž
    public Cat(String name) {
        super(name);  // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
    }

    // ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    @Override
    public void sound() {
        System.out.println(name + "๋Š” ์•ผ์˜น~ ํ•˜๊ณ  ์šธ์–ด์š”.");
    }

    // ๊ณ ์–‘์ด๋งŒ์˜ ๋ฉ”์„œ๋“œ
    public void scratch() {
        System.out.println(name + "๊ฐ€ ํ• ํ€ด๊ณ  ์žˆ์–ด์š”!");
    }
}


2.3. ์‹คํ–‰ ํด๋ž˜์Šค: Main

public class Main {
    public static void main(String[] args) {
        // Animal ๊ฐ์ฒด ์ƒ์„ฑ
        Animal animal = new Animal("๋™๋ฌผ");
        animal.sound();  // ๋™๋ฌผ์ด ์†Œ๋ฆฌ๋ฅผ ๋‚ธ๋‹ค.

        // Cat ๊ฐ์ฒด ์ƒ์„ฑ
        Cat cat = new Cat("๊ณ ์–‘์ด");
        cat.sound();  // ๊ณ ์–‘์ด๋Š” ์•ผ์˜น~ ํ•˜๊ณ  ์šธ์–ด์š”.
        cat.scratch(); // ๊ณ ์–‘์ด๊ฐ€ ํ• ํ€ด๊ณ  ์žˆ์–ด์š”!
    }
}


์ถœ๋ ฅ ๊ฒฐ๊ณผ

๋™๋ฌผ์ด ์†Œ๋ฆฌ๋ฅผ ๋‚ธ๋‹ค.
๊ณ ์–‘์ด๋Š” ์•ผ์˜น~ ํ•˜๊ณ  ์šธ์–ด์š”.
๊ณ ์–‘์ด๊ฐ€ ํ• ํ€ด๊ณ  ์žˆ์–ด์š”!


3. ์ƒ์†์˜ ์ฃผ์š” ํŠน์ง•


3.1. ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฌผ๋ ค๋ฐ›๋Š”๋‹ค
์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์†์„ฑ(ํ•„๋“œ)๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฌผ๋ ค๋ฐ›์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„ ์ฝ”๋“œ์—์„œ Cat ํด๋ž˜์Šค๋Š” Animal ํด๋ž˜์Šค์˜ name๊ณผ sound() ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค.

3.2. ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Method Overriding)
์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜(์˜ค๋ฒ„๋ผ์ด๋“œ)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @Override ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Cat ํด๋ž˜์Šค์˜ sound() ๋ฉ”์„œ๋“œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ sound() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3.3. ์ƒ์„ฑ์ž ํ˜ธ์ถœ
์ž์‹ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด super() ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์—์„œ Cat ํด๋ž˜์Šค๋Š” super(name)์„ ํ†ตํ•ด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

3.4. ์ž์‹ ํด๋ž˜์Šค๋งŒ์˜ ๊ณ ์œ ํ•œ ๋ฉ”์„œ๋“œ
์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ถ”๊ฐ€์ ์ธ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ์—์„œ Cat ํด๋ž˜์Šค๋Š” scratch()๋ผ๋Š” ๊ณ ์œ ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

4. ์ƒ์†์˜ ์žฅ์ 


์ฝ”๋“œ ์žฌ์‚ฌ์šฉ
๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ(์†์„ฑ, ๋ฉ”์„œ๋“œ)๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹คํ˜•์„ฑ ํ™œ์šฉ
๋ถ€๋ชจ ํด๋ž˜์Šค ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋กœ ์ž์‹ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹คํ˜•์„ฑ(Polymorphism)์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ค‘์š”ํ•œ ํŠน์ง•์ž…๋‹ˆ๋‹ค.

5. ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•œ ์˜ˆ์ œ


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

public class Main {
    public static void main(String[] args) {
        // ๋‹คํ˜•์„ฑ ํ™œ์šฉ
        Animal myCat = new Cat("๋‚˜๋น„");
        myCat.sound();  // ๋‚˜๋น„๋Š” ์•ผ์˜น~ ํ•˜๊ณ  ์šธ์–ด์š”.
    }
}

์ด ์˜ˆ์ œ์—์„œ Animal ํƒ€์ž…์˜ myCat ๋ณ€์ˆ˜๋Š” ์‹ค์ œ๋กœ Cat ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. myCat.sound()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Cat ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ sound() ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.


6. ๋งˆ๋ฌด๋ฆฌ


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

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