티스토리 뷰
이번에는 절차적 프로그래밍에 대해 알아보겠습니다.
사실 자바와는 거리가 멀지만
절차적 프로그래밍이 무엇인지 알아야
자바를 더욱 이해하기 쉬울 것 같아 소개합니다.
(초반 자바 문법은 EditPlus 프로그램을 사용합니다.)
==============================================================
절차적 프로그래밍 : Procedural Programming
1. Procedural Programming 단어가 무엇을 뜻할까?
영어사전에서의 Procedural은 '절차상의' 라는 뜻을 지니고 있습니다.
보통 절차라는 뜻을 어떤 일을 하는데 가는 순서나 방법으로 생각하기 때문에 Procedural Programming이라 하면 순서나 방법을 중요시하는 프로그래밍이라고 생각합니다.
하지만 이는 한국어 번역에 의해 오해?라고 합니다.
생각해보면 절차적이지 않은(순서나 방법을 생각하지 않은) 프로그래밍은 존재할 수가 없는 것이죠.
그렇다면 여기서 Procedural가 진짜 뜻하는 의미는 무엇일까요?
class Procedure {
// 뺄샘 프로시저 생성
static int gap(int n1, int n2) {
int d = n1 - n2;
if(d<0)
d *= -1;
return d;
}
// 제곱 프로시저 생성
static int power(int n1, int n2) {
int result = 1;
for(int i=1; i<=n2;i++) {
result *= n1;
}
return result;
}
// 3자리마다 ,를 찍은 문자열을 만들어내는 프로시저
static String format(int data) {
String str = "";
int cnt = 0;
do{
str = data % 10 + str;
data /= 10;
cnt++;
if(cnt % 3 ==0 && data != 0)
str = "," + str;
}while(data>0);
return str;
}
public static void main(String[] args) {
// main에서의 프로시저 호출
System.out.println("main - start");
System.out.println("프로시저 gap 호출 결과 " + gap(45,32));
System.out.println("프로시저 power 호출 결과 " + power(2,8));
System.out.println("프로시저 format 호출 결과 " + format(900000));
System.out.println("main - end");
}
}
진짜 Procedural가 뜻하는 의미는 위 코드를 보시면 아실겁니다.
위의 코드는 뺄셈, 제곱, 3자리마다 ','를 찍은 문자열을 만드는 기능을 구현한 것 입니다.
여기서 만약 프로시저로 각 기능을 나누지않고 main에서 기능을 구현하여 바로 출력하였다면 어땠을까요?
위 코드는 짧아서 한번만 사용했다면 문제가 되진 않겠지만 3가지 기능을 3번씩 작동해야할 경우가 생겼을 때는
비효율적으로 같은 코드를 3번이나 적어 코드가 매우 지저분하게 되죠.
이런 비효율적인 코드를 프로시저로 이용하게 되면 함수를 통해 같은 코드를 재활용할 수 있고, main뿐만 아니라 함수 내에 호출을 통해 여러 부분을 생략하여 프로그램 흐름을 쉽게 파악할 수 있어 코드의 가독성이 높아지게 됩니다. 또한 모듈화와 구조화에 더 용이해져 많은 코드가 사용되는 프로젝트에서는 자신이 맡은 부분만 프로그래밍하여 조립할 수 있게 되죠.
이처럼 프로시저는 단순히 순서나 방법을 뜻하는 것이 아니라 함수 호출을 통해서 추상화와 재활용성을 얻어내는 것이 본질입니다.
2. Procedure 어떻게 사용할까?
static String format(int data) {
String str = "";
int cnt = 0;
do{
str = data % 10 + str;
data /= 10;
cnt++;
if(cnt % 3 ==0 && data != 0)
str = "," + str;
}while(data>0);
return str;
}
public static void main(String[] args) {
// main에서의 프로시져 호출
System.out.println("main - start");String s = format(900000);
System.out.println("프로시져 format 호출 결과 " + s);
System.out.println("main - end");
}
위 코드에서 3자리마다 ','를 문자열에 찍는 프로시저를 예로 들겠습니다.
일단 프로시저에서 중요한 3가지는 함수명, 반환타입, 매개변수 입니다. (static 은 뒤에 가서 설명하겠습니다.)
String format(int data){...}
여기서 String이 반환 타입, format이 함수명, 함수명옆 ()안에 있는 인자가 매개변수 입니다.
이 프로시저를 사용하기 위해서는 지켜야할 규칙이 있습니다.
1) 만들어둔 함수명을 대소문자 구분하여 정확히 사용해야함
- format이라는 함수명을 가지고 main프로시저에서 정확히 사용해야합니다. Format이라든지 Farmat이라든지 대소문자, 철자 어느 하나라도 일치하지 않는다면
프로시저를 호출할 수 없습니다.
2) 반환값에 맞는 변수에 저장해야함
- format 프로시저에서는 문자열 타입의 String을 반환하도록 설계되어있습니다. 이 때 반환되는 String을 String s 변수에 저장합니다.
만약 String이 아닌 int와 같은 변수에 저장한다면 에러가 발생하겠죠.
3) 작동시키기 위한 매개변수(타입)을 알맞게 정해줘야함
- format(int data)에서 매개변수로 int 타입의 데이터 1개를 받았습니다.
만약 매개변수로 String 타입의 데이터를 전달하여 프로시저를 호출한다면 에러가 발생합니다.
또한 매개변수의 갯수는 1개가 아니여도 됩니다. 다만 호출할 때와 호출하는 프로시저의 형태가 같아야 함으로 매개변수의 타입과 매개변수의 개수가 일치해 야합니다.
3. Procedural Programming의 단점은?
현재 대부분의 언어는 객체지향언어로 개발되고 있습니다. Java 언어도 객체지향언어라고 책을 잠깐이라도 보신 분은 아실겁니다.
자바가 객체지향언어를 사용하는 이유는 절차적 프로그래밍에 단점이 있기 때문에 나온 것이라 볼 수 있기 때문에 객체지향언어를 설명하기 전에
Procedural Programming을 소개한 것이고 단점이 무엇인지 알아보겠습니다.
자세히 파고 들면 매우 복잡해지는데 간단히 설명하자면 프로시저를 호출하는 것은 그냥 코드를 쓰는 것보다 시간이 매우 많이 소모됩니다.
또한 프로시저는 넘어온 데이터를 이용해 처리해주고 넘겨주는 기능 밖에 없기 때문에 데이터를 저장하고 관리할 수 있는 공간이 따로 없습니다.
때문에 프로그램을 개발하는데 있어 내용이 많아지고 코드가 길어지면 가독성 뿐만 아니라 기능 구현에 많은 불편함이 따릅니다.
이를 보완하기 위해 객채자향 언어가 나오게 된 것입니다.
객체지향 언어는 데이터를 저장할 수 있는 변수를 가지고 있을 뿐만 아니라 저장하고 있는 데이터를 통해 프로시저도 구현할 수 있기 때문이죠.
예전에는 절차지향 언어가 객체지향 언어보다 빠르게 처리되어 시간적으로 유리하긴 했으나 기술이 발전하고 소프트웨어 언어의 발달과 컴파일러의 발달로
하드웨어가 소프트웨어의 발달을 따라오지 못하는 상황이 나와 현재는 대부분의 객체지향 언어로 개발되고 있다고 보면 됩니다.
'Java > 문법' 카테고리의 다른 글
6. 접근 제어자 : Access Modifier (14) | 2018.10.09 |
---|---|
5. 정적 변수와 메소드 : static (0) | 2018.10.06 |
4. 가비지 컬렉터 : Garbage Collector & 메모리 (0) | 2018.10.05 |
3 . 생성자 : Constructor (0) | 2018.10.03 |
2. 객체지향 프로그래밍 : OOP(Object-Oriented-Programming) (0) | 2018.10.02 |
- Total
- Today
- Yesterday
- 원리
- @subselect
- QueryDSL
- 로그인
- 관리자 도구
- 장점
- API
- @subquery
- list
- login
- beforeunload
- join subquery
- playbackRate
- Queue
- jwplayer
- map
- Animation
- 특징
- IN Clause
- 예제
- SDK
- 자바
- oauth
- SET
- on('seek')
- 의미
- 네트워크
- Multi IN Clause
- playsinline
- @EventListener
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |