๐Ÿ“•์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค

dev_itzel_02โœจยท2024๋…„ 8์›” 27์ผ
post-thumbnail

๐Ÿท๏ธ์ถ”์ƒํด๋ž˜์Šค

์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค

  • ์ธ์Šคํ„ด์Šคํ™” ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์ƒ์†์„ ํ†ตํ•ด ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜๊ฑฐ๋‚˜ ํ™•์žฅ๋˜์–ด์•ผ ํ•จ.
  • ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ณตํ†ต์ ์ธ ํŠน์„ฑ์„ ์ •์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋จ.

โ“์ถ”์ƒ๋ฉ”์†Œ๋“œ

๐Ÿ‘‰๐Ÿผ ์™„์ „ํžˆ ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๋ฉ”์†Œ๋“œ๋กœ ๊ทœ๊ฒฉ๋งŒ ์กด์žฌํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Œ
๐Ÿ‘‰๐Ÿผ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ์—ญํ• 

๐Ÿท๏ธ์ถ”์ƒํด๋ž˜์Šค์˜ ์žฅ์ 

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

๐Ÿท๏ธ์„ ์–ธ ๋ฐฉ๋ฒ•

  • abstract ํ‚ค์›Œ๋“œ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธ

e.g.

๐Ÿ“‘์ถ”์ƒ ํด๋ž˜์Šค

abstract class AbstractClass {
    // ๊ตฌํ˜„๋œ ๋ฉ”์†Œ๋“œ
    public void implementedMethod() {
        System.out.println("a");
    }
    
    // ์ถ”์ƒ ๋ฉ”์†Œ๋“œ
    public abstract void abstractMethod();
}

๐Ÿ“‘์ƒ์† ํด๋ž˜์Šค

class ConcreteClass extends AbstractClass {
    public void abstractedMethod() {
        System.out.println("b");
    }
}

๐Ÿ“‘๋ฉ”์ธ ํด๋ž˜์Šค

public class Main {
    public static void main(String[] args) {
        ConcreteClass cc = new ConcreteClass();
        cc.implementedMethod(); // a
        cc.abstractMethod(); // b
    }
}

๐Ÿท๏ธ์ธํ„ฐํŽ˜์ด์Šค

๋ชจ๋“  ๋ฉ”์†Œ๋“œ๊ฐ€ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ์ธ ํด๋ž˜์Šค(๊ธฐ๋Šฅ ๋ช…์„ธ์„œ)

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

๐Ÿท๏ธ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ•„์š”์„ฑ

  • ํด๋ž˜์Šค์—๊ฒŒ ํŠน์ • ํ–‰๋™์„ ๊ฐ•์ œํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ํด๋ž˜์Šค๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ค„์ด๊ณ  ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‹ถ์„ ๋•Œ

๐Ÿท๏ธ์„ ์–ธ ๋ฐฉ๋ฒ•

  • interface ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
  • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ public abstract์ด๋ฉฐ, ์ƒ๋žต ๊ฐ€๋Šฅ
  • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ public static final์ด๋ฉฐ, ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š” ์ƒ์ˆ˜
    • static : ๊ฐ์ฒด ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•  ๋•Œ๋Š” implements ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
  • ํ•œ ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ,๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋™์‹œ์— ๊ตฌํ˜„ ๊ฐ€๋Šฅ ๐Ÿ‘‰๐Ÿผ ๋‹ค์ค‘ ์ธํ„ฐํŽ˜์ด์Šค

e.g.

๐Ÿ“‘์ธํ„ฐํŽ˜์ด์Šค

interface Animal {
    void eat();
    void sleep();
}

๐Ÿ“‘์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

class Dog implements Animal {
    public void eat() {
        System.out.println("Dog eats");
    }
    
    public void sleep() {
        System.out.println("Dog sleeps");
    }
}

๐Ÿ“‘๋ฉ”์ธ ํด๋ž˜์Šค

class Main {
    public static void main(String[] args) {
        // Dog์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๋Š” myDog
        // Animal์˜ ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์žˆ๋Š” myDog
        Dog myDog = new Dog(); 
        myDog.eat();
        myDog.sleep();
    }
}

๐Ÿท๏ธ๋‹ค์ค‘ ์ธํ„ฐํŽ˜์ด์Šค

e.g.

๐Ÿ“‘์ธํ„ฐํŽ˜์ด์Šค

interface Flyable {
    void fly();
}

interface Runnable {
    void run();
}

class Animal {
    // ...
}

๐Ÿ“‘์ธํ„ฐํŽ˜์ด์Šค ๋‹ค์ค‘์ƒ์†

class SuperAnimal extends Animal implements Runnable, Flyable {
    public void run() {
        System.out.println("running");
    }
    
    public void fly() {
        System.out.println("flying");
    }
}
profile
๐Ÿœ๐Ÿ‘ฃsteadiness๐Ÿœ๐Ÿ‘ฃ

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