기초개념

절차 지향 프로그래밍과 한계 (feat. 예시 코드)

addmean 2024. 6. 13. 15:37

절차 지향 프로그래밍은 프로그램을 일련의 절차나 루틴, 함수들의 순차적인 호출로 구성하는 프로그래밍 패러다임입니다. 이 접근법에서는 코드가 명령문의 순서에 따라 실행되며, 프로그램의 상태는 변수에 의해 유지됩니다.


기본 개념

함수: 절차 지향 프로그래밍의 기본 단위로, 특정 작업을 수행하는 코드 블록입니다.

변수: 데이터의 상태를 저장하는 메모리 공간입니다.

제어 구조: 조건문(if, switch)과 반복문(for, while) 등을 사용하여 프로그램의 흐름을 제어합니다.

프로시저: 특정 기능을 수행하는 함수들의 집합입니다.


객체 지향 프로그래밍과의 차이점

절차 지향 프로그래밍:

기능 중심: 프로그램을 기능이나 절차 중심으로 구성합니다.

데이터와 함수의 분리: 데이터와 데이터를 처리하는 함수가 분리되어 있습니다.

순차적 실행: 코드가 위에서 아래로 순차적으로 실행됩니다.

 

객체 지향 프로그래밍:

객체 중심: 프로그램을 객체(데이터와 메서드의 집합) 중심으로 구성합니다.

데이터와 함수의 결합: 객체 내에서 데이터와 데이터를 처리하는 메서드가 결합되어 있습니다.

캡슐화, 상속, 다형성: 객체 지향 프로그래밍의 핵심 원칙입니다.


장점

간단하고 명확한 구조: 작은 프로그램이나 간단한 문제 해결에 적합합니다.

절차적 사고 방식: 일련의 명령문을 순차적으로 작성하는 방식이 직관적입니다.

제어 구조의 명확성: 조건문과 반복문을 통한 명확한 제어 구조를 가집니다.


절차 지향 프로그래밍의 한계

확장성 부족: 코드가 커지고 복잡해질수록 관리가 어려워집니다.

재사용성 낮음: 함수와 데이터가 분리되어 있어 코드의 재사용성이 떨어집니다.

유지보수 어려움: 코드의 수정이 어려워 유지보수가 힘듭니다.


시나리오와 그 설계

사용자는 학교 도서관의 도서 대출 시스템을 사용하여 책을 대출하고 반납합니다. 이 시스템은 도서 목록을 관리하고, 사용자가 책을 대출 및 반납할 수 있도록 합니다.

 

함수 정의:

addBook(): 도서 목록에 새로운 도서를 추가합니다.

borrowBook(): 사용자가 도서를 대출합니다.

returnBook(): 사용자가 도서를 반납합니다.

displayBooks(): 현재 도서 목록을 출력합니다.

변수 정의:

books: 도서 목록을 저장하는 배열입니다.

borrowedBooks: 대출된 도서 목록을 저장하는 배열입니다.

실제 코드 예시 (Java)

import java.util.ArrayList;
import java.util.List;

public class LibrarySystem {
    private List<String> books = new ArrayList<>();
    private List<String> borrowedBooks = new ArrayList<>();

    // 도서 추가 함수
    public void addBook(String book) {
        books.add(book);
        System.out.println(book + "이(가) 도서 목록에 추가되었습니다.");
    }

    // 도서 대출 함수
    public void borrowBook(String book) {
        if (books.contains(book)) {
            books.remove(book);
            borrowedBooks.add(book);
            System.out.println(book + "이(가) 대출되었습니다.");
        } else {
            System.out.println(book + "은(는) 현재 대출 중이거나 존재하지 않습니다.");
        }
    }

    // 도서 반납 함수
    public void returnBook(String book) {
        if (borrowedBooks.contains(book)) {
            borrowedBooks.remove(book);
            books.add(book);
            System.out.println(book + "이(가) 반납되었습니다.");
        } else {
            System.out.println(book + "은(는) 대출 목록에 없습니다.");
        }
    }

    // 도서 목록 출력 함수
    public void displayBooks() {
        System.out.println("현재 도서 목록:");
        for (String book : books) {
            System.out.println(book);
        }
    }

    public static void main(String[] args) {
        LibrarySystem library = new LibrarySystem();
        library.addBook("The Great Gatsby");
        library.addBook("1984");
        library.addBook("To Kill a Mockingbird");

        library.displayBooks();

        library.borrowBook("1984");
        library.displayBooks();

        library.returnBook("1984");
        library.displayBooks();
    }
}

결론

절차 지향 프로그래밍은 작은 규모의 프로그램이나 간단한 문제 해결에 적합한 접근법입니다. 함수와 변수를 통해 명확한 절차를 정의하고, 일련의 명령문을 순차적으로 실행함으로써 문제를 해결합니다. 그러나 프로그램이 커지고 복잡해질수록 관리와 유지보수가 어려워지는 단점이 있으며, 이러한 문제를 해결하기 위해 객체 지향 프로그래밍이 사용될 수 있습니다. 절차 지향 프로그래밍은 여전히 많은 시스템에서 유용하게 사용되며, 기본적인 프로그래밍 개념을 이해하는 데 중요한 역할을 합니다.