Home > CS > 2024 > ๐Ÿ’พ [CS] ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming, OOP)๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

๐Ÿ’พ [CS] ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming, OOP)๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?
CS

๐Ÿ’พ [CS] ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming, OOP)๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming, OOP)์€ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ์ฒด(Object)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด(Object)๋Š” ๋ฐ์ดํ„ฐ์™€ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฌถ์€ ๊ฐœ๋…์œผ๋กœ, ํ˜„์‹ค ์„ธ๊ณ„์˜ ์‚ฌ๋ฌผ์„ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ๋ชจ๋ฐฉํ•˜์—ฌ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming, OOP)์˜ ํ•ต์‹ฌ ๊ฐœ๋…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๐Ÿ™‹โ€โ™‚๏ธ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ๊ฐ์ฒด(Object)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

1๏ธโƒฃ ํด๋ž˜์Šค์™€ ๊ฐ์ฒด.

๐Ÿ‘‰ ํด๋ž˜์Šค(Class).

  • ๊ฐ์ฒด(Object)๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ฒญ์‚ฌ์ง„์ด๋‚˜ ํ‹€์ž…๋‹ˆ๋‹ค.
    • ํด๋ž˜์Šค๋Š” ์†์„ฑ(๋ฐ์ดํ„ฐ)๊ณผ ๋ฉ”์„œ๋“œ(ํ•จ์ˆ˜)๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ ๊ฐ์ฒด(Object).

  • ํด๋ž˜์Šค(Class)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์‹ค์ฒด๋กœ, ํด๋ž˜์Šค์— ์ •์˜๋œ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ผ๊ณ ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿ‘‰ ์˜ˆ์‹œ.

// ํด๋ž˜์Šค ์ •์˜
class Car {
    // ์†์„ฑ (ํ•„๋“œ)
    String model;
    String color;
    
    // ์ƒ์„ฑ์ž
    public Car(String model, String color) {
        this.model = model;
        this.color = color;
    }
    
    // ๋ฉ”์„œ๋“œ
    public void drive() {
        System.out.println(model + "์ด(๊ฐ€) ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.");
    }
}

// ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ
public class Main {
    public static void main(String[] args) {
        // Car ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค(๊ฐ์ฒด) ์ƒ์„ฑ.
        Car car1 = new Car("Volvo xc60", "Black");
        car1.drive(); // ์ถœ๋ ฅ: Volvo xc60์ด(๊ฐ€) ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.
    }
}
  • ์œ„ ์˜ˆ์‹œ๋Š” Car๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ทธ ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Volvo xc60์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„ drive() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

2๏ธโƒฃ ์บก์Аํ™”(Encapsulation)

  • ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ(์†์„ฑ)์™€ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
    • ์บก์Аํ™”(Encapsulation)๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด(Object) ์™ธ๋ถ€์—์„œ๋Š” ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์•Œ์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๊ณ , ์ œ๊ณต๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ์™€ ์ฝ”๋“œ์˜ ์‘์ง‘์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰ ์˜ˆ์‹œ

class Person {
    // private ์†์„ฑ (์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ)
    private String name;
    private int age;
    
    // ์ƒ์„ฑ์ž
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // public ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผ
    public String getName() {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        if(age > 0) { // ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
            this.age = age;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Person p = new Person("Kobe", 25);
        System.out.println(p.getName()); // ์ถœ๋ ฅ: Kobe
        p.setAge(30);
        System.out.println(p.getAge()); // ์ถœ๋ ฅ: 30
    }
}
  • ์ด ์˜ˆ์‹œ์—์„œ๋Š” Person ํด๋ž˜์Šค์—์„œ ์บก์Аํ™”(Encapsulation)๊ฐ€ ์ ์šฉ๋˜์–ด, name๊ณผ age ๊ฐ™์€ ์†์„ฑ์€ private์œผ๋กœ ์„ ์–ธ๋˜์–ด ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์ด๋ฅผ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ œ๊ณต๋œ ๋ฉ”์„œ๋“œ(getName(), setAge())๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์ƒ์†(Inheritance)

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

๐Ÿ‘‰ ์˜ˆ์‹œ

// ๋ถ€๋ชจ ํด๋ž˜์Šค.
class Animal {
    String name;
    
    public Animal(String name) {
        this.name = name;
    }
    
    public void makeSound() {
        System.out.println("๋™๋ฌผ์ด ์†Œ๋ฆฌ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค.")
    }
}

// ์ž์‹ ํด๋ž˜์Šค (์ƒ์†)
class Dog extends Animal {
    public Dog(String name) {
        super(name); // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
    }
    
    // ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    @Override
    public void makeSound() {
        System.out.println(name + "์ด(๊ฐ€) ๋ฉ๋ฉ ์ง–์Šต๋‹ˆ๋‹ค.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("๋‚˜๋ฅด");
        dog.makeSound(); // ์ถœ๋ ฅ: ๋‚˜๋ฅด์ด(๊ฐ€) ๋ฉ๋ฉ ์ง–์Šต๋‹ˆ๋‹ค.
    }
}
  • ์œ„ ์˜ˆ์‹œ์—์„œ, Dog ํด๋ž˜์Šค(Class)๋Š” Animal ํด๋ž˜์Šค(Class)๋ฅผ ์ƒ์†๋ฐ›์•„ makeSound() ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜(Overriding, ์˜ค๋ฒ„๋ผ์ด๋”ฉ)ํ•˜๊ณ , ์ด๋ฆ„์„ ์ถœ๋ ฅํ•˜๋„๋ก ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒ์†(Inheritance)์„ ํ†ตํ•ด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์žฌ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃ ๋‹คํ˜•์„ฑ(Polymorphism)

  • ๋‹คํ˜•์„ฑ(Polymorphism)์€ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
    • ์ƒ์†(Inheritance) ๊ด€๊ณ„์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค(Parents class, Super class)์˜ ๋ฉ”์„œ๋“œ(Methods)๋ฅผ ์ž์‹ ํด๋ž˜์Šค(Child class, Sub class)์—์„œ ์žฌ์ •์˜(์˜ค๋ฒ„๋ผ์ด๋”ฉ, Overriding)ํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๊ฑฐ๋‚˜, ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜(Paremeter)์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘(์˜ค๋ฒ„๋กœ๋”ฉ, Overloading)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹คํ˜•์„ฑ(Polymorphism)์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰ ์˜ˆ์‹œ.

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

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

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

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();
        
        animal1.makeSound(); // ์ถœ๋ ฅ: ๋ฉ๋ฉ
        animal2.makeSount(); // ์ถœ๋ ฅ: ์•ผ์˜น
    }
}
  • ์ด ์˜ˆ์‹œ๋Š” ๋‹คํ˜•์„ฑ(Polymorphism)์„ ๋ณด์—ฌ์ฃผ๋Š” ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.
    • Animal ํƒ€์ž…์˜ ๋ณ€์ˆ˜์— Dog์™€ Cat ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, makeSound() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ์ฒด์˜ ํƒ€์ž…์— ๋งž๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
      • ์ด์ฒ˜๋Ÿผ ๋ถ€๋ชจ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ๋‹ค์–‘ํ•œ ์ž์‹ ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5๏ธโƒฃ ์ถ”์ƒํ™”(Abstraction)

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

๐Ÿ‘‰ ์˜ˆ์‹œ.

// ์ถ”์ƒ ํด๋ž˜์Šค
abstract class Vehicle {
    String model;
    
    public Vehicle(String model) {
        this.model = model;
    }
    
    // ์ถ”์ƒ ๋ฉ”์„œ๋“œ (๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์€ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ)
    public abstract void move();
}

// ์ž์‹ ํด๋ž˜์Šค (๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ์ œ๊ณต)
class Car extends Vehicle {
    public Car(String model) {
        super(model);
    }
    
    @Override
    public void move() {
        System.out.println(model + "์ด(๊ฐ€) ๋„๋กœ์—์„œ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.");
    }
}

class Airplane extends Vehicle {
    public Airplane(String model) {
        super(model);
    }
    
    @Override
    public void move() {
        System.out.println(model + "์ด(๊ฐ€) ํ•˜๋Š˜์„ ๋‚ฉ๋‹ˆ๋‹ค.");
    }
}

public class Main {
    public static void main(String[] args) {
        Vehicle car = new Car("Volvo xc60");
        Vehicle airplane = new Airplane("Boeing 747");
        
        car.move(); // ์ถœ๋ ฅ: Volvo xc60์ด(๊ฐ€) ๋„๋กœ์—์„œ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.
        airplane.move(); // ์ถœ๋ ฅ: Boeing 747์ด(๊ฐ€) ํ•˜๋Š˜์„ ๋‚ฉ๋‹ˆ๋‹ค.
    }
}
  • ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค(Abstract class)๋ฅผ ํ†ตํ•ด์„œ ์ถ”์ƒํ™”(Abstraction)๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
    • Vehicle ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ํด๋ž˜์Šค(Abstract class)์ด๋ฉฐ, ์ž์‹ ํด๋ž˜์Šค์ธ Car ์™€ Airplane์ด ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
      • ์ถ”์ƒํ™”(Abstraction)๋ฅผ ํ†ตํ•ด ๊ณตํ†ต์ ์ธ ๋™์ž‘์„ ์ •์˜ํ•˜๋ฉด์„œ๋„ ๊ฐ ๊ฐ์ฒด๊ฐ€ ๊ฐœ๋ณ„์ ์ธ ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6๏ธโƒฃ ๊ฐˆ๋ฌด๋ฆฌ.

  • ์ด๋Ÿฌํ•œ ๊ฐœ๋…์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming, OOP)์€ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ , ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ฑ์„ ๊ฐœ์„ ํ•˜๋ฉฐ, ํ˜„์‹ค ์„ธ๊ณ„์˜ ๋ฌธ์ œ๋ฅผ ๋” ์ง๊ด€์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.