Responsive Advertisement

Java - What is OOP? ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

Java๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming, OOP) ์–ธ์–ด์ž…๋‹ˆ๋‹ค. OOP๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ์ฒด(object)๋กœ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ํ˜„์‹ค ์„ธ๊ณ„์˜ ๋ฌธ์ œ๋ฅผ ๋” ์ง๊ด€์ ์ด๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” OOP์˜ ๊ธฐ๋ณธ ๊ฐœ๋…, Java์—์„œ์˜ ๊ตฌํ˜„, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ƒํ™œ์˜ ํ™œ์šฉ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)๋ž€?

OOP๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋ผ๋Š” ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๊ณ , ์ด ๊ฐ์ฒด๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด๋Š” ์†์„ฑ(Attributes)๊ณผ ๋™์ž‘(Methods)์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OOP์˜ ์ฃผ์š” ํŠน์ง•

  • ์บก์Аํ™”(Encapsulation): ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๋ฌถ๊ณ , ์™ธ๋ถ€์—์„œ์˜ ์ง์ ‘ ์ ‘๊ทผ์„ ์ œํ•œํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ์†(Inheritance): ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๊ฐ€ ๋ฌผ๋ ค๋ฐ›์•„ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • ๋‹คํ˜•์„ฑ(Polymorphism): ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๋„๋ก ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ถ”์ƒํ™”(Abstraction): ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ๋‹จ์ˆœํ™”ํ•˜์—ฌ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

2. Java์—์„œ์˜ OOP ๊ตฌํ˜„

2.1 ํด๋ž˜์Šค์™€ ๊ฐ์ฒด

ํด๋ž˜์Šค(Class)๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ฒญ์‚ฌ์ง„์ด๋ฉฐ, ๊ฐ์ฒด(Object)๋Š” ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ: ํด๋ž˜์Šค์™€ ๊ฐ์ฒด

public class Car {
    // ์†์„ฑ(Attributes)
    String brand;
    int speed;

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

public class Main {
    public static void main(String[] args) {
        // ๊ฐ์ฒด ์ƒ์„ฑ
        Car myCar = new Car();
        myCar.brand = "BMW";
        myCar.speed = 120;
        myCar.drive();
    }
}

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

BMW๊ฐ€ 120km/h๋กœ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.

3. OOP์˜ ์ฃผ์š” ๊ฐœ๋…๊ณผ ์˜ˆ์ œ

3.1 ์บก์Аํ™”(Encapsulation)

์บก์Аํ™”๋Š” ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ์ œํ•œํ•˜์—ฌ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. private ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†์„ฑ์„ ์€๋‹‰ํ•˜๊ณ , getter์™€ setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

public class Person {
    private String name; // ์€๋‹‰๋œ ์†์„ฑ

    // Getter
    public String getName() {
        return name;
    }

    // Setter
    public void setName(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("ํ™๊ธธ๋™");
        System.out.println("์ด๋ฆ„: " + person.getName());
    }
}

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

์ด๋ฆ„: ํ™๊ธธ๋™

3.2 ์ƒ์†(Inheritance)

์ƒ์†์€ ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๊ฐ€ ๋ฌผ๋ ค๋ฐ›๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

class Animal {
    public void eat() {
        System.out.println("๋™๋ฌผ์ด ๋จน์Šต๋‹ˆ๋‹ค.");
    }
}

class Dog extends Animal {
    public void bark() {
        System.out.println("๊ฐœ๊ฐ€ ์ง–์Šต๋‹ˆ๋‹ค.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.eat(); // ์ƒ์†๋œ ๋ฉ”์„œ๋“œ
        myDog.bark(); // Dog ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ
    }
}

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

๋™๋ฌผ์ด ๋จน์Šต๋‹ˆ๋‹ค.  
๊ฐœ๊ฐ€ ์ง–์Šต๋‹ˆ๋‹ค.  

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

๋‹คํ˜•์„ฑ์€ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์—์„œ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Animal {
    public void sound() {
        System.out.println("๋™๋ฌผ์ด ์†Œ๋ฆฌ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค.");
    }
}

class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("๊ณ ์–‘์ด๊ฐ€ ์•ผ์˜น ํ•ฉ๋‹ˆ๋‹ค.");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("๊ฐœ๊ฐ€ ๋ฉ๋ฉ ํ•ฉ๋‹ˆ๋‹ค.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myCat = new Cat();
        Animal myDog = new Dog();
        myCat.sound(); // Cat์˜ sound() ํ˜ธ์ถœ
        myDog.sound(); // Dog์˜ sound() ํ˜ธ์ถœ
    }
}

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

๊ณ ์–‘์ด๊ฐ€ ์•ผ์˜น ํ•ฉ๋‹ˆ๋‹ค.  
๊ฐœ๊ฐ€ ๋ฉ๋ฉ ํ•ฉ๋‹ˆ๋‹ค.  

3.4 ์ถ”์ƒํ™”(Abstraction)

์ถ”์ƒํ™”๋Š” ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€๋งŒ ๋…ธ์ถœํ•˜์—ฌ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด abstract ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

abstract class Shape {
    abstract void draw(); // ์ถ”์ƒ ๋ฉ”์„œ๋“œ
}

class Circle extends Shape {
    @Override
    void draw() {
        System.out.println("์›์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.");
    }
}

class Rectangle extends Shape {
    @Override
    void draw() {
        System.out.println("์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.");
    }
}

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle();
        Shape rectangle = new Rectangle();
        circle.draw();
        rectangle.draw();
    }
}

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

์›์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.  
์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.  

4. OOP์˜ ์žฅ์ 

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

๊ฒฐ๋ก 

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

๋Œ“๊ธ€ ์“ฐ๊ธฐ