아래의 글은 패러다임을 개인적으로 공부한 후 정리한 내용입니다.
혹시 틀린 부분이 있다면 댓글이나 이메일로 피드백해주시면 감사하겠습니다!
절차적 프로그래밍?
절차적 프로그래밍, 영어로는 Procedural Programming이라고 한다.
여기서 Procedural이란 일을 함에 있어서의 절차라고 해석하기보다는
함수 또는 프로시져라고 해석하는게 맞다고 한다.
절차적 프로그래밍은 프로그래밍 패러다임의 하나로
데이터와 프로시져를 별개의 요소로 구분하며,
프로시져를 중점으로 문제를 해결하는 방식이다.
큰 문제를 여러 작은 프로시저로 나누어 해결한다.
전역변수와 프로시져 내 지역변수가 있으며, 전역변수는 프로시져끼리 공유할 수 있다.
또한 전역변수는 프로시져에서 변경될 수 있다.
[계좌이체] []1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| public class 계좌이체 { public static Account[] accounts = new Account[] {new Account("kim", 300), new Account("park", 300)}; public static void main(String[] args) { deposit("kim",1000); deposit("park",500);
int payment = 1200; if(hasEnoughBalance("kim",payment)) { transfer("kim","park",payment); } }
public static Account getAccount(String name) { for(int i = 0; i< accounts.length;i++) { if(accounts[i].name.equals(name)) { return accounts[i]; } } return null; }
public static void deposit(String name, int amount) { Account account = getAccount(name); account.balance += amount; }
public static void withdraw(String name, int amount) { Account account = getAccount(name); account.balance -= amount; }
public static boolean hasEnoughBalance(String name, int amount) { Account account = getAccount(name); return account.balance > amount; }
public static void transfer(String payerName, String beneficiaryName, int payment) { Account payerAccount = getAccount(payerName); withdraw(payerAccount.name, payment); Account beneficiaryAccount = getAccount(beneficiaryName); deposit(beneficiaryAccount.name, payment); }
public static class Account{ int balance; String name;
public Account(String name, int balance) { this.name = name; this.balance = balance; } }
}
|
은행에서의 입금과 계좌이체를 간단하게 구현했다.
Account 클래스가 있지만 이는 객체가 아닌 데이터들의 집합이라고 볼 수 있다.
계좌이체라는 문제를 게좌 찾기, 입금, 출금, 잔액확인등의 기능으로 나누어 해결하려했다.
accounts라는 전역변수가 있고 프로시져 내에서 accounts에 접근, 변경할 수 있다.
절차지향 프로그래밍은
위의 코드처럼 데이터와 프로시져가 분리되어있고 프로시져들이 데이터를 공유하며
큰 문제를 작은 단위의 프로시져로 해결하려는 방식이다.
장점
기능을 분리해서 프로시져로 사용하기 때문에 코드를 재활용할 수 있었다.
기능별로 분리됐기 때문에 협업이 가능하다.
또한 프로시져의 이름만 읽어도 흐름 추적이 용이하다.
단점
현실을 그대로 나타내기 힘들다.
데이터와 프로시져가 분리되어있어 누가 무엇을 한다는 개념이 없어
현실 세계를 그대로 구현하기 힘들다.
유지보수가 어렵다.
전역 변수의 접근을 막을 수 없다.
코드 어느곳에서도 전역 변수에 접근할 수 있어서 데이터의 신뢰성을 보장할 수 없다.
또한 전역변수를 공유하기 때문에 변수의 구조에 변화가 있을 경우
공유하고 있는 모든 프로시져에 수정이 필요할 수도 있다.
이 부분은 최범균님의 글을 보고 정확히 파악할 수 있었다.
이 부분은 최범균님의 글을 보고 정확히 파악할 수 있었다.
참고자료
나무위키/절차적 프로그래밍
위키백과/절차적 프로그래밍
Functional, Object-Oriented, and Procedural Programming
programming-paradigms-what-is-procedural-programming
객체-지향과-절차-지향에-대한-질문-답변
프로그래밍-패러다임순차적비구조적절차적구조적객체지향적-프로그래밍