cs정리/java

OOPλž€?(Object-Oriented Programming)

hayoon2 2025. 3. 17. 21:40
λ°˜μ‘ν˜•
SMALL
πŸ’‘OOPλž€ μžλ°”μ˜ μ£Όμš” νŠΉμ§• 쀑 ν•˜λ‚˜λ‘œ ν”„λ‘œκ·Έλž¨μ„ κ°μ²΄λΌλŠ” λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄ κ°œλ°œν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° 방식이닀.
μ—¬κΈ°μ„œ κ°μ²΄λž€ 데이터(속성)κ³Ό κ·Έ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜(λ™μž‘)을 ν•˜λ‚˜λ‘œ λ¬Άμ–΄ λ†“λŠ” 것을 λ§ν•œλ‹€. 예λ₯Ό λ“€μ–΄ μžλ™μ°¨λ₯Ό 객체둜 두면 λ°μ΄ν„°λŠ” μžλ™μ°¨μ˜ 색상, λΈŒλžœλ“œ, 속도 등이며 ν•¨μˆ˜λŠ” μΆœλ°œν•˜λ‹€(), λ©ˆμΆ”λ‹€() 같은 λ™μž‘λ“€μ΄ μžˆλ‹€.

 

oop의 4λŒ€ 핡심 νŠΉμ§•

1. μΊ‘μŠν™”(Encapsulation): 데이터와 ν•¨μˆ˜λ₯Ό ν•˜λ‚˜μ˜ λ‹¨μœ„(객체)둜 λ¬Άκ³ , μ™ΈλΆ€μ—μ„œλŠ” ν•„μš”ν•œ λΆ€λΆ„λ§Œ μ ‘κ·Όν•˜λ„λ‘ λ³΄ν˜Έν•˜λŠ” 것

// μΊ‘μŠν™” 예제
class BankAccount {
    private double balance; // μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Ό λΆˆκ°€

    public BankAccount(double initialBalance) {
        balance = initialBalance;
    }
   // μ™ΈλΆ€μ—μ„œλŠ” λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œλ§Œ balance μ ‘κ·Ό κ°€λŠ₯

    public void deposit(double amount) {
        balance += amount;
    }

    public void withdraw(double amount) {
        if (balance >= amount) {
            balance -= amount;
        } else {
            System.out.println("μž”μ•‘ λΆ€μ‘±");
        }
    }

    public double getBalance() {
        return balance;
    }
}

public class Main {
    public static void main(String[] args) {
        BankAccount account = new BankAccount(1000);
        account.deposit(500);
        account.withdraw(300);
        System.out.println("ν˜„μž¬ μž”μ•‘: " + account.getBalance());
    }
}
ν˜„μž¬ μž”μ•‘: 1200.0

 

2. 상속(Inheritance): λΆ€λͺ¨ 객체의 속성과 λ™μž‘μ„ μžμ‹ 객체가 λ¬Όλ €λ°›μ•„ μž¬μ‚¬μš© ν•  수 μžˆλŠ” 것

// λΆ€λͺ¨ 클래슀
class Animal {
    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) {
        Dog dog = new Dog();
        dog.sound();
    }
}
멍멍

 

3. λ‹€ν˜•μ„±(Polymorphism): 같은 ν•¨μˆ˜ 이름이라도 객체에 따라 λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λ„λ‘ λ§Œλ“œλŠ” 것

class Animal {
    public void sound() {
        System.out.println("동물이 μ†Œλ¦¬λ₯Ό λ‚Έλ‹€");
    }
}

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

class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("μ•Όμ˜Ή");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal;

        animal = new Dog();
        animal.sound(); // λ‹€ν˜•μ„± 적용 - Dog

        animal = new Cat();
        animal.sound(); // λ‹€ν˜•μ„± 적용 - Cat
    }
}
멍멍
μ•Όμ˜Ή

 

 

4. 좔상화(Abstraction): κΌ­ ν•„μš”ν•œ μ •λ³΄λ§Œ κ³΅κ°œν•˜κ³ , 세뢀사항은 μˆ¨κΈ°λŠ” 것

abstract class Animal {
    abstract void sound();
}

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

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("μ•Όμ˜Ή");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.sound();

        Animal cat = new Cat();
        cat.sound();
    }
}
멍멍
μ•Όμ˜Ή

 

oopλ₯Ό ν™œμš©ν•˜λ©΄ 쒋은점

1. μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§„λ‹€.

2. ν™•μž₯성이 μ’‹μ•„μ§„λ‹€.

3. ν˜‘μ—…μ— μœ λ¦¬ν•˜λ‹€.

 

절차 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° vs 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°

μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ μˆœμ„œλŒ€λ‘œ μ‹€ν–‰λ˜λŠ” 절차 μ€‘μ‹¬μœΌλ‘œ 이루어진 ν”„λ‘œκ·Έλž˜λ° 방식이닀.

ν•­λͺ© 절차 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° (Procedural Programming) 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° (OOP)
기반 ν•¨μˆ˜(절차, ν”„λ‘œμ„ΈμŠ€)λ₯Ό μ€‘μ‹¬μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ ꡬ성 객체(데이터+ν•¨μˆ˜)λ₯Ό μ€‘μ‹¬μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ ꡬ성
ꡬ쑰 순차적인 흐름에 맞좰 ν•¨μˆ˜λ“€μ„ ν˜ΈμΆœν•˜λ©° 처리 객체 κ°„μ˜ μƒν˜Έμž‘μš©μœΌλ‘œ λ™μž‘
μ½”λ“œ μž¬μ‚¬μš©μ„±  μ½”λ“œ μž¬μ‚¬μš©μ΄ μƒλŒ€μ μœΌλ‘œ 어렀움(같은 κΈ°λŠ₯이라도 반볡 μž‘μ„± κ°€λŠ₯μ„±) 상속, μΊ‘μŠν™” 등을 톡해 μž¬μ‚¬μš©μ„±μ΄ λ†’μŒ
μœ μ§€λ³΄μˆ˜ 규λͺ¨κ°€ 컀질수둝 μœ μ§€λ³΄μˆ˜ 어렀움(μŠ€νŒŒκ²Œν‹° μ½”λ“œ λ°œμƒ κ°€λŠ₯μ„±) ꡬ쑰가 λͺ…ν™•ν•΄ μœ μ§€λ³΄μˆ˜κ°€ μƒλŒ€μ μœΌλ‘œ 쉬움
λŒ€ν‘œ μ–Έμ–΄ C. Pascalλ“± Java, C++ λ“±
μ˜ˆμ‹œ λ ˆμ‹œν”Ό(μˆœμ„œλŒ€λ‘œ 단계 μ‹€ν–‰) μžλ™μ°¨(속성: 색상, λͺ¨λΈ/ κΈ°λŠ₯: μš΄μ „, μ •μ§€)

 

절차 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° 예제 μ½”λ“œ

// 절차 μ§€ν–₯ μ½”λ“œ - 데이터λ₯Ό λ”°λ‘œ κ΄€λ¦¬ν•˜κ³ , ν•¨μˆ˜λ‘œ 처리
public class Main {
    public static void main(String[] args) {
        String[] names = {"철수", "영희", "민수"};
        int[] ages = {25, 23, 30};
        String[] jobs = {"개발자", "λ””μžμ΄λ„ˆ", "PM"};

        for (int i = 0; i < names.length; i++) {
            printPerson(names[i], ages[i], jobs[i]);
        }
    }

    public static void printPerson(String name, int age, String job) {
        System.out.println("이름: " + name);
        System.out.println("λ‚˜μ΄: " + age);
        System.out.println("직업: " + job);
        System.out.println("------------");
    }
}
이름: 철수
λ‚˜μ΄: 25
직업: 개발자
------------
이름: 영희
λ‚˜μ΄: 23
직업: λ””μžμ΄λ„ˆ
------------
이름: 민수
λ‚˜μ΄: 30
직업: PM
------------

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° 예제 μ½”λ“œ

// 객체 μ§€ν–₯ μ½”λ“œ - 데이터 + κΈ°λŠ₯을 객체둜 묢음
class Person {
    String name;
    int age;
    String job;

    public Person(String name, int age, String job) {
        this.name = name;
        this.age = age;
        this.job = job;
    }

    public void introduce() {
        System.out.println("이름: " + name);
        System.out.println("λ‚˜μ΄: " + age);
        System.out.println("직업: " + job);
        System.out.println("------------");
    }
}

public class Main {
    public static void main(String[] args) {
        Person[] people = {
            new Person("철수", 25, "개발자"),
            new Person("영희", 23, "λ””μžμ΄λ„ˆ"),
            new Person("민수", 30, "PM")
        };

        for (Person person : people) {
            person.introduce(); // 객체가 슀슀둜 행동
        }
    }
}
이름: 철수
λ‚˜μ΄: 25
직업: 개발자
------------
이름: 영희
λ‚˜μ΄: 23
직업: λ””μžμ΄λ„ˆ
------------
이름: 민수
λ‚˜μ΄: 30
직업: PM
------------
λ°˜μ‘ν˜•
LIST