λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Programming/Java

10 Object-Oriented Programming (feat. Procedural Programming)

by Dowon Kang 2024. 1. 19.

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming, OOP)은 μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ„€κ³„ν•˜κ³  κ΅¬ν˜„ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. 이 νŒ¨λŸ¬λ‹€μž„μ€ ν˜„μ‹€ μ„Έκ³„μ˜ 객체(object)와 κ·Έ 객체 κ°„μ˜ μƒν˜Έ μž‘μš©μ— 쀑점을 λ‘‘λ‹ˆλ‹€. μ—¬κΈ°μ„œ κ°μ²΄λŠ” 데이터와 κ·Έ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ©”μ„œλ“œ(ν•¨μˆ˜)둜 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

λ°˜λ©΄μ— μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ ν”„λ‘œκ·Έλž¨μ„ λ‹¨κ³„적인 μ ˆμ°¨λ‘œ λ‚˜λˆ„μ–΄ μ„€κ³„ν•˜κ³ , κ° λ‹¨κ³„μ—μ„œ ν•„μš”ν•œ λ°μ΄ν„°λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜ λ˜λŠ” ν”„λ‘œμ‹œμ €λ₯Ό μ€‘μ‹¬μœΌλ‘œ ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μž…λ‹ˆλ‹€.

 


객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ λ“±μž₯ λ°°κ²½ 

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)이 λ“±μž₯ν•œ 것은 주둜 μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—μ„œ λ°œμƒν•˜λŠ” λ³΅μž‘μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ˜ 어렀움에 λŒ€μ‘ν•˜κΈ° μœ„ν•΄μ„œμ˜€μŠ΅λ‹ˆλ‹€. OOPλŠ” μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 단점을 ν•΄κ²°ν•˜κ³  λ”μš± 효율적인 μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ„ κ°€λŠ₯μΌ€ ν•˜λŠ” μ—¬λŸ¬ 가지 νŠΉμ§•μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

 

 

Javaλ₯Ό ν™œμš©ν•œ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°

더보기

// ν΄λž˜μŠ€ μ •μ˜
class Person {
    // λ©€λ²„ λ³€μˆ˜ (속성)
    private String name;
    private int age;

    // μƒμ„±μž
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // λ©”μ„œλ“œ (λ™μž‘)
    public void printPersonInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

// λ©”인 ν΄λž˜μŠ€
public class Main {
    public static void main(String[] args) {
        // κ°μ²΄ μƒμ„± λ° μ΄ˆκΈ°ν™”
        Person person1 = new Person("Alice", 25);
        Person person2 = new Person("Bob", 30);

        // λ©”μ„œλ“œ ν˜ΈμΆœμ„ ν†΅ν•œ λ°μ΄ν„° μΆœλ ₯
        person1.printPersonInfo();
        person2.printPersonInfo();
    }
}

 

μ˜ˆμ‹œμ—μ„œ Person ν΄λž˜μŠ€λŠ” 객체의 속성(이름과 λ‚˜μ΄)κ³Ό λ™μž‘(정보 좜λ ₯)을 μ •μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. Main ν΄λž˜μŠ€μ—μ„œλŠ” Person 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”ν•œ ν›„, ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 데이터λ₯Ό 좜λ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μžλ°”μ—μ„œλŠ” ν΄λž˜μŠ€, κ°μ²΄, μƒμ†, λ‹€ν˜•μ„± λ“±μ˜ κ°μ²΄μ§€ν–₯적인 κ°œλ…λ“€μ΄ νš¨κ³Όμ μœΌλ‘œ μ‚¬μš©λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν΄λž˜μŠ€λŠ” λ°μ΄ν„°μ™€ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜λ‘œ λ¬Άμ–΄μ„œ μΆ”μƒν™”ν•˜κ³ , κ°μ²΄λŠ” μ΄λŸ¬ν•œ ν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ‘œμ„œ μ‹€μ œλ‘œ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ©λ‹ˆλ‹€. μ΄λ₯Ό ν†΅ν•΄ μ½”λ“œμ˜ λͺ¨λ“ˆμ„±κ³Ό μž¬μ‚¬μš©μ„±μ„ μ¦κ°€μ‹œν‚€κ³ , μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•œ κ΅¬μ‘°λ₯Ό λ§Œλ“€ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

 

 

μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°?  (Procedural Programming)

μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(Procedural Programming)은 μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ΅¬ν˜„ν•  λ•Œ ν”„λ‘œμ‹œμ €(Procedure)λ‚˜ λ£¨ν‹΄(Routine) λ“±κ³Ό κ°™μ€ ν”„λ‘œμ‹œμ € λ‹¨μœ„λ‘œ κ΅¬μ‘°ν™”ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μž…λ‹ˆλ‹€. μ΄ νŒ¨λŸ¬λ‹€μž„μ—μ„œλŠ” ν”„λ‘œκ·Έλž¨μ„ λ‹¨κ³„적인 μ ˆμ°¨λ‘œ λ‚˜λˆ„μ–΄ μ„€κ³„ν•˜κ³ , κ°κ°μ˜ λ‹¨κ³„μ—μ„œ ν•„μš”ν•œ λ°μ΄ν„°λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜λ‚˜ ν”„λ‘œμ‹œμ €λ₯Ό μ€‘μ‹¬μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•©λ‹ˆλ‹€.

μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œμ˜ μ£Όμš” νŠΉμ§•

  1. ν”„λ‘œμ‹œμ € μ€‘심 μ„€κ³„: ν”„λ‘œκ·Έλž¨μ€ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” μ ˆμ°¨λ‚˜ λ‹¨κ³„에 λ”°λΌ ν”„λ‘œμ‹œμ €λ‘œ λ‚˜λˆ„μ–΄μ Έ μžˆμŠ΅λ‹ˆλ‹€. μ΄ ν”„λ‘œμ‹œμ €λŠ” λ°μ΄ν„°μ™€ ν•΄λ‹Ή λ°μ΄ν„°λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ½”λ“œλ‘œ μ΄λ£¨μ–΄μ Έ μžˆμŠ΅λ‹ˆλ‹€.
  2. 데이터와 μ½”λ“œμ˜ 뢄리: 데이터와 μ½”λ“œκ°€ λͺ…μ‹œμ μœΌλ‘œ λΆ„λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λ°μ΄ν„°μ˜ ꡬ쑰와 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ½”λ“œκ°€ μ„œλ‘œ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•¨μ„ μ˜λ―Έν•©λ‹ˆλ‹€.
  3. 순차적 μ‹€ν–‰: μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” λͺ…μ‹œν•œ μˆœμ„œλŒ€λ‘œ μ½”λ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€. μ΄λŠ” λͺ…λ Ήμ–΄κ°€ 순차적으둜 μˆ˜ν–‰λ˜λŠ” νŠΉμ„±μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.
  4. λ³€μˆ˜ 쀑심 ν”„λ‘œκ·Έλž˜λ°: λ³€μˆ˜μ™€ λ°μ΄ν„°μ˜ μƒνƒœμ— 쀑점을 λ‘λŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨μ˜ μƒνƒœλŠ” λ³€μˆ˜μ— μ˜ν•΄ κ²°μ •λ˜λ©°, ν”„λ‘œμ‹œμ €λŠ” λ³€μˆ˜λ₯Ό μ‘°μž‘ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘μ„ μ œμ–΄ν•©λ‹ˆλ‹€.

μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ κ°„λ‹¨ν•˜λ©΄μ„œλ„ μ§κ΄€μ μΈ κ΅¬μ‘°λ₯Ό κ°€μ§€κ³  μžˆμ–΄μ„œ μ΄ν•΄ν•˜κΈ° μ‰½κ³ , μž‘은 κ·œλͺ¨μ˜ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” νš¨κ³Όμ μΌ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. C μ–Έμ–΄λŠ” μ „ν˜•μ μΈ μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ μ•Œλ €μ Έ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν° κ·œλͺ¨μ˜ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ°œλ°œν•˜κ±°λ‚˜ μœ μ§€λ³΄μˆ˜ν•΄μ•Ό ν•  λ•Œ, κ°μ²΄μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°κ³Ό κ°™μ€ λ‹€λ₯Έ νŒ¨λŸ¬λ‹€μž„이 λ” μœ μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

 

Cμ–Έμ–΄μ—μ„œμ˜ μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° 

C μ–Έμ–΄λŠ” μ „ν˜•μ μΈ μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ΄λ―€λ‘œ, κ°„λ‹¨ν•œ μ˜ˆμ‹œλ₯Ό ν†΅ν•΄ μ–΄λ–»κ²Œ μ ˆμ°¨μ§€ν–₯적인 μ½”λ“œκ°€ μž‘μ„±λ˜λŠ”μ§€ μ‚΄νŽ΄λ³Ό μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” C μ–Έμ–΄λ₯Ό μ‚¬μš©ν•œ κ°„λ‹¨ν•œ μ˜ˆμ‹œμž…λ‹ˆλ‹€.

 

더보기

#include <stdio.h>

// κ΅¬μ‘°μ²΄λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„° κ΅¬μ‘° μ •μ˜
struct Person {
    char name[50];
    int age;
};

// ν•¨μˆ˜ μ›ν˜• μ„ μ–Έ
void printPersonInfo(struct Person person);

int main() {
    // κ΅¬μ‘°μ²΄ λ³€μˆ˜ μ„ μ–Έ λ° μ΄ˆκΈ°ν™”
    struct Person person1 = {"Alice", 25};
    struct Person person2 = {"Bob", 30};

    // ν•¨μˆ˜ ν˜ΈμΆœμ„ ν†΅ν•œ λ°μ΄ν„° μΆœλ ₯
    printPersonInfo(person1);
    printPersonInfo(person2);

    return 0;
}

// ν•¨μˆ˜ μ •μ˜
void printPersonInfo(struct Person person) {
    printf("Name: %s, Age: %d\n", person.name, person.age);
}

 

μ˜ˆμ‹œμ—μ„œλŠ” ꡬ쑰체(struct)λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό λ¬Άμ–΄μ„œ κ΄€λ¦¬ν•˜κ³ , ν•¨μˆ˜λ₯Ό 톡해 데이터λ₯Ό μ²˜λ¦¬ν•˜κ³  좜λ ₯ν•©λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨μ˜ 흐름은 main ν•¨μˆ˜μ—μ„œ μ‹œμž‘ν•˜λ©°, 데이터와 κ΄€λ ¨λœ λ™μž‘μ€ printPersonInfo ν•¨μˆ˜μ—μ„œ μˆ˜ν–‰λ©λ‹ˆλ‹€. μ΄λŠ” 일반적인 μ ˆμ°¨μ§€ν–₯적인 μ½”λ“œ κ΅¬μ‘°μž…λ‹ˆλ‹€.

 

 

 

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ μž₯점  

  • λͺ¨λ“ˆμ„± λ° μž¬μ‚¬μš©μ„± κ°•ν™”: OOPμ—μ„œλŠ” ν΄λž˜μŠ€μ™€ κ°μ²΄λ₯Ό μ΄μš©ν•˜μ—¬ λͺ¨λ“ˆν™”λœ μ½”λ“œλ₯Ό μž‘μ„±ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. ν΄λž˜μŠ€λŠ” μ½”λ“œμ™€ λ°μ΄ν„°λ₯Ό ν•¨κ»˜ λ¬Άμ–΄ ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ κ΄€λ¦¬ν•˜λ©°, μ΄λ‘œμ¨ λͺ¨λ“ˆμ„±μ΄ κ°•ν™”λ˜κ³  μž¬μ‚¬μš©μ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.
  • 상속을 ν†΅ν•œ μ½”λ“œ μž¬μ‚¬μš©: 객체 지ν–₯ μ–Έμ–΄μ—μ„œλŠ” 상속을 톡해 이미 μ‘΄μž¬ν•˜λŠ” 클래슀의 νŠΉμ„±κ³Ό λ©”μ„œλ“œλ₯Ό μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ½”λ“œμ˜ 쀑볡을 쀄이고 μœ μ§€λ³΄μˆ˜λ₯Ό μ‰½κ²Œ λ§Œλ“­λ‹ˆλ‹€.
  • λ‹€ν˜•μ„±μœΌλ‘œ ν™•μž₯μ„± 증가: OOPμ—μ„œμ˜ λ‹€ν˜•μ„±μ€ λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 λ‹€μ–‘ν•œ νƒ€μž…μ˜ 객체λ₯Ό μ²˜λ¦¬ν•  수 있게 ν•©λ‹ˆλ‹€. μ΄λŠ” μœ μ—°μ„±κ³Ό ν™•μž₯성을 μ œκ³΅ν•˜λ©°, μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ λ³€κ²½ν•  λ•Œ κΈ°μ‘΄ μ½”λ“œμ— 영ν–₯을 μ΅œμ†Œν™”ν•©λ‹ˆλ‹€.
  • μΊ‘μŠν™”λ‘œ λ³΄μ•ˆ κ°•ν™”: 객체 지ν–₯ μ–Έμ–΄μ—μ„œλŠ” μΊ‘μŠν™”λ₯Ό 톡해 객체의 μƒνƒœλ₯Ό μ™ΈλΆ€λ‘œλΆ€ν„° λ³΄ν˜Έν•˜κ³ , ν•„μš”ν•œ κ²½μš°μ—λ§Œ 접근을 ν—ˆμš©ν•¨μœΌλ‘œμ¨ λ³΄μ•ˆμ„ κ°•ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν˜„μ‹€ 세계 λͺ¨λΈλ§: OOPλŠ” ν˜„μ‹€ μ„Έκ³„μ˜ κ°œλ…κ³Ό μœ μ‚¬ν•œ λͺ¨λΈμ„ μ œκ³΅ν•˜λ―€λ‘œ μ†Œν”„νŠΈμ›¨μ–΄μ˜ 섀계와 이해가 μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
  • μœ μ§€λ³΄μˆ˜ μš©μ΄μ„±: 객체 지ν–₯ μ–Έμ–΄λŠ” 변경이 ν•„μš”ν•œ λΆ€λΆ„λ§Œ μˆ˜μ •ν•  수 μžˆλ„λ‘ ν•˜λŠ” μœ μ—°ν•œ ꡬ쑰λ₯Ό μ œκ³΅ν•˜μ—¬ μœ μ§€λ³΄μˆ˜λ₯Ό μš©μ΄ν•˜κ²Œ ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ–΄λ–€ νŒ¨λŸ¬λ‹€μž„이든 κ°κ°μ˜ μž₯단점이 μžˆμœΌλ©°, μƒν™©μ— λ”°λΌ μ μ ˆν•œ νŒ¨λŸ¬λ‹€μž„을 μ„ νƒν•΄μ•Ό ν•©λ‹ˆλ‹€. κ°μ²΄ μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄ ν•­μƒ μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°λ³΄λ‹€ μš°μ›”ν•œ κ²ƒμ€ μ•„λ‹ˆλ©°, ν”„λ‘œμ νŠΈμ˜ μš”ꡬ사항과 νŠΉμ„±μ„ κ³ λ €ν•˜μ—¬ μ μ ˆν•œ νŒ¨λŸ¬λ‹€μž„을 μ„ νƒν•˜λŠ” κ²ƒμ΄ μ€‘μš”ν•©λ‹ˆλ‹€.

 

 



Object-Oriented Programming (OOP): A software design paradigm that structures a program around objects, each of which encapsulates data and the methods that operate on the data.

Procedural Programming: A software design paradigm that structures a program based on procedures or routines, with each procedure following a sequential set of steps in its execution.

 

'Programming > Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

12 Constructor  (0) 2024.01.19
11 Class intro - feat. Field (Member variable)  (0) 2024.01.19
9 Two-dimensional Arrays (Feat. Object Array)  (0) 2024.01.19
8 Array (λ°°μ—΄)  (0) 2024.01.19
7 while loop (feat. do-while)  (0) 2024.01.07

λŒ“κΈ€