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)은 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높이고, μœ μ§€λ³΄μˆ˜μ™€ ν™•μž₯성을 κ°œμ„ ν•˜λ©°, ν˜„μ‹€ μ„Έκ³„μ˜ 문제λ₯Ό 더 μ§κ΄€μ μœΌλ‘œ ν•΄κ²°ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.