Language/JAVA

[JAVA] ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ 4๊ฐ€์ง€ ํŠน์ง• - ์บก์Šํ™”, ์ƒ์†์„ฑ, ๋‹คํ˜•์„ฑ, ์ถ”์ƒํ™”

๊ต ๋ฏผ 2024. 8. 16. 14:06
๐Ÿ“Œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object Oriented Programming, OOP)์€ ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ์ฒดํ™”(ํด๋ž˜์Šคํ™”)์‹œ์ผœ ๋ฉ”์ธํ•จ์ˆ˜์—์„œ๋Š” ๊ฐ์ฒดํ™”์‹œํ‚จ ๊ธฐ๋Šฅ๋“ค์„ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ–ฅ์‹ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค.

 

๋“ฑ์žฅ ๋ฐฐ๊ฒฝ - ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ "์ฝ”๋“œ ์žฌ์‚ฌ์šฉ๊ณผ ํ™•์žฅ์„ฑ์˜ ํ•œ๊ณ„, ๊ด€๋ฆฌ์™€ ์œ ์ง€๋ณด์ˆ˜"์˜ ํ•œ๊ณ„

: ๊ธฐ์กด ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฒฝ์šฐ ํ”„๋กœ์‹œ์ €(ํ•จ์ˆ˜) → ๊ตฌ์กฐํ™”๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์„ ๋ฟ, ๊ฒฐ๊ตญ ์ˆœ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์ด๋‹ค.

 

 

โœจ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ 4๊ฐ€์ง€ ํŠน์ง• : ์บก์Šํ™”, ์ƒ์†์„ฑ, ๋‹คํ˜•์„ฑ, ์ถ”์ƒํ™” โœจ

 

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ OOP์˜ ๋„ค ๊ฐ€์ง€ ์ฃผ์š” ํŠน์ง•์€ ์บก์Šํ™”, ์ƒ์†, ๋‹คํ˜•์„ฑ, ์ถ”์ƒํ™”์ด๋‹ค.

์ด ๋„ค ๊ฐ€์ง€ ํŠน์ง•์œผ๋กœ ์ธํ•ด ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’๋‹ค.

 

 

1. ์บก์Šํ™”(Encpsulation)

: ๋ฐ์ดํ„ฐ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋Š” ํ•จ์ˆ˜(๋ฉ”์„œ๋“œ)๋ฅผ ์บก์Š(Class)/์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ๋‘๋Š” ๊ฒƒ

  • ์€๋‹‰์„ฑ : ์ •๋ณด๋ฅผ ์ œ์–ดํ•จ์œผ๋กœ์จ ์™ธ๋ถ€์˜ ์ž˜๋ชป๋œ ์ ‘๊ทผ์œผ๋กœ ๊ฐ’์ด ๋ณ€ํ•˜๋Š” ๊ฒƒ ๋ง‰์•„์ค€๋‹ค.
    • ์ ‘๊ทผ์ œ์–ด์ž(private, protected, public)๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘œ์‹œํ•  ์†์„ฑ๊ณผ ์ˆจ๊ธธ ์†์„ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ, ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
class Person {
    private String name; // private ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ
    
    // ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋งŒ name ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
}

 

 

2. ์ƒ์†์„ฑ(Inheritance)

: ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ๋ถ€๋ชจ์˜ ๋ชจ๋“  ์ž์›์„ ๋ฌผ๋ ค๋ฐ›๋Š” ๊ฒƒ

  • ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ์˜ ๊ฐ์†Œ
    • ํ•˜์œ„ ํด๋ž˜์Šค(์ž์‹)์€ ๊ธฐ์กด ํด๋ž˜์Šค(๋ถ€๋ชจ)์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์œ ์ง€ ๋ณด์ˆ˜์˜ ํŽธ๋ฆฌ์„ฑ
    • ํด๋ž˜์Šค๋“ค์„ ์ž‘๊ฒŒ ์ชผ๊ฐœ๊ณ  ๋ถ„ํ• ํ•œ ํ›„์— ๋ ˆ๊ณ ์ฒ˜๋Ÿผ ํด๋ž˜์Šค๋ฅผ ๊ตฌ์„ฑํ•จ์œผ๋กœ์จ ๋ถ„ํ•  ๋ฐ ์ •๋ณต์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.
class Animal {
    void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal { // extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์† ๊ด€๊ณ„ ํ˜•์„ฑ
    @Override // ์ž์‹ ํด๋ž˜์Šค dog์—์„œ ํ™œ์šฉํ•  ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ์˜ sound ์žฌ์ •์˜ ํ‘œ์‹œ
    void sound() {
        System.out.println("Dog barks");
    }
}

 

 

3. ๋‹คํ˜•์„ฑ(Polymorphism)

: ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ

  • ์œ ์—ฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ, ์œ ์ง€ ๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
    • ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)
    • ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading)
// ์˜ค๋ฒ„๋ผ์ด๋”ฉ : ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜
class Bird {
    void fly() {
        System.out.println("Bird is flying");
    }
}

class Sparrow extends Bird {
    @Override //
    void fly() {
        System.out.println("Sparrow is flying fast");
    }
}

// ์˜ค๋ฒ„๋กœ๋”ฉ : ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘
class MathOperation {
    int add(int a, int b) {
        return a + b;
    }
    int add(int a, int b, int c) {
        return a + b + c;
    }
}

 

 

4. ์ถ”์ƒํ™”(Abstraction)

: ๊ฐ์ฒด์˜ ๋ณต์žกํ•œ ๊ตฌํ˜„ ์„ธ๋ณด ์ •๋ณด๋Š” ์ˆจ๊ธฐ๊ณ  ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ์™ธ๋ถ€์— ์ œ๊ณตํ•˜๋Š” ๊ฒƒ

  • ๋ณต์žก์„ฑ ๊ฐ์†Œ
    • ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ˆจ๊น€์œผ๋กœ์จ ๋‹จ์ˆœํ™” ์ง€ํ–ฅ
  • ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
    • ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๊ธฐ์— ์ถ”๊ฐ€ ์ˆ˜์ •์ด ํ•„์š” ์—†๋‹ค.
// ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ ์ •์˜ (์ถ”์ƒํด๋ž˜์Šค)
abstract class Animal {
    abstract void sound();
}

//์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค๋“ค์˜ ๊ตฌ์ฒด์  ๋™์ž‘ ๊ตฌํ˜„
class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("Meow");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Bark");
    }
}

โœ๏ธ