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

<Hello Hosung๐Ÿ˜Ž/>

[Java] ์ธํ„ฐํŽ˜์ด์Šค๋ž€? ๋ณธ๋ฌธ

๐Ÿ’ป Java/ใ…คJava(Basic)

[Java] ์ธํ„ฐํŽ˜์ด์Šค๋ž€?

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

์ž๋ฐ” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” ์ถ”์ƒ์ ์ธ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฉ”์„œ๋“œ์˜ ์„ ์–ธ๋งŒ ํฌํ•จํ•˜๊ณ , ๋ฉ”์„œ๋“œ ๋ณธ์ฒด(๊ตฌํ˜„)๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„(implement)ํ•˜๋ฉด, ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฃผ๋œ ๋ชฉ์ ์€ ๋‹คํ˜•์„ฑ์„ ์ œ๊ณตํ•˜๊ณ , ๋А์Šจํ•œ ๊ฒฐํ•ฉ์„ ์œ ๋„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค์ด ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ด๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•


์ธํ„ฐํŽ˜์ด์Šค๋Š” interface ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Animal์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , sound()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

interface Animal {
    void sound(); // ๋ฉ”์„œ๋“œ ์„ ์–ธ (๊ตฌํ˜„ X)
}


์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ public abstract๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฉ”์„œ๋“œ์— public์ด๋‚˜ abstract ํ‚ค์›Œ๋“œ๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ๊ทธ ์†์„ฑ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„


์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” implements ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

class Dog implements Animal {
    @Override
    public void sound() {
        System.out.println("๋ฉ๋ฉ!");
    }
}

class Cat implements Animal {
    @Override
    public void sound() {
        System.out.println("์•ผ์˜น!");
    }
}


์œ„ ์˜ˆ์ œ์—์„œ Dog ํด๋ž˜์Šค์™€ Cat ํด๋ž˜์Šค๋Š” ๋ชจ๋‘ Animal ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ๊ฐ๊ฐ sound() ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ง•


1. ๋‹ค์ค‘ ์ƒ์†: ์ž๋ฐ”๋Š” ํด๋ž˜์Šค์˜ ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

interface Flyable {
    void fly();
}

interface Swimmable {
    void swim();
}

class Duck implements Flyable, Swimmable {
    @Override
    public void fly() {
        System.out.println("์˜ค๋ฆฌ ๋‚˜๋Š” ์ค‘!");
    }

    @Override
    public void swim() {
        System.out.println("์˜ค๋ฆฌ ์ˆ˜์˜ ์ค‘!");
    }
}

์œ„์™€ ๊ฐ™์ด Duck ํด๋ž˜์Šค๋Š” Flyable๊ณผ Swimmable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋‹คํ˜•์„ฑ: ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Animal ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” Dog๋‚˜ Cat ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.sound();  // "๋ฉ๋ฉ!"
        
        animal = new Cat();
        animal.sound();  // "์•ผ์˜น!"
    }
}

Animal ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ๋ณ€์ˆ˜ animal์€ Dog ๊ฐ์ฒด์™€ Cat ๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๊ฐ€ ๋” ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

3. ๋””ํดํŠธ ๋ฉ”์„œ๋“œ (Java 8 ์ดํ›„): Java 8๋ถ€ํ„ฐ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— default ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. default ๋ฉ”์„œ๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ ๋ฐ˜๋“œ์‹œ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

interface Animal {
    void sound(); // ์ถ”์ƒ ๋ฉ”์„œ๋“œ

    default void eat() {
        System.out.println("์Œ์‹์„ ๋จน์Šต๋‹ˆ๋‹ค.");
    }
}

class Dog implements Animal {
    @Override
    public void sound() {
        System.out.println("๋ฉ๋ฉ!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.sound();  // "๋ฉ๋ฉ!"
        dog.eat();    // "์Œ์‹์„ ๋จน์Šต๋‹ˆ๋‹ค."
    }
}

Dog ํด๋ž˜์Šค๋Š” sound() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์•ผ ํ•˜์ง€๋งŒ, eat() ๋ฉ”์„œ๋“œ๋Š” default๋กœ ์ œ๊ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ฐจ์ด


์ž์ฃผ ํ˜ผ๋™๋˜๋Š” ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐœ๋…์€ ๋ชจ๋‘ ๋ฉ”์„œ๋“œ์˜ ๊ตฌํ˜„์„ ๊ฐ•์ œํ•˜๋Š” ์—ญํ• ์„ ํ•˜์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ƒ ํด๋ž˜์Šค: ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ผ๋ถ€๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ณ€์ˆ˜์™€ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค: ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์ด ์—†๊ณ , ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์—์„œ๋Š” default ๋ฉ”์„œ๋“œ ์™ธ์—๋Š” ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋ณ€์ˆ˜๋Š” public static final์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์˜ ํ™œ์šฉ ์˜ˆ์‹œ


์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฃผ๋กœ ๋™์ž‘์„ ์ •์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์–‘ํ•œ Payment ๋ฐฉ์‹(์นด๋“œ ๊ฒฐ์ œ, ํ˜„๊ธˆ ๊ฒฐ์ œ ๋“ฑ)์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์˜ ํ†ต์ผ์„ฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

interface Payment {
    void processPayment();
}

class CreditCardPayment implements Payment {
    @Override
    public void processPayment() {
        System.out.println("์นด๋“œ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ");
    }
}

class CashPayment implements Payment {
    @Override
    public void processPayment() {
        System.out.println("ํ˜„๊ธˆ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ");
    }
}

public class Main {
    public static void main(String[] args) {
        Payment payment = new CreditCardPayment();
        payment.processPayment();  // "์นด๋“œ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ"
        
        payment = new CashPayment();
        payment.processPayment();  // "ํ˜„๊ธˆ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ"
    }
}

์ด์ฒ˜๋Ÿผ Payment ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๊ฒฐ์ œ ๋ฐฉ๋ฒ•์„ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋งˆ๋ฌด๋ฆฌ


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