본문으로 바로가기

구조화 프로그램

일반적으로 순차, 조건, 반복문에 작성된프로그램, 구조화 프로그램 장점은 실행순서가 항상 위에서 아래로 작동하므로 쉽게 이해할 수 있는 편이다. 대부분의 언어가 이에 속하고 있다.

예외로, C에서 'GOTO'문은 예상치 못한 부분으로 넘겨서 특정한 상황이 아니면 구조화 프로그램에선 사용하지 않는 것이 좋다.

 

 

모듈(Module)

모듈에 대해서는 사람마다 그해석이 다르다, 대게의 경우 함수나 클래스를 칭하며, 일부는 C에서 '('과 ')'에 의해 둘러쌓인 블록과 프로그램 파일(a.cpp) 등을 모듈이라고 부르는 경우도 있다.

 

 

간단한 코드로 지역변수 이해하기

#include<stdio.h>

void Func() {
	int b;
	int c;
}

int main() {
	int ix;
	int iy;

	ix = 2;
	iy = 3;

	int iresult = ix + iy;

	printf("두개의 값을 더한 결과 %d \n", iresult);
	
	Func();

	return 0;
}

지역변수 : 함수가 시작되고 함수가 종료될때 사라지는 변수다. 함수 지역 내에서만 사용이 가능하다.

 

코드를 통해 스택 이해하기

지역변수인 ix,iy가 먼저 main 함수내에서 지역변수로 선언이 되고 그 다음 메인 함수내에서 Func을 호출하여 Func 내에선 b,c가 선언이 된다. 그후 Func이 종료되면서 b,c는 풋(put) 된다, 그다음 메인으로 다시 리턴하여 메인함수가 종료될때 ix, iy 또한 풋(put)되는 것으로 지역변수를 통해 스택의 구조를 이해할 수도 있다.

 

 

간단한 코드로 전역변수 이해하기

#include<stdio.h>

int ix;
int iy;

int main() {

	ix = 2;
	iy = 3;

	int iresult = ix + iy;

	printf("두개의 값을 더한 결과 %d \n", iresult);
	
	Func();

	return 0;
}

전역변수 : 프로그램이 시작될고 프로그램이 종료될때 사라지는 변수다. 모든 함수에서 호출이 가능하다.

상대적으로 중요하고, 오래 유지 되어야하는 값에 사용된다

 

 

함수를 이용한 구조화 프로그램

앞서 작성한 예제 코드가 복잡한 코드라 가정하고 함수 모듈을 이용하여 구현해 보았다.

 

#include <stdio.h>

int ix;
int iy;

void assign(int t, int j) {
	ix = i;
	iy = j;
}


int main() {

	assign(2, 3);

	int iresult = ix + iy;

	printf("두개의 값을 더한 결과 %d \n", iresult);

	return 0;
}

위와 같은 과정을 함수를 통한 코드 추상화 라고 하는데 추상화란 개념은 이전 자료구조 글을 참고하길 바란다.

 

2021.03.08 - [이론공부/자료구조] - 자료구조 공부#2 (자료형, 추상 자료형)

 

한반가 :: 자료구조 공부#2 (자료형, 추상 자료형)

보호되어 있는 글이기에 비밀번호가 요구됩니다.

thesauro.tistory.com

간단히 일상생활에 요약하면 사람이 어제 무슨일을 했을때 밥먹기, TV보기 등 구구절절한걸 생략하고 "쉬었다"라고 표현을 하는 느낌이다.

 

함수를 더 이용해 좀더 구조화 해보기

#include <stdio.h>

int ix;
int iy;


void assign(int t, int j) {
	ix = i;
	iy = j;
}

int Add() {
	return ix + iy;
}


int main() {

	assign(2, 3);
	
	int iresult = add();

	printf("두개의 값을 더한 결과 %d \n", iresult);

	return 0;
}

함수를 이용해서 구조화하는 것에 장점

위와 같이 함수화를 하게 되면 main 함수 내에서 어떤 작업을 하는지 가독성이 높아지며, 혹여 비슷한 작업을 여러번 해야하는 경우 같은 코드를 다시 작성할 필요없이 함수를 다시호출 하기만 하면 되므로 프로그램 생산성도 높일 수 있다.

 


객체지향 프로그래밍(OOP)이 필요한 이유

앞서 작성한 프로그램은 간단하긴 하지만 함수로 모듈화된 구조화 프로그램이다. 하지만 이러한 간단한 프로그램은 상관없이, 변수가 수백개, 함수가 수천개로된 대형 프로젝트의 프로그램의 경우에는 어떨까?

아마도, 자신이 객체지향 없이 코드 추상화로만 짠 프로그램 조차 만들고 다시 보게된다면 해석하는데만 시간과 노력이 필요할 것 이고, 그걸 한다고 생각하면 아찔할 것이다. 

아래와 같은 경우들을 확인해보자.

 

이러한 경우들을 방지, 해결하기 위해서 객체지향 프로그래밍(OOP)가 필요한 것이다.

 

코드 추상화가 야기하는 문제점

  • 어떤 함수가 어떤 변수를 액세스하는지 쉽게 알기 어렵다.

  • 어떤 함수가 어떤 함수를 호출하는지 쉽게 알수 없다.

  • 함수와 변수들이 기준 없이 뒤섞여 있어서 재사용시 어디까지 사용해야 하는지 쉽게 알 수 없다.

  • 초기화 함수와 같이 반드시 호출해야 하는 함수를 쉽게 알 수 없다.

코드 추상화는 분명 좋은 방법이긴 하나, 대형 프로젝트로 넘어갈수록 재사용과 다른사람이 코드를 읽어야 하는 점에서 가독성이 떨어 질 수 밖에 없고, 이는 스케일을 크게 보면 하드웨어는 발전하지만 소프트웨어는 그 속도에 못따라가는 이유가 될수 있다.

어떤 함수가 어떤 변수를 액세스 하는지 쉽게 알기 어렵다.

void assign(int t, int j) {
	ix = i;
	iy = j;
}

위와 같이 코드를 받으면 위에 프로그램 전체를 이해한 우리는 이해할 수 있지만, 이 코드를 처음본 사람은 ix, iy 가 무슨 변수인지 모를 것이다.

 

어떤 함수가 어떤 함수를 호출하는지 쉽게 알 수 없다.

int main() {

	assign(2, 3);
	
	int iresult = add();

	printf("두개의 값을 더한 결과 %d \n", iresult);

	return 0;
}

위와 같이 메인함수만 넘겨 받았을때 assign() 함수와 add()함수가 호출되는건 알 수 있지만, assign(), add() 안에 다른 함수가 더 들어 있고, 그안에 더들어 있다고 하고 더 그안에..... 까마득할것이다.....

 

 

함수와 변수들이 기준 없이 뒤섞여 있어서 재사용시 어디까지 사용해야 하는지 쉽게 알 수 없다.

 

int main() {

	assign(2, 3);
	
	int iresult = add();

	printf("두개의 값을 더한 결과 %d \n", iresult);

	return 0;
}

결과값 : 50000

만약 메인 함수만 보고 이해하려 했을때 얼핏 보면 2와 3을 더하고 5를 출력해야하지만 결과값이 50000이 나왔다.

이런경우엔 재사용시에 함수와 변수를 다 확인해 보아야 하는 대참사가 발생하는데, 왜 50000의 결과값 까지 나왔는지 과정을 알아보는게 머리 아플 것이다....

 

초기화 함수와 같이 반드시 호출해야 하는 함수를 쉽게 알 수 없다.

#include <stdio.h>
#include <HELLO.h>

int ix;
int iy;


void assign(int t, int j) {
	ix = i;
	iy = j;
}

int Add() {
	return ix + iy;
}


int main() {

	assign(2, 3);
	
	int iresult = add();

	printf("두개의 값을 더한 결과 %d \n", iresult);

	return 0;
}


컴파일 에러 : !#@$!%0118ㄻㄴㅇ

재사용을 위해 코드를 받았고 분명 내가 원하는 기능을 위한 함수들은 다 넣은것 같지만 오류가 발생하는 경우가 있다.

이경우는 물론 다시 다 코드를 해석해야 알겠지만 위 경우엔 HELLO 헤더파일에 초기화 함수 같이 필수 선언되어야할 함수가 누락된 경우일 수도 있다. main 함수에서 시작하여 이제 다른 헤더파일 까지 가야하는 슬픈 고난의 여정이 시작되었다.

 

그 외에 경우

그 외에도 변수에 음수 양수를 잘못 넣는 다던지의 오류를 발견하지 못해 원하는 결과값을 갖지 못하는 경우도 비일 비재 할것이다.

 


느낀점 : 객체지향 프로그래밍을 통해서 해결될 수 있는 코드추상화의 문제점들을 들었다. 들으면 들을수록 매우 중요한 내용이기도 하고 오랜만에 지역변수, 전역변수, 함수를 C로 작성해볼수 있는 기억되세김의 기회가 되엇다.  이전에 다룬 추상화 개념도 다시 되돌아 보는것이 좋을것이다.