** ๐Ÿ“Œ 1๋‹จ๊ณ„: ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)์˜ ํƒ„์ƒ ๋ฐฐ๊ฒฝ**

1๏ธโƒฃ ๊ธฐ์กด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹(์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์˜ ํ•œ๊ณ„

์ดˆ๊ธฐ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Procedural Programming) ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค.

์ด ๋ฐฉ์‹์€ ๋ช…๋ น์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ตฌ์กฐ์˜€๋‹ค.

๐Ÿ”น ์˜ˆ์ œ (์ ˆ์ฐจ์ง€ํ–ฅ ๋ฐฉ์‹์˜ ํ–„๋ฒ„๊ฑฐ ์ฃผ๋ฌธ ์ฝ”๋“œ)

print("์ฃผ๋ฌธ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.");
print("ํ–„๋ฒ„๊ฑฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.");
print("๊ฒฐ์ œํ•ฉ๋‹ˆ๋‹ค.");

๐Ÿ”น ๋ฌธ์ œ์ 

โœ… ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›€

โœ… ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„ ๋น„ํšจ์œจ์ 

โœ… ๋ฐ์ดํ„ฐ์™€ ํ•จ์ˆ˜๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ๋ณต์žกํ•จ

2๏ธโƒฃ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)์˜ ๋“ฑ์žฅ

์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์„ โ€œ๋ฐ์ดํ„ฐ + ๋™์ž‘โ€์„ ๊ฐ€์ง„ ๊ฐ์ฒด ๋‹จ์œ„๋กœ ๊ตฌ์„ฑํ•˜์—ฌ, ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ์‹์ด๋‹ค.

๐Ÿ”น ๊ฐ์ฒด์ง€ํ–ฅ ๋ฐฉ์‹ ์˜ˆ์ œ (ํ–„๋ฒ„๊ฑฐ ์ฃผ๋ฌธ ์ฝ”๋“œ)

class Burger {
    void makeBurger() {
        System.out.println("ํ–„๋ฒ„๊ฑฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.");
    }
}

class Order {
    void takeOrder() {
        System.out.println("์ฃผ๋ฌธ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.");
    }
}

class Payment {
    void processPayment() {
        System.out.println("๊ฒฐ์ œํ•ฉ๋‹ˆ๋‹ค.");
    }
}

๐Ÿ”น OOP ๋ฐฉ์‹์˜ ์žฅ์ 

โœ… ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ (๊ฐ์ฒดํ™”)

โœ… ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธ๋ฆฌํ•จ (๋ชจ๋“ˆํ™”)

โœ… ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚จ (์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์šฉ์ด)

3๏ธโƒฃ OOP์˜ ๋ฐœ์ „ ๊ณผ์ •

โœ… 1960๋…„๋Œ€: ์ตœ์ดˆ์˜ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด Simula ๋“ฑ์žฅ

โœ… 1980๋…„๋Œ€: C++ ๋“ฑ์žฅ, ๊ฐ์ฒด์ง€ํ–ฅ ๊ฐœ๋…์ด ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋„์ž…

โœ… 1995๋…„: Java ํƒ„์ƒ, ์›น๊ณผ ํ•จ๊ป˜ ๋Œ€์ค‘ํ™”

โœ… 2000๋…„๋Œ€ ์ดํ›„: Python, C#, Kotlin, Swift ๋“ฑ ๋‹ค์–‘ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด ๋“ฑ์žฅ

๐Ÿ‘‰ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์„ ๋” ์‰ฝ๊ณ , ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ํ˜์‹ ์ ์ธ ๊ฐœ๋…์ด๋‹ค! ๐Ÿš€

๐Ÿ“Œ 2๋‹จ๊ณ„: ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)์˜ 4๊ฐ€์ง€ ํ•ต์‹ฌ ์›์น™

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

์ด ์›์น™๋“ค์€ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ด๊ณ , ๋ณด๋‹ค ์•ˆ์ •์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค.


1๏ธโƒฃ ์บก์Аํ™”(Encapsulation) - โ€œ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ & ์ ‘๊ทผ ์ œํ•œโ€

๐Ÿ” ๊ฐœ๋…

์บก์Аํ™”๋Š” ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ , ์™ธ๋ถ€์—์„œ๋Š” ์ œํ•œ๋œ ๋ฐฉ์‹์œผ๋กœ๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

์ฆ‰, ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ(๋ฉ”์„œ๋“œ)์„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๋ฌถ๊ณ , ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.

โš ๏ธ ์™œ ํ•„์š”ํ• ๊นŒ?

โœ” ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ์ˆ˜์ • ๋ฐฉ์ง€ (์˜ˆ: ์ฒด๋ ฅ์ด -100์ด ๋˜๋Š” ๋ฌธ์ œ)

โœ” ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ , ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ž„

โœ” ๋ณด์•ˆ ๊ฐ•ํ™” (์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ˆ˜์ •๋˜์ง€ ์•Š์Œ)

๐Ÿ“ ์˜ˆ์ œ ์ฝ”๋“œ (์บก์Аํ™”๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒŒ์ž„ ์บ๋ฆญํ„ฐ)

class Player {
    private int hp = 100; // ์ฒด๋ ฅ์€ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

    public int getHp() {  // ์ฒด๋ ฅ ์กฐํšŒ (์ฝ๊ธฐ ๊ฐ€๋Šฅ)
        return hp;
    }

    public void takeDamage(int damage) {  // ์ฒด๋ ฅ ๊ฐ์†Œ (์“ฐ๊ธฐ ๊ฐ€๋Šฅ)
        if (damage > 0) {
            hp -= damage;
            if (hp < 0) hp = 0;  // ์ฒด๋ ฅ์ด 0 ์ดํ•˜๋กœ ๋‚ด๋ ค๊ฐ€์ง€ ์•Š๋„๋ก ์„ค์ •
        }
    }
}

โœ” private ํ‚ค์›Œ๋“œ๋กœ ๋ณ€์ˆ˜ hp๋ฅผ ์ˆจ๊น€

โœ” public ๋ฉ”์„œ๋“œ(getHp(), takeDamage())๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผ


2๏ธโƒฃ ์ƒ์†(Inheritance) - โ€œ์ฝ”๋“œ ์žฌ์‚ฌ์šฉโ€

๐Ÿ” ๊ฐœ๋…

์ƒ์†์€ ๊ธฐ์กด ํด๋ž˜์Šค(๋ถ€๋ชจ)์˜ ๊ธฐ๋Šฅ์„ ๋ฌผ๋ ค๋ฐ›์•„ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค(์ž์‹)๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

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

โš ๏ธ ์™œ ํ•„์š”ํ• ๊นŒ?

โœ” ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ

โœ” ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด

โœ” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€๊ฐ€ ์‰ฌ์›€

๐Ÿ“ ์˜ˆ์ œ ์ฝ”๋“œ (๋™๋ฌผ ํด๋ž˜์Šค ์ƒ์†)

class Animal {  // ๋ถ€๋ชจ ํด๋ž˜์Šค
    void eat() {
        System.out.println("๋จน๋Š”๋‹ค!");
    }
}

// ๐Ÿ• ๊ฐ•์•„์ง€ ํด๋ž˜์Šค (Animal์„ ๋ฌผ๋ ค๋ฐ›์Œ)
class Dog extends Animal {
    void bark() {
        System.out.println("๋ฉ๋ฉ!");
    }
}

// ๐Ÿฑ ๊ณ ์–‘์ด ํด๋ž˜์Šค (Animal์„ ๋ฌผ๋ ค๋ฐ›์Œ)
class Cat extends Animal {
    void meow() {
        System.out.println("์•ผ์˜น!");
    }
}

โœ” Dog์™€ Cat์€ Animal์˜ eat() ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

โœ” ๊ฐ ํด๋ž˜์Šค์—์„œ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ(bark(), meow())์„ ์ •์˜


3๏ธโƒฃ ๋‹คํ˜•์„ฑ(Polymorphism) - โ€œํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค, ๋‹ค์–‘ํ•œ ๊ตฌํ˜„โ€

๐Ÿ” ๊ฐœ๋…

๋‹คํ˜•์„ฑ์€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

์ฆ‰, ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋กœ ๋‹ค์–‘ํ•œ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ ๋‹ค.

โš ๏ธ ์™œ ํ•„์š”ํ• ๊นŒ?

โœ” ์œ ์—ฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ

โœ” ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋›ฐ์–ด๋‚จ

โœ” ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ

๐Ÿ“ ์˜ˆ์ œ ์ฝ”๋“œ (์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ์ด์šฉํ•œ ๋‹คํ˜•์„ฑ)

class Animal {
    void speak() {
        System.out.println("๋™๋ฌผ์ด ์†Œ๋ฆฌ๋ฅผ ๋‚ธ๋‹ค!");
    }
}

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

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

public class Test {
    public static void main(String[] args) {
        Animal myPet = new Dog();
        myPet.speak();  // "๋ฉ๋ฉ!" ์ถœ๋ ฅ

        myPet = new Cat();
        myPet.speak();  // "์•ผ์˜น!" ์ถœ๋ ฅ
    }
}

โœ” ๋ถ€๋ชจ ํด๋ž˜์Šค Animal์˜ speak() ๋ฉ”์„œ๋“œ๋ฅผ Dog์™€ Cat์—์„œ ๊ฐ๊ฐ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„(์˜ค๋ฒ„๋ผ์ด๋”ฉ)

โœ” ๊ฐ™์€ Animal ํƒ€์ž…์ด์ง€๋งŒ speak()๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ (๋‹คํ˜•์„ฑ ๊ตฌํ˜„)


4๏ธโƒฃ ์ถ”์ƒํ™”(Abstraction) - โ€œํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๋…ธ์ถœโ€

๐Ÿ” ๊ฐœ๋…

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

์ฆ‰, ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์€ ๊ฐ์ถ”๊ณ , ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋งŒ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

โš ๏ธ ์™œ ํ•„์š”ํ• ๊นŒ?

โœ” ๋ณต์žกํ•œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ˆจ๊ธฐ๊ณ  ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ œ๊ณต

โœ” ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚จ

โœ” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ฆ๊ฐ€

๐Ÿ“ ์˜ˆ์ œ ์ฝ”๋“œ (์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•œ ์ถ”์ƒํ™”)

abstract class Car {
    abstract void drive();  // ๐Ÿš— "์šด์ „ํ•˜๋Š” ๋ฐฉ๋ฒ•"๋งŒ ์ •ํ•จ (๊ตฌํ˜„ X)

    public void stop() {
        System.out.println("์ž๋™์ฐจ๊ฐ€ ๋ฉˆ์ถ˜๋‹ค.");
    }
}

class Tesla extends Car {
    @Override
    void drive() {
        System.out.println("์ „๊ธฐ์ฐจ๋กœ ์ž์œจ์ฃผํ–‰!");
    }
}

class Ferrari extends Car {
    @Override
    void drive() {
        System.out.println("V12 ์—”์ง„์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๋‹ฌ๋ฆฐ๋‹ค!");
    }
}

โœ” Car ํด๋ž˜์Šค์—์„œ drive()๋ฅผ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ ์„ ์–ธ (๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ X)

โœ” ๊ฐ ์ž์‹ ํด๋ž˜์Šค(Tesla, Ferrari)์—์„œ drive()์˜ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘์„ ๊ตฌํ˜„


๐ŸŽฏ 2๋‹จ๊ณ„ ์š”์•ฝ

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

๐Ÿ“Œ 3๋‹จ๊ณ„: ํด๋ž˜์Šค์™€ ๊ฐ์ฒด - ์„ค๊ณ„๋„์™€ ์‹ค์ฒด

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)์˜ ํ•ต์‹ฌ ๊ฐœ๋…์€ ํด๋ž˜์Šค(Class)์™€ ๊ฐ์ฒด(Object) ์ด๋‹ค.

ํด๋ž˜์Šค๋Š” ์„ค๊ณ„๋„(์ฒญ์‚ฌ์ง„) ์—ญํ• ์„ ํ•˜๊ณ , ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์‹ค์ฒด(Instance) ์ด๋‹ค.


1๏ธโƒฃ ํด๋ž˜์Šค(Class)๋ž€? - ์„ค๊ณ„๋„

ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ‹€(ํ…œํ”Œ๋ฆฟ, ์„ค๊ณ„๋„) ์ด๋‹ค.

์ฆ‰, ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ์†์„ฑ(๋ณ€์ˆ˜)๊ณผ ๋™์ž‘(๋ฉ”์„œ๋“œ)์„ ๊ฐ€์งˆ์ง€ ์ •์˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๐Ÿ“ ์˜ˆ์ œ ์ฝ”๋“œ (์ž๋™์ฐจ ํด๋ž˜์Šค)

class Car {
    String color;   // ์†์„ฑ (๋ณ€์ˆ˜)
    int speed;      // ์†์„ฑ (๋ณ€์ˆ˜)

    void drive() {  // ๋™์ž‘ (๋ฉ”์„œ๋“œ)
        System.out.println("์ž๋™์ฐจ๊ฐ€ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค!");
    }

    void stop() {   // ๋™์ž‘ (๋ฉ”์„œ๋“œ)
        System.out.println("์ž๋™์ฐจ๊ฐ€ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค!");
    }
}

โœ” Car ํด๋ž˜์Šค๋Š” ์ž๋™์ฐจ์˜ ์†์„ฑ(color, speed)๊ณผ ๋™์ž‘(drive(), stop())์„ ์ •์˜

โœ” ์ด์ œ Car ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์ œ ์ž๋™์ฐจ(๊ฐ์ฒด)๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ


2๏ธโƒฃ ๊ฐ์ฒด(Object)๋ž€? - ์„ค๊ณ„๋„๋กœ ๋งŒ๋“  ์‹ค์ฒด

๊ฐ์ฒด๋Š” ํด๋ž˜์Šค(์„ค๊ณ„๋„)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์‹ค์ฒด ์ด๋‹ค.

์ฆ‰, ํด๋ž˜์Šค์—์„œ ์ •์˜ํ•œ ์†์„ฑ๊ณผ ๋™์ž‘์„ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์กด์žฌ์ด๋‹ค.

๐Ÿ“ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ ์˜ˆ์ œ

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car();  // ๊ฐ์ฒด ์ƒ์„ฑ
        myCar.color = "๋นจ๊ฐ•";  // ์†์„ฑ ์„ค์ •
        myCar.speed = 100;

        myCar.drive();  // ์ž๋™์ฐจ๊ฐ€ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค!
        System.out.println("์ƒ‰์ƒ: " + myCar.color);  // ์ƒ‰์ƒ: ๋นจ๊ฐ•
    }
}

โœ” Car myCar = new Car(); โ†’ Car ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์œผ๋กœ myCar ๊ฐ์ฒด ์ƒ์„ฑ

โœ” ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์„ค์ •ํ•˜๊ณ (myCar.color = "๋นจ๊ฐ•";) ๋™์ž‘์„ ์‹คํ–‰ (myCar.drive();)


3๏ธโƒฃ ์ƒ์„ฑ์ž(Constructor) - ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ๋‹ด๋‹น

์ƒ์„ฑ์ž๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํŠน์ˆ˜ํ•œ ๋ฉ”์„œ๋“œ ์ด๋‹ค.

์ฃผ๋กœ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๐Ÿ“ ์ƒ์„ฑ์ž ์‚ฌ์šฉ ์˜ˆ์ œ

class Car {
    String color;
    int speed;

    // ์ƒ์„ฑ์ž ์ •์˜
    Car(String color, int speed) {
        this.color = color;
        this.speed = speed;
    }

    void drive() {
        System.out.println(color + " ์ž๋™์ฐจ๊ฐ€ " + speed + "km/h๋กœ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค!");
    }
}

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car("ํŒŒ๋ž€์ƒ‰", 120);  // ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™”
        myCar.drive();  // ํŒŒ๋ž€์ƒ‰ ์ž๋™์ฐจ๊ฐ€ 120km/h๋กœ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค!
    }
}

โœ” Car(String color, int speed) โ†’ ์ƒ์„ฑ์ž์—์„œ ์†์„ฑ์„ ์ดˆ๊ธฐํ™”

โœ” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ฐ’("ํŒŒ๋ž€์ƒ‰", 120)์„ ์ „๋‹ฌํ•˜์—ฌ ์ž๋™ ์„ค์ • ๊ฐ€๋Šฅ


๐ŸŽฏ 3๋‹จ๊ณ„ ์š”์•ฝ

๊ฐœ๋… ์„ค๋ช… ์˜ˆ์ œ
ํด๋ž˜์Šค(Class) ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์„ค๊ณ„๋„ class Car { String color; void drive() {} }
๊ฐ์ฒด(Object) ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์‹ค์ฒด Car myCar = new Car();
์ƒ์„ฑ์ž(Constructor) ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์ž๋™ ํ˜ธ์ถœ๋˜๋Š” ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ Car(String color) { this.color = color; }

โžก๏ธ ํด๋ž˜์Šค(์„ค๊ณ„๋„)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ์ฒด(์‹ค์ฒด)๋ฅผ ๋งŒ๋“ค๊ณ , ์ƒ์„ฑ์ž๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋” ํŽธ๋ฆฌํ•œ ์ดˆ๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค! ๐Ÿš—


๐Ÿ“Œ 4๋‹จ๊ณ„: ์ ‘๊ทผ ์ œ์–ด์ž & ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ

1๏ธโƒฃ ์ ‘๊ทผ ์ œ์–ด์ž(Access Modifier) - ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ

์ ‘๊ทผ ์ œ์–ด์ž๋Š” ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜(ํ•„๋“œ)๋‚˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋Š” ํ‚ค์›Œ๋“œ์ด๋‹ค.

์ฆ‰, ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.


๐Ÿ”น ์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ข…๋ฅ˜

์ ‘๊ทผ ์ œ์–ด์ž ๊ฐ™์€ ํด๋ž˜์Šค ๊ฐ™์€ ํŒจํ‚ค์ง€ ์ƒ์† ๊ด€๊ณ„(๋‹ค๋ฅธ ํŒจํ‚ค์ง€) ๋‹ค๋ฅธ ํŒจํ‚ค์ง€
public โœ… โœ… โœ… โœ…
protected โœ… โœ… โœ… โŒ
default(์•„๋ฌด๊ฒƒ๋„ ์•ˆ ์”€) โœ… โœ… โŒ โŒ
private โœ… โŒ โŒ โŒ

โœ” public โ†’ ์–ด๋””์„œ๋“  ์ ‘๊ทผ ๊ฐ€๋Šฅ

โœ” protected โ†’ ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋˜๋Š” ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

โœ” default โ†’ ๊ฐ™์€ ํŒจํ‚ค์ง€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ (์•„๋ฌด๊ฒƒ๋„ ์•ˆ ์“ฐ๋ฉด ๊ธฐ๋ณธ๊ฐ’)

โœ” private โ†’ ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ


๐Ÿ”น ์˜ˆ์ œ: ์ ‘๊ทผ ์ œ์–ด์ž ์ ์šฉํ•˜๊ธฐ

class BankAccount {
    private int balance = 1000; // `private` -> ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€

    // Getter ๋ฉ”์„œ๋“œ (์ฝ๊ธฐ ๊ฐ€๋Šฅ)
    public int getBalance() {
        return balance;
    }

    // Setter ๋ฉ”์„œ๋“œ (์“ฐ๊ธฐ ๊ฐ€๋Šฅ)
    public void deposit(int amount) {
        if (amount > 0) {
            balance += amount;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        BankAccount account = new BankAccount();

        // ์ง์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€ (์˜ค๋ฅ˜ ๋ฐœ์ƒ)
        // account.balance = 5000;

        account.deposit(500);  // 500์› ์ž…๊ธˆ
        System.out.println("์ž”์•ก: " + account.getBalance());  // ์ž”์•ก: 1500
    }
}

โœ” private๋กœ balance๋ฅผ ์ˆจ๊ฒจ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅ

โœ” public ๋ฉ”์„œ๋“œ(deposit()๊ณผ getBalance())๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ


2๏ธโƒฃ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ(Method Overloading) - ๊ฐ™์€ ์ด๋ฆ„, ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜

๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ์€ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜(ํŒŒ๋ผ๋ฏธํ„ฐ)๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ฆ‰, ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.


๐Ÿ”น ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ ์˜ˆ์ œ

class MathUtil {
    // ์ •์ˆ˜ ๋ง์…ˆ
    int add(int a, int b) {
        return a + b;
    }

    // ์‹ค์ˆ˜ ๋ง์…ˆ (์˜ค๋ฒ„๋กœ๋”ฉ)
    double add(double a, double b) {
        return a + b;
    }

    // ์„ธ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋”ํ•˜๋Š” ๋ฉ”์„œ๋“œ (์˜ค๋ฒ„๋กœ๋”ฉ)
    int add(int a, int b, int c) {
        return a + b + c;
    }
}

public class Main {
    public static void main(String[] args) {
        MathUtil calc = new MathUtil();

        System.out.println(calc.add(2, 3));      // 5
        System.out.println(calc.add(2.5, 3.2));  // 5.7
        System.out.println(calc.add(1, 2, 3));   // 6
    }
}

โœ” add() ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์–‘ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•˜์—ฌ ์˜ค๋ฒ„๋กœ๋”ฉ ๊ตฌํ˜„

โœ” ์ •์ˆ˜, ์‹ค์ˆ˜, 3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋”ํ•  ๋•Œ ๊ฐ™์€ add() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ


๐ŸŽฏ 4๋‹จ๊ณ„ ์š”์•ฝ

๊ฐœ๋… ์„ค๋ช… ์˜ˆ์ œ
์ ‘๊ทผ ์ œ์–ด์ž ํด๋ž˜์Šค ๋ฉค๋ฒ„(๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ)์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฒ”์œ„๋ฅผ ์ œํ•œ private int balance;
public ์–ด๋””์„œ๋“  ์ ‘๊ทผ ๊ฐ€๋Šฅ public void deposit() {}
protected ๊ฐ™์€ ํŒจํ‚ค์ง€ & ์ƒ์† ๊ด€๊ณ„์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ protected int age;
default ๊ฐ™์€ ํŒจํ‚ค์ง€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ int score;
private ๊ฐ™์€ ํด๋ž˜์Šค์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ private String password;
๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ •์˜ int add(int a, int b) / double add(double a, double b)

โžก๏ธ ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค! ๐Ÿš€


๐Ÿ“Œ 5๋‹จ๊ณ„: ์ƒ์†(Inheritance)๊ณผ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)

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


1๏ธโƒฃ ์ƒ์†(Inheritance) - ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜์—ฌ ์žฌ์‚ฌ์šฉ

์ƒ์†์€ ๊ธฐ์กด ํด๋ž˜์Šค(๋ถ€๋ชจ)์˜ ๊ธฐ๋Šฅ์„ ๋ฌผ๋ ค๋ฐ›์•„ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค(์ž์‹)๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

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


๐Ÿ”น ์ƒ์†์˜ ์žฅ์ 

โœ… ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ โ†’ ์ค‘๋ณต ์ฝ”๋“œ ์ตœ์†Œํ™”

โœ… ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด โ†’ ๋ถ€๋ชจ ํด๋ž˜์Šค ์ˆ˜์ • ์‹œ, ์ž์‹ ํด๋ž˜์Šค์—๋„ ์ž๋™ ๋ฐ˜์˜

โœ… ๊ธฐ๋Šฅ ํ™•์žฅ ๊ฐ€๋Šฅ โ†’ ๋ถ€๋ชจ์˜ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ


๐Ÿ”น ์˜ˆ์ œ: ๋™๋ฌผ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ ๊ฐœ์™€ ๊ณ ์–‘์ด

class Animal {  // ๋ถ€๋ชจ ํด๋ž˜์Šค
    void eat() {
        System.out.println("๋จน๋Š”๋‹ค!");
    }
}

// ๐Ÿ• ๊ฐœ ํด๋ž˜์Šค (Animal์„ ์ƒ์†๋ฐ›์Œ)
class Dog extends Animal {
    void bark() {
        System.out.println("๋ฉ๋ฉ!");
    }
}

// ๐Ÿฑ ๊ณ ์–‘์ด ํด๋ž˜์Šค (Animal์„ ์ƒ์†๋ฐ›์Œ)
class Cat extends Animal {
    void meow() {
        System.out.println("์•ผ์˜น!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.eat();  // ๋ถ€๋ชจ ํด๋ž˜์Šค ๊ธฐ๋Šฅ ์‚ฌ์šฉ ("๋จน๋Š”๋‹ค!")
        myDog.bark(); // ๊ฐœ ํด๋ž˜์Šค ๊ธฐ๋Šฅ ์‚ฌ์šฉ ("๋ฉ๋ฉ!")

        Cat myCat = new Cat();
        myCat.eat();  // ๋ถ€๋ชจ ํด๋ž˜์Šค ๊ธฐ๋Šฅ ์‚ฌ์šฉ ("๋จน๋Š”๋‹ค!")
        myCat.meow(); // ๊ณ ์–‘์ด ํด๋ž˜์Šค ๊ธฐ๋Šฅ ์‚ฌ์šฉ ("์•ผ์˜น!")
    }
}

โœ” Dog์™€ Cat์€ Animal์˜ eat() ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

โœ” ๊ฐ ํด๋ž˜์Šค์—์„œ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ(bark(), meow())์„ ์ •์˜


2๏ธโƒฃ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Method Overriding) - ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜

๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜(๋ณ€๊ฒฝ)ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ฆ‰, ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์ œ๊ณตํ•œ ๊ธฐ๋ณธ ๋™์ž‘์„ ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.


๐Ÿ”น ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์˜ ๊ทœ์น™

โœ” ๋ฉ”์„œ๋“œ ์ด๋ฆ„, ๋ฐ˜ํ™˜ ํƒ€์ž…, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋™์ผํ•ด์•ผ ํ•จ

โœ” ์ ‘๊ทผ ์ œ์–ด์ž๋Š” ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ๋” ์ข์€ ๋ฒ”์œ„๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†์Œ

โœ” ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ๋” ๋„“์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•จ


๐Ÿ”น ์˜ˆ์ œ: ๋™๋ฌผ ์†Œ๋ฆฌ ์žฌ์ •์˜ํ•˜๊ธฐ (์˜ค๋ฒ„๋ผ์ด๋”ฉ ์ ์šฉ)

class Animal {
    void speak() {
        System.out.println("๋™๋ฌผ์ด ์†Œ๋ฆฌ๋ฅผ ๋‚ธ๋‹ค!");
    }
}

// ๐Ÿ• ๊ฐœ ํด๋ž˜์Šค (Animal์„ ์ƒ์†๋ฐ›์Œ)
class Dog extends Animal {
    @Override  // ๋ถ€๋ชจ์˜ speak() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    void speak() {
        System.out.println("๋ฉ๋ฉ!");
    }
}

// ๐Ÿฑ ๊ณ ์–‘์ด ํด๋ž˜์Šค (Animal์„ ์ƒ์†๋ฐ›์Œ)
class Cat extends Animal {
    @Override
    void speak() {
        System.out.println("์•ผ์˜น!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myPet = new Dog();
        myPet.speak();  // "๋ฉ๋ฉ!" (์˜ค๋ฒ„๋ผ์ด๋”ฉ๋œ ๋ฉ”์„œ๋“œ ์‹คํ–‰)

        myPet = new Cat();
        myPet.speak();  // "์•ผ์˜น!" (์˜ค๋ฒ„๋ผ์ด๋”ฉ๋œ ๋ฉ”์„œ๋“œ ์‹คํ–‰)
    }
}

โœ” ๋ถ€๋ชจ ํด๋ž˜์Šค Animal์˜ speak() ๋ฉ”์„œ๋“œ๋ฅผ Dog์™€ Cat์—์„œ ๊ฐ๊ฐ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ (์˜ค๋ฒ„๋ผ์ด๋”ฉ)

โœ” ๊ฐ™์€ Animal ํƒ€์ž…์ด์ง€๋งŒ speak() ์‹คํ–‰ ์‹œ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์ถœ๋ ฅ๋จ (๋‹คํ˜•์„ฑ ํ™œ์šฉ)


3๏ธโƒฃ super ํ‚ค์›Œ๋“œ - ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ ๋ฉ”์„œ๋“œ์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์›๋ž˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ super ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


๐Ÿ”น ์˜ˆ์ œ: super ํ‚ค์›Œ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ

class Animal {
    void speak() {
        System.out.println("๋™๋ฌผ์ด ์†Œ๋ฆฌ๋ฅผ ๋‚ธ๋‹ค!");
    }
}

class Dog extends Animal {
    @Override
    void speak() {
        super.speak();  // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ speak() ์‹คํ–‰
        System.out.println("๋ฉ๋ฉ!");  // ์ถ”๊ฐ€ ๊ธฐ๋Šฅ
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.speak();
    }
}

์ถœ๋ ฅ ๊ฒฐ๊ณผ:

๋™๋ฌผ์ด ์†Œ๋ฆฌ๋ฅผ ๋‚ธ๋‹ค!
๋ฉ๋ฉ!

โœ” super.speak();์„ ์‚ฌ์šฉํ•ด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ speak()๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•œ ํ›„, ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰


4๏ธโƒฃ ๋‹ค์ค‘ ์ƒ์† ๋ฌธ์ œ - Java์—์„œ ์ธํ„ฐํŽ˜์ด์Šค ํ™œ์šฉ

์ž๋ฐ”์—์„œ๋Š” ๋‹ค์ค‘ ์ƒ์†(์—ฌ๋Ÿฌ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๋™์‹œ์— ์ƒ์†)์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด์œ :

โœ… ๋‘ ๋ถ€๋ชจ ํด๋ž˜์Šค์— ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์ถฉ๋Œ ๊ฐ€๋Šฅ

โœ… ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›€

ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค(interface) ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋‹ค์ค‘ ์ƒ์†๊ณผ ์œ ์‚ฌํ•œ ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

(์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ์ž์„ธํžˆ ์„ค๋ช…!)


๐ŸŽฏ 5๋‹จ๊ณ„ ์š”์•ฝ

๊ฐœ๋… ์„ค๋ช… ์˜ˆ์ œ
์ƒ์†(Inheritance) ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ๋ฌผ๋ ค๋ฐ›์•„ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ class Dog extends Animal {}
์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding) ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ @Override void speak() {}
super ํ‚ค์›Œ๋“œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉ super.speak();
๋‹ค์ค‘ ์ƒ์† ๋ฌธ์ œ ์ž๋ฐ”์—์„œ๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

โžก๏ธ ์ƒ์†์„ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ†ตํ•ด ์œ ์—ฐํ•œ ์ฝ”๋“œ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค! ๐Ÿš€


๐Ÿ“Œ 6๋‹จ๊ณ„: ์ธํ„ฐํŽ˜์ด์Šค(Interface)์™€ ์ถ”์ƒ ํด๋ž˜์Šค(Abstract Class)

์ž๋ฐ”์—์„œ๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค(Interface)์™€ ์ถ”์ƒ ํด๋ž˜์Šค(Abstract Class) ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์œ ์—ฐํ•œ ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด ๋‘ ๊ฐœ๋…์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™(SOLID) ์ค‘ ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(Open-Closed Principle)์„ ๋”ฐ๋ฅด๋ฉฐ, ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ด๋Š” ํ•ต์‹ฌ ์š”์†Œ์ด๋‹ค.


1๏ธโƒฃ ์ถ”์ƒ ํด๋ž˜์Šค(Abstract Class) - โ€œ๊ณตํ†ต์ ์ธ ํŠน์ง•์„ ์ •์˜โ€

์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ค‘๊ฐ„ ํ˜•ํƒœ๋กœ, ์ผ๋ถ€๋Š” ๊ตฌํ˜„ํ•˜๊ณ  ์ผ๋ถ€๋Š” ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์ด๋‹ค.

์ฆ‰, ์ถ”์ƒ ํด๋ž˜์Šค ์ž์ฒด๋กœ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๊ณ , ์ƒ์†๋ฐ›์€ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ํ•„์ˆ˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ”น ์ถ”์ƒ ํด๋ž˜์Šค์˜ ํŠน์ง•

โœ” abstract ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์„ ์–ธ

โœ” ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ๊ตฌํ˜„ ๊ฐ€๋Šฅ, ์ผ๋ถ€๋Š” ๊ฐ•์ œ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋„๋ก ์„ค์ • ๊ฐ€๋Šฅ (abstract ๋ฉ”์„œ๋“œ)

โœ” ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Œ (new ์‚ฌ์šฉ ๋ถˆ๊ฐ€)

โœ” ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ abstract ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ


๐Ÿ”น ์˜ˆ์ œ: ์ž๋™์ฐจ(Car) ์ถ”์ƒ ํด๋ž˜์Šค

// ๐Ÿš— ์ถ”์ƒ ํด๋ž˜์Šค ์ •์˜
abstract class Car {
    abstract void drive();  // ์ถ”์ƒ ๋ฉ”์„œ๋“œ (๊ตฌํ˜„ ํ•„์š”)

    public void stop() {  // ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ (๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
        System.out.println("์ž๋™์ฐจ๊ฐ€ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.");
    }
}

// ๐ŸŽ๏ธ ์Šคํฌ์ธ ์นด (์ถ”์ƒ ํด๋ž˜์Šค ์ƒ์†)
class SportsCar extends Car {
    @Override
    void drive() {
        System.out.println("์Šคํฌ์ธ ์นด๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค!");
    }
}

// ๐Ÿšš ํŠธ๋Ÿญ (์ถ”์ƒ ํด๋ž˜์Šค ์ƒ์†)
class Truck extends Car {
    @Override
    void drive() {
        System.out.println("ํŠธ๋Ÿญ์ด ๋ฌด๊ฒ๊ฒŒ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.");
    }
}

public class Main {
    public static void main(String[] args) {
        Car myCar = new SportsCar();
        myCar.drive();  // "์Šคํฌ์ธ ์นด๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค!"
        myCar.stop();   // "์ž๋™์ฐจ๊ฐ€ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค."
    }
}

โœ” Car๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ด๋ฏ€๋กœ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Œ (new Car(); ๋ถˆ๊ฐ€)

โœ” ์ž์‹ ํด๋ž˜์Šค์—์„œ drive()๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ

โœ” ๊ณตํ†ต ๋™์ž‘(stop())์€ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ


2๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค(Interface) - โ€œ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜๋Š” ๊ฐ•์ œ ์„ค๊ณ„โ€

์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ํ‹€์ด๋‹ค.

์ฆ‰, ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์„ค๊ณ„๋„ ์—ญํ• ์„ ํ•˜๋ฉฐ, ๋‹ค์ค‘ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.


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

โœ” interface ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์„ ์–ธ

โœ” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ public abstract (๊ตฌํ˜„ X, ์„ ์–ธ๋งŒ ๊ฐ€๋Šฅ)

โœ” ํ•„๋“œ(๋ณ€์ˆ˜)๋Š” public static final (์ƒ์ˆ˜๋กœ๋งŒ ์„ ์–ธ ๊ฐ€๋Šฅ)

โœ” ๋‹ค์ค‘ ๊ตฌํ˜„(๋‹ค์ค‘ ์ƒ์†)์ด ๊ฐ€๋Šฅ


๐Ÿ”น ์˜ˆ์ œ: ๋™๋ฌผ(Animal) ์ธํ„ฐํŽ˜์ด์Šค

// ๐Ÿพ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜
interface Animal {
    void makeSound();  // ์ถ”์ƒ ๋ฉ”์„œ๋“œ (๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ ํ•„์š”)
}

// ๐Ÿถ ๊ฐ•์•„์ง€ ํด๋ž˜์Šค (Animal ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„)
class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("๋ฉ๋ฉ!");
    }
}

// ๐Ÿฑ ๊ณ ์–‘์ด ํด๋ž˜์Šค (Animal ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„)
class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("์•ผ์˜น!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myDog.makeSound();  // "๋ฉ๋ฉ!"
        myCat.makeSound();  // "์•ผ์˜น!"
    }
}

โœ” ์ธํ„ฐํŽ˜์ด์Šค Animal์„ Dog์™€ Cat์ด ๊ตฌํ˜„ (implements ์‚ฌ์šฉ)

โœ” ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ (makeSound())

โœ” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹คํ˜•์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Œ


3๏ธโƒฃ ์ถ”์ƒ ํด๋ž˜์Šค vs ์ธํ„ฐํŽ˜์ด์Šค - ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?

ํŠน์ง• ์ถ”์ƒ ํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค
์ƒ์† ๋ฐฉ์‹ ๋‹จ์ผ ์ƒ์† (extends) ๋‹ค์ค‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅ (implements)
๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ๊ตฌํ˜„๋œ ๋ฉ”์„œ๋“œ ํฌํ•จ ๊ฐ€๋Šฅ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ๊ตฌํ˜„ ๋ถˆ๊ฐ€ (๊ธฐ๋ณธ์ ์œผ๋กœ abstract)
๋ณ€์ˆ˜ ์„ ์–ธ ์ผ๋ฐ˜ ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ public static final (์ƒ์ˆ˜)๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
๊ฐ์ฒด ์ƒ์„ฑ ์ง์ ‘ ์ƒ์„ฑ ๋ถˆ๊ฐ€ ์ง์ ‘ ์ƒ์„ฑ ๋ถˆ๊ฐ€
์‚ฌ์šฉ ๋ชฉ์  ๊ณตํ†ต ๊ธฐ๋Šฅ ์ œ๊ณต + ์ผ๋ถ€ ๊ฐ•์ œ ์„ค๊ณ„๋งŒ ์ œ๊ณต, ๋ชจ๋“  ๊ตฌํ˜„ ๊ฐ•์ œ

โœ” ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ(์ผ๋ถ€ ๊ตฌํ˜„๋œ ๋ฉ”์„œ๋“œ ํฌํ•จ)๋„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๋ฉด? โ†’ ์ถ”์ƒ ํด๋ž˜์Šค ์‚ฌ์šฉ

โœ” ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ์„ค๊ณ„๋ฅผ ๊ฐ•์ œํ•˜๊ณ , ๋‹ค์ค‘ ๊ตฌํ˜„์ด ํ•„์š”ํ•˜๋‹ค๋ฉด? โ†’ ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ


4๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹ค์ค‘ ๊ตฌํ˜„ - Java์˜ ๋‹ค์ค‘ ์ƒ์† ๋Œ€์ฒด

์ž๋ฐ”๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋‹ค์ค‘ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


๐Ÿ”น ์˜ˆ์ œ: ๋‹ค์ค‘ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•˜๊ธฐ

// ๐Ÿ› ๏ธ ์ฒซ ๋ฒˆ์งธ ์ธํ„ฐํŽ˜์ด์Šค (์šด์ „ ๊ฐ€๋Šฅ)
interface Drivable {
    void drive();
}

// ๐ŸŽถ ๋‘ ๋ฒˆ์งธ ์ธํ„ฐํŽ˜์ด์Šค (์Œ์•… ์žฌ์ƒ ๊ฐ€๋Šฅ)
interface MusicPlayable {
    void playMusic();
}

// ๐Ÿš— ์ž๋™์ฐจ ํด๋ž˜์Šค (๋‘ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„)
class SmartCar implements Drivable, MusicPlayable {
    @Override
    public void drive() {
        System.out.println("์Šค๋งˆํŠธ์นด๊ฐ€ ์ž์œจ ์ฃผํ–‰ํ•ฉ๋‹ˆ๋‹ค.");
    }

    @Override
    public void playMusic() {
        System.out.println("์Œ์•…์„ ์žฌ์ƒํ•ฉ๋‹ˆ๋‹ค.");
    }
}

public class Main {
    public static void main(String[] args) {
        SmartCar myCar = new SmartCar();
        myCar.drive();     // "์Šค๋งˆํŠธ์นด๊ฐ€ ์ž์œจ ์ฃผํ–‰ํ•ฉ๋‹ˆ๋‹ค."
        myCar.playMusic(); // "์Œ์•…์„ ์žฌ์ƒํ•ฉ๋‹ˆ๋‹ค."
    }
}

โœ” SmartCar ํด๋ž˜์Šค๋Š” Drivable๊ณผ MusicPlayable์„ ๋™์‹œ์— ๊ตฌํ˜„

โœ” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์ค‘ ์ƒ์†๊ณผ ์œ ์‚ฌํ•œ ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์Œ


๐ŸŽฏ 6๋‹จ๊ณ„ ์š”์•ฝ

๊ฐœ๋… ์„ค๋ช… ์˜ˆ์ œ
์ถ”์ƒ ํด๋ž˜์Šค ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ์ผ๋ถ€๋Š” ๊ฐ•์ œ abstract class Car { abstract void drive(); }
์ธํ„ฐํŽ˜์ด์Šค ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ•์ œํ•˜๋ฉฐ, ๋‹ค์ค‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅ interface Animal { void makeSound(); }
์ถ”์ƒ ํด๋ž˜์Šค ์‚ฌ์šฉ ์‹œ๊ธฐ ๊ณตํ†ต ๊ธฐ๋Šฅ ์ œ๊ณต + ์ผ๋ถ€ ๊ฐ•์ œ abstract class Car { void stop() {} }
์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ ์‹œ๊ธฐ ๋‹ค์ค‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅ + ๊ฐ•์ œ์„ฑ ํ•„์š” class Dog implements Animal {}
๋‹ค์ค‘ ๊ตฌํ˜„ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋™์‹œ์— ๊ตฌํ˜„ ๊ฐ€๋Šฅ class SmartCar implements Drivable, MusicPlayable {}

โžก๏ธ ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉด์„œ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ•์ œํ•ด์•ผ ํ•  ๋•Œ, ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์ค‘ ๊ตฌํ˜„์ด ํ•„์š”ํ•˜๊ณ  ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ•์ œํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค! ๐Ÿš€


๐Ÿ“Œ 7๋‹จ๊ณ„: ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™(SOLID)์™€ ์‘์šฉ

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)์„ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋ ค๋ฉด ์ข‹์€ ์„ค๊ณ„ ์›์น™์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™์ด ๋ฐ”๋กœ SOLID ์›์น™์ด๋‹ค.

SOLID ์›์น™์„ ๋”ฐ๋ฅด๋ฉด ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ๊ฐ€๋…์„ฑ์ด ๋›ฐ์–ด๋‚œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๐Ÿš€


1๏ธโƒฃ SOLID ์›์น™์ด๋ž€?

SOLID๋Š” ๋‹ค์„ฏ ๊ฐ€์ง€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™์˜ ์•ž ๊ธ€์ž๋ฅผ ๋”ด ๊ฒƒ์ด๋‹ค.

์ด ์›์น™๋“ค์€ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๊ณ , ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค.

์›์น™ ์„ค๋ช…
S - ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (Single Responsibility Principle) ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
O - ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (Open-Closed Principle) ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
L - ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (Liskov Substitution Principle) ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
I - ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (Interface Segregation Principle) ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
D - ์˜์กด ์—ญ์ „ ์›์น™ (Dependency Inversion Principle) ์ƒ์œ„(์ถ”์ƒ) ๋ชจ๋“ˆ์ด ํ•˜์œ„(๊ตฌ์ฒด) ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

2๏ธโƒฃ SOLID ์›์น™์„ ์ฝ”๋“œ๋กœ ์ดํ•ดํ•˜๊ธฐ

๐Ÿ”น (S) ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (Single Responsibility Principle, SRP)

โœ” ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

โœ” ํ•˜๋‚˜์˜ ์ด์œ ๋กœ๋งŒ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค.

โŒ ์œ„๋ฐ˜ ์˜ˆ์ œ (ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ ํ•จ)

class OrderManager {
    void processOrder() {
        System.out.println("์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.");
    }

    void printInvoice() {
        System.out.println("์˜์ˆ˜์ฆ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.");
    }

    void sendEmailNotification() {
        System.out.println("์ด๋ฉ”์ผ์„ ๋ฐœ์†กํ•ฉ๋‹ˆ๋‹ค.");
    }
}

โœ” OrderManager ํด๋ž˜์Šค๊ฐ€ ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ, ์˜์ˆ˜์ฆ ์ถœ๋ ฅ, ์ด๋ฉ”์ผ ์ „์†ก๊นŒ์ง€ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋‹ด๋‹น

โœ” ์ฑ…์ž„์ด ๋งŽ์•„์ง€๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง


โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์ œ (์ฑ…์ž„์„ ๋ถ„๋ฆฌ)

class OrderProcessor {
    void processOrder() {
        System.out.println("์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.");
    }
}

class InvoicePrinter {
    void printInvoice() {
        System.out.println("์˜์ˆ˜์ฆ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.");
    }
}

class EmailNotifier {
    void sendEmailNotification() {
        System.out.println("์ด๋ฉ”์ผ์„ ๋ฐœ์†กํ•ฉ๋‹ˆ๋‹ค.");
    }
}

โœ” OrderProcessor, InvoicePrinter, EmailNotifier ํด๋ž˜์Šค๋ฅผ ๊ฐ๊ฐ ๋งŒ๋“ค์–ด ์ฑ…์ž„์„ ๋ถ„๋ฆฌ

โœ” ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ฑ์ด ํ–ฅ์ƒ๋จ


๐Ÿ”น (O) ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (Open-Closed Principle, OCP)

โœ” ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

โœ” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.

โŒ ์œ„๋ฐ˜ ์˜ˆ์ œ (๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ)

class PaymentProcessor {
    void processPayment(String paymentType) {
        if (paymentType.equals("CreditCard")) {
            System.out.println("์‹ ์šฉ์นด๋“œ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ");
        } else if (paymentType.equals("PayPal")) {
            System.out.println("PayPal ๊ฒฐ์ œ ์ฒ˜๋ฆฌ");
        }
    }
}

โœ” processPayment()์— ์ƒˆ๋กœ์šด ๊ฒฐ์ œ ์ˆ˜๋‹จ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•จ


โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์ œ (์ƒˆ๋กœ์šด ๊ฒฐ์ œ ๋ฐฉ์‹ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ)

interface PaymentMethod {
    void processPayment();
}

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

class PayPalPayment implements PaymentMethod {
    public void processPayment() {
        System.out.println("PayPal ๊ฒฐ์ œ ์ฒ˜๋ฆฌ");
    }
}

class PaymentProcessor {
    void processPayment(PaymentMethod paymentMethod) {
        paymentMethod.processPayment();
    }
}

โœ” ์ƒˆ๋กœ์šด ๊ฒฐ์ œ ๋ฐฉ์‹์„ ์ถ”๊ฐ€ํ•  ๋•Œ PaymentProcessor ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์Œ

โœ” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ๊ณ (Open), ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€ ์žˆ์Œ(Closed)


๐Ÿ”น (L) ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (Liskov Substitution Principle, LSP)

โœ” ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

โœ” ์ƒ์†์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ์›์น™์ด๋‹ค.

โŒ ์œ„๋ฐ˜ ์˜ˆ์ œ (๋ถ€๋ชจ ํด๋ž˜์Šค ๊ธฐ๋Šฅ์„ ์ œํ•œํ•˜๋Š” ์ž์‹ ํด๋ž˜์Šค)

class Bird {
    void fly() {
        System.out.println("์ƒˆ๊ฐ€ ๋‚ ์•„๊ฐ‘๋‹ˆ๋‹ค.");
    }
}

class Penguin extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException("ํŽญ๊ท„์€ ๋‚  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
    }
}

โœ” Penguin ํด๋ž˜์Šค๊ฐ€ Bird ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ–ˆ์ง€๋งŒ, fly()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ โ†’ ์ž˜๋ชป๋œ ์„ค๊ณ„


โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์ œ (๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •)

abstract class Bird {
    abstract void move();
}

class Sparrow extends Bird {
    @Override
    void move() {
        System.out.println("์ฐธ์ƒˆ๊ฐ€ ๋‚ ์•„๊ฐ‘๋‹ˆ๋‹ค.");
    }
}

class Penguin extends Bird {
    @Override
    void move() {
        System.out.println("ํŽญ๊ท„์ด ํ—ค์—„์นฉ๋‹ˆ๋‹ค.");
    }
}

โœ” move()๋ผ๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Penguin๊ณผ Sparrow๋ฅผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ


๐Ÿ”น (I) ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (Interface Segregation Principle, ISP)

โœ” ํ•˜๋‚˜์˜ ํฐ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

โŒ ์œ„๋ฐ˜ ์˜ˆ์ œ (๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ๊ฐ•์š”)

interface Worker {
    void work();
    void eat();
}

class Robot implements Worker {
    @Override
    public void work() {
        System.out.println("๋กœ๋ด‡์ด ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค.");
    }

    @Override
    public void eat() {
        throw new UnsupportedOperationException("๋กœ๋ด‡์€ ๋ฐฅ์„ ๋จน์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
    }
}

โœ” Robot ํด๋ž˜์Šค๋Š” eat()์„ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์Œ


โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์ œ (์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์ ์šฉ)

interface Workable {
    void work();
}

interface Eatable {
    void eat();
}

class Human implements Workable, Eatable {
    public void work() {
        System.out.println("์‚ฌ๋žŒ์ด ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค.");
    }

    public void eat() {
        System.out.println("์‚ฌ๋žŒ์ด ๋ฐฅ์„ ๋จน์Šต๋‹ˆ๋‹ค.");
    }
}

class Robot implements Workable {
    public void work() {
        System.out.println("๋กœ๋ด‡์ด ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค.");
    }
}

โœ” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ, ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•จ


๐Ÿ”น (D) ์˜์กด ์—ญ์ „ ์›์น™ (Dependency Inversion Principle, DIP)

โœ” ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ, ์ถ”์ƒ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.

โœ” โ€œ์ƒ์œ„(์ถ”์ƒ) ๋ชจ๋“ˆ์ด ํ•˜์œ„(๊ตฌ์ฒด) ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.โ€

interface MessageSender {
    void sendMessage(String message);
}

class EmailSender implements MessageSender {
    public void sendMessage(String message) {
        System.out.println("์ด๋ฉ”์ผ ์ „์†ก: " + message);
    }
}

class NotificationService {
    private MessageSender sender;

    NotificationService(MessageSender sender) {
        this.sender = sender;
    }

    void notifyUser(String message) {
        sender.sendMessage(message);
    }
}

โœ” NotificationService๋Š” EmailSender๊ฐ€ ์•„๋‹ˆ๋ผ MessageSender ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กด

โœ” ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€ ์ „์†ก ๋ฐฉ์‹(SMS, ์นด์นด์˜คํ†ก ๋“ฑ) ์ถ”๊ฐ€ ๊ฐ€๋Šฅ


๐ŸŽฏ 7๋‹จ๊ณ„ ์š”์•ฝ: SOLID ์›์น™ ์ ์šฉํ•˜๋ฉด ์ข‹์€ ์ 

โœ… ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋›ฐ์–ด๋‚œ ์ฝ”๋“œ

โœ… ํ™•์žฅํ•˜๊ธฐ ์‰ฌ์šด ๊ตฌ์กฐ

โœ… ๋ฒ„๊ทธ ๋ฐœ์ƒ ํ™•๋ฅ  ๊ฐ์†Œ

โžก๏ธ SOLID ์›์น™์„ ๋”ฐ๋ฅด๋ฉด ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋”์šฑ ๊ฐ•๋ ฅํ•ด์ง„๋‹ค! ๐Ÿš€