안경잡이개발자

728x90
반응형

※ EMR(Electronic Medical Record)에 대해서 ※


  EMR(Electronic Medical Record)전자 의무 기록의 약자입니다. 기존 1990년대 이전에는 병원에서는 환자의 정보를 모두 종이에 기재하여 보관했습니다. 일반적으로 환자의 인적 사항, 병력, 진찰 결과, 치료 결과, 수술 기록, 입퇴원 기록, 외래 진료 사항 등이 포함되었습니다. 사실 행정적인 업무가 중요한 다른 산업체와 비슷하게 의료 업계에서도 모든 정보를 기록할 때 전산화가 이루어질 필요가 강하게 있던 시기입니다. 그래서 결과적으로 1990년대 중반 이후로 EMR이라는 이름의 전산 시스템이 병원에 도입됩니다.


  사실상 매일매일 신규 환자 및 입원 환자의 정보를 처리해야 되는 병원에서는 환자 차트를 종이로 관리하게 되면 최소 하루에 몇 백 장 가량의 종이가 낭비됩니다. 또한 종이는 독립적인 데이터로 존재한다는 점에서 모바일이나 기타 컴퓨터로 연동이 될 수도 없다는 단점도 존재합니다. 무엇보다 전산 시스템은 사실상 영구적으로 보존이 가능하지만 종이는 시간이 지나면 변질될 수 있다는 점에서 매우 많은 분야에서 전산 시스템이 도입되기 시작했고, 병원도 사실은 그러한 흐름 중 하나라고 보시면 됩니다. 


※ 국내 EMR의 한계점 ※


  다만 국내 EMR 소프트웨어와 관련하여 상용 소프트웨어를 검색해보면 유비케어, 비트컴퓨터, 전능 IT가 존재합니다. 다만 병원 소프트웨어에 관심이 많은 사람이라면 알겠지만 국내 EMR 소프트웨어들은 모두 각기 다른 표준을 가지고 운영되고 있습니다. 데이터베이스 설계부터 사용자 인터페이스까지 모든 부분에 있어서 소프트웨어마다 다르게 구성되어 있습니다.


  의료 업계와 관련한 국제 표준으로는 ISO 13606 등이 있는데 이러한 표준은 다른 표준에 비해서 실제 소프트웨어에 잘 적용이 되어있지도 않습니다. 이러한 실정은 사실 국내의 큰 병원 및 영세한 병원들이 각기 다른 요구사항을 가지고 있기 때문이기도 한데 전반적으로 국내 의료 시스템의 표준화가 시급한 실정입니다. 표준화가 안 되어있어 각기 분산되어 있는 의료 정보들은 실질적으로 범국가적인 통계 및 연구에 이렇다한 주지 못한다는 점에서 개선의 여지가 분명합니다.


▶ 관련 기사 ①: '표준화 못해 전자의무기록 수출길 막힌 IT 강국의 현실', 2014-11-12, 임솔 기자, <조선 비즈>


  해당 기사에 따르면 국내 대부분의 병원에서 사용되고 있는 전자 의무 기록(EMR) 및 의료 정보 시스템이 국제 표준을 따르고 있지 않아 세계적으로 의료 표준을 따르고 있는 국가로 의료 시스템의  수출이 불가능한 상태라고 합니다. 어플리케이션과 웨어러블 기기를 통한 환자 건강관리가 가능하기 위해서는 EMR 시스템이 국제 표준을 준수해야 하는데 국내 시스템은 국제 표준을 제대로 따르고 있지 않은 추세입니다. 결과적으로 의료 정보 연동 및 의료 시스템 수출이 어려운 상황인 것입니다.


  미국은 최근 국제 표준을 준수한 EMR이 급격히 늘고 있어 빠르게 병원 시스템 연동이 이루어지고 있습니다. 우리나라의 경우 보건복지부가 2005년에 EMR 표준화를 위해 통합의료정보시스템 구축을 위한 사업단을 출범시킨 적이 있습니다. 다만 예비 타당성 검토 결과 사업성이 없다는 이유로 2009년에 부적격 판정을 받고 중단이 되었습니다. 사실 국제 표준이 내용이 방대하고 이해하기 어렵다는 단점이 있습니다. 미국 주도의 표준안인 HL7은 전체 내용이 3만 쪽에 이를 정도입니다. 앞서 언급했던 유럽 표준인 ISO 13606도 천 쪽이 넘습니다. 다시 말해 IT 개발자 입장에서도 방대한 의료 지식이 필요하다는 점에서 EMR 구축은 어려울 수 밖에 없습니다.


  더불어 국내 의료 업계에서는 병원간 진료 정보가 교류되면 이중 검사로 인한 수익을 올릴 수 없다는 이유로 오히려 표준화를 꺼리기도 합니다. 심지어 EMR 가격이 조금만 올라도 불매 운동을 벌일 정도로 돈을 쓰지 않으려는 경향이 국내 병원 전반에 퍼져있으므로 신중한 EMR 개발이 필요한 상황입니다. (물론 지금은 현행법상 의료정보가 병원이 아닌 제 3기관에 보관될 수 있다는 점에서 그나마 클라우드 기반의 시스템 개발이 이루어지고 조금씩 발전하고 있는 추세입니다.)


▶ 관련 기사 ②: '4차 산업혁명 적신호 켜진 한국 EMR', 2017-06-23, 황재희 기자, <MEDI:GATE>


  해당 기사에 따르면 인공지능이 보건의료에 혁명을 가져다 줄 것 이라고 보는 시대에서 국내 의료 데이터를 보다 의미 있게 쓸 필요가 있습니다. 의료정보학회는 현재 병원마다 제각각인 EMR을 표준화하여 세계적으로 교류할 수 있는 데이터로 만들어 의료의 질을 높여야 한다고 주장하고 있습니다. 특히 고도화된 데이터를 만들었을 때 국가적으로 인센티브를 줄 필요도 있다고 보는 전망입니다.


  현재는 단순히 환자의 정보를 수집하는 목적의 EMR이지만 향후 진료 및 연구 목적으로 공유하고 활용할 수 있는 EMR이 되어야 합니다. 미국은 벤더(Vendor) 중심의 EMR이 사용되고 있습니다. 하지만 국내 병원은 벤더 중심이 아니라 병원 중심으로 개발된 소프트웨어를 이용하고 있다는 점에서 표준화 작업이 필요한 상황입니다. 병원마다 정보를 공개하지 않으려는 경향 때문에 이러한 추세는 나아질 기미가 없는 상황입니다.


  그래서 최근에는 각 병원 데이터를 모아 공통 데이터 모델(CDM) 방식으로 전환하는 작업이 수행되고 있는 추세입니다. 대표적으로 오딧세이 컨소시엄이 각 병원의 비표준화 데이터를 한데 모아 CDM으로 전환해 표준화시키고, 분석 도구와 툴을 제공하면 병원은 원하는 정보를 얻기 위해서 데이터를 적용하고 그 결과를 도출해 연구 및 임상 실험에 사용할 수 있는 방식입니다.

728x90
반응형

Comment +0

728x90
반응형

  스택(Stack)을 구현하는 방법은 크게 단순 배열(Array)을 이용한 방법과 단방향 연결 리스트(Linked List)를 이용한 방법이 있습니다. 이번 시간에는 연결 리스트(Linked List)를 이용한 방법에 대해 간단히 알아보도록 하겠습니다.


※ 스택 선언하기 ※


  스택 선언은 기존의 연결 리스트와 동일하게 진행합니다.


----------------------------------------------------------------


#include <stdio.h>

#include <stdlib.h>


typedef struct Node *NodePointer;

typedef struct Node {

int data;

NodePointer next;

} Node;


NodePointer top = NULL;


----------------------------------------------------------------


※ 스택에 삽입하기 ※


  스택 삽입도 기존의 연결 리스트와 흡사하게 진행합니다. 다만 단방향이라서 top을 기준으로만 삽입해주면 됩니다.


----------------------------------------------------------------


int push(int data) {

NodePointer ptr;

ptr = (NodePointer) malloc(sizeof(Node));

// 컴퓨터에 남은 메모리가 없는 경우 

if(ptr == NULL) {

printf("메모리 할당에 실패했습니다.\n");

return -1;

}

ptr->data = data;

// 스택이 비어있는 경우 

if(top == NULL) {

ptr->next = NULL;

}

// 스택이 비어있지 않은 경우

else {

ptr->next = top;

}

// 새 노드를 최상단 노드로 설정합니다. 

top = ptr;

return 1;

}


----------------------------------------------------------------


※ 스택 정보 출력하기 ※


  top부터 출발해서 NULL을 만날 때까지 모든 원소를 출력해주기만 하면 됩니다.


----------------------------------------------------------------


void show() {

NodePointer ptr = top;

while(ptr != NULL) {

printf("%d\n", ptr->data);

ptr = ptr->next;

}

}


int main(void) {

push(5);

push(7);

push(3);

show();

return 0;

}


----------------------------------------------------------------


  실행 결과는 다음과 같습니다.




728x90
반응형

Comment +0

728x90
반응형

  이번 시간에는 이중 연결 리스트(Double Linked List)에 대해서 알아보도록 하겠습니다. 이중 연결 리스트는 말 그대로 모든 노드가 이전 노드와 다음 노드에 대한 정보를 모두 저장하고 있는 리스트를 의미합니다. 표현해보면 다음과 같이 표현할 수 있습니다.



※ 선언하기


------------------------------------------------------------


#include <stdio.h>

#include <stdlib.h>


typedef struct Node *NodePointer;

typedef struct Node {

int data;

NodePointer prev;

NodePointer next;

} Node;


NodePointer head, tail;


------------------------------------------------------------


※ 삽입 함수 ※


  삽입이 이루어질 때는 기본적으로 자신이 들어갈 위치를 찾습니다. 저는 data를 기준으로 오름차순 정렬이 이루어지도록 삽입 함수를 작성했습니다. 이 때 i라는 별도의 변수가 사용됩니다. 결과적으로 i는 삽입될 직전의 위치를 알려주는 역할을 수행합니다. 이후에 총 4번 링크를 수행해 새로운 변수를 삽입하게 됩니다. 그 형태는 다음과 같습니다.



------------------------------------------------------------


void insert(int data) {

NodePointer i, element;

i = head->next;

while(i->data <= data && i != tail)

i = i->next;

element = (NodePointer) malloc (sizeof(Node));

element->data = data;

i->prev->next = element;

element->prev = i->prev;

i->prev = element;

element->next = i;

}


------------------------------------------------------------


※ 출력하기 ※


  출력할 때는 head의 next부터 하나씩 tail에 도달하기 전까지 노드를 방문해 출력하면 됩니다.


------------------------------------------------------------


void show() {

NodePointer i;

i = head->next;

while(i != tail) {

printf("%d ", i->data);

i = i->next;

}

}


------------------------------------------------------------


※ 실제로 사용하기 ※


  초기 상태를 다음과 같이 설정해주어야 한다는 것만 잊지 않으시면 됩니다.



------------------------------------------------------------


int main(void) {

head = (NodePointer) malloc (sizeof(Node));

tail = (NodePointer) malloc (sizeof(Node));

head->next = tail;

head->prev = head;

tail->next = tail;

tail->prev = head;

insert(7);

insert(1);

insert(8);

show();

return 0;

}


------------------------------------------------------------


  실행 결과는 다음과 같습니다.



728x90
반응형

Comment +0

728x90
반응형

  연결 리스트(Linked List)포인터를 이용한 선형 구조로서 다양한 종류가 있습니다. 대표적인 것이 선형 리스트, 원형 리스트, 연결 스택, 연결 큐 등이 있습니다. 연결 리스트는 일반적으로 시험 문제로 출제가 될 때 실제 소스코드 구현과 관련한 문제가 출제된다는 점에서 포인터(Pointer)를 활용한 실질적인 구현 방법에 대해서 이해하고 있으셔야 합니다. 다만 이후에 트리(Tree) 구조 등과 관련한 개념에서는 실질적인 구현을 물어보지는 않고 그 동작 원리에 대해서만 자세히 물어본다는 특징이 있습니다.


  사실 연결 리스트는 단일 연결리스트만 확실히 이해해도 다른 것들은 무난하게 넘어가실 수 있습니다. 대표적인 단일 연결 리스트(Singly Linked List)의 예제에 대해서 알아보도록 합시다.


※ 삽입 함수 ※


-----------------------------------------------


struct Student {

int id; /* 학번 */

int score; /* 학생 성적 */

struct Student *next; 

};


-----------------------------------------------

  위와 같이 하나의 학생(Student)이라는 노드를 정의해봅시다. 이를 단일 연결리스트로 표현하면 다음과 같은 형태가 될 것입니다.



  삽입 함수는 매우 기본적인 로직을 따릅니다. 단순히 자신이 들어갈 위치까지 계속해서 넘어가다가 들어갈 위치를 찾으면 비로소 그 때 들어가면 됩니다. 기본적으로 사용자 정보들은 학번을 기준으로 오름차순으로 정렬되고, 동일한 학번은 입력되지 않는다고 했을 때 삽입(Insert) 함수는 다음과 같이 작성될 수 있습니다.


-----------------------------------------------


void insert(struct Student **head, int id, int score) {

struct Student *prevptr; // 삽입하려는 위치의 직전 노드 

struct Student *ptr; // 삽입하려는 위치의 노드

struct Student *element; // 삽입하려는 노드

element->id = id;

element->score = score;

element->next = NULL;

// 리스트가 비어있는 경우 

if((*head) == NULL) {

(*head) = element;

return;

// 리스트가 비어있지 않은 경우 

prevptr = NULL;

ptr = (*head);

while(ptr != NULL) {

// 들어갈 위치를 찾지 못한 경우 

if(ptr->id < id) {

prevptr = ptr;

ptr = ptr->next;

}

// 들어갈 위치를 찾은 경우 

else {

// 첫 번째 원소로 들어가는 경우 

if(prevptr == NULL) (*head) = element;

// 첫 번째 원소로 들어가지 않는 경우 

else prevptr->next = element;

element->next = ptr;

return;

}

}

// 마지막 원소로 들어가는 경우

ptr->next = element; 

}


-----------------------------------------------


※ 역체인 ※


  역체인(Reverse Chain)은 연결리스트를 뒤집는 함수입니다. 만약 1부터 4까지 데이터가 노드로 연결이 되어있다면 다음과 같이 4부터 1까지 데이터가 노드로 연결이 되도록 바꾸는 과정이 역체인 과정이라고 할 수 있습니다.



-----------------------------------------------


typedef struct Node *NodePointer;

typedef struct Node {

int data;

NodePointer next;

};


-----------------------------------------------


  위와 같이 노드가 선언이 되어있다고 했을 때 역체인 함수는 다음과 같이 구현할 수 있습니다.


-----------------------------------------------


void reverse(NodePointer *head) {

NodePointer one, two, three;

int cout = 0;

two = NULL;

one = three = *head;

while(three != NULL) {

three = three->next;

// 실질적으로 역체인이 수행되는 라인 

two->next = one; 

one = two;

two = three;

}

}


-----------------------------------------------

  처음 보았을 때는 어렵게 느껴질 수 있는데 간단히 생각해보면 다음과 같이 동작하는 겁니다. 연결되어있는 링크의 위치를 반대로 뒤집으려면 총 세 개의 변수가 필요한데 one, two, three 변수를 계속해서 오른쪽으로 이동시켜가며 역으로 연결해주는 거에요.





728x90
반응형

Comment +0

728x90
반응형

본 포스팅에는 오류가 있습니다. 시간날 때 수정하겠습니다.


  일반적으로 우리가 알고 있는 대수학의 표기법인 중위 표기법을 컴퓨터에게 계산하도록 만들고 싶으면 후위 표기법으로 변환한 뒤에 계산하는 과정이 필요합니다. 실제로 계산기 등이 내부적으로 수행하고 있는 방법이기도 합니다. 재미있는 점은 중위 표기법을 후위 표기법으로 바꿀 때는 오직 스택(Stack)만 있으면 됩니다. 스택을 적절히 활용하면 처리할 수 있다는 점이 매우 큰 특징입니다.


  컴퓨터가 수식을 계산하는 방법은 다음의 두 절차를 따르면 됩니다.


 ① 중위 표기법을 후위 표기법으로 변환하기


  중위 표기법을 후위 표기법으로 바꿀 때는 다음의 절차를 따르면 됩니다.


  1) 피연산자가 들어오면 바로 출력합니다.

  2) 연산자가 들어오면 자기보다 우선순위가 높거나 같은 것들을 빼고 자신을 스택에 담습니다.

  3) 여는 괄호 '('를 만나면 무조건 스택에 담습니다.

  4) 닫는 괄호 ')'를 만나면 '('를 만날 때까지 스택에서 출력합니다.


  한 번 중위 표기식 ( a + b - c ) * d * e을 위 공식에 따라서 후위 표기법으로 변환해봅시다.


  변환 결과: a b + c - d e * *


  숫자를 이용해 표현해봅시다. ( 5 + 6 - 7 ) * 1 * 5 이 경우도 다음과 같이 변환할 수 있습니다.


  변환 결과: 5 6 + 7 - 1 5 * *


  이러한 과정을 의사코드로 표현하면 다음과 같습니다.


------------------------------------------------------------------------------------------------


void translation(exp) {

while((token = getChar(exp)) != NULL) {

if(token == 피연산자) print(token);

else if(token == ')') {

while(stack[top] != '(') print(pop());

pop();

}

else {

while(getPriority(stack[top]) >= token) print(pop());

push(token);

}

}

while((token = getChar(exp)) != NULL) print(token);

}


------------------------------------------------------------------------------------------------

 ② 후위 표기법을 계산하기


  후위 표기법을 계산할 때는 다음의 절차를 따르면 됩니다.


  1) 피연산자를 만나면 스택에 담습니다.

  2) 연산자를 만나면 스택에서 두 개의 연산자를 꺼내서 연산한 뒤에 그 결과를 스택에 담습니다.

  3) 연산을 마치고 스택에 남아있는 하나의 피연산자가 연산 수행 결과입니다.


  후위 표기식: 5 6 + 7 - 1 5 * *

  계산 결과: 20


  이러한 과정을 의사코드로 표현하면 다음과 같습니다.


------------------------------------------------------------------------------------------------


void calculate(exp) {

int x, y, z;

while((token = getChar(exp)) != NULL) {

if(token == 피연산자) push(token);

else if(token == 연산자) {

x = pop();

y = pop();

z = y 연산자 x;

push(z); 

}

}

print(pop());

}


------------------------------------------------------------------------------------------------


728x90
반응형

Comment +5

728x90
반응형

 선형 구조와 수식 계산


  자료구조에서 선형 구조(Linear Structure)는 말 그대로 데이터를 선형적으로 표현하는 자료구조를 의미합니다. 선형구조에는 배열(Array), 스택(Stack), 큐(Queue), 연결 리스트(Linked List) 등이 포함됩니다. 스택은 일반적으로 수식 계산에 가장 많이 사용됩니다. 공무원 시험이나 대학원 시험 등 어떠한 시험을 치를 때에도 스택과 관련한 문제가 굉장히 많이 출제되므로 모든 선형 구조 중에서 스택은 꼭, 반드시 알고 있어야 합니다. 또한 추가적으로 스택과 큐가 함께 사용되는 구조를 데큐(Deque)라고 합니다.


  일반적으로 소프트웨어에서 수식을 계산할 때는 스택(Stack)을 사용합니다. 이는 컴퓨터의 내부적인 처리 방식과도 연관이 깊습니다. 스택에 대한 자세한 설명은 네이버 블로그 https://blog.naver.com/ndb796/221230937978에서 제가 이전에 정리한 바가 있습니다.


 표기 방식의 세 가지 종류


 ▶ 위 표기(Prefix)


  전위 표기란 연산자를 피연산자 앞에 표기하는 방법입니다.


  EX) * - + a b c * c a


  중위 표기(Infix)


  중위 표기란 연산자를 피연산자의 가운데에 표기하는 방법입니다. 일반적으로 대수학에서 사용되는 표기법입니다.


  EX) ( a + b - c ) * d * e


 ▶ 후위 표기(Postfix)


  후위 표기란 연산자를 피연산자의 뒤에 표기하는 방법입니다. 컴퓨터가 처리하기에 가장 적합한 표기법입니다.


  EX) a b + c - d e * *


  위 세 가지 표기법에서 예시로 든 수식은 사실 모두 동일한 수식입니다. 이를 가장 먼저 전위 표기법을 이진 트리로 표현함으로써 증명해보겠습니다. * - + a b c * c a는 다음과 같이 연산 우선순위를 설정할 수 있습니다.



  이제 이걸 토대로 바로 다음과 같이 이진 트리로 표현할 수 있습니다.



  이진 트리로 표현한 뒤부터는 전위 표기, 중위 표기, 후위 표기로 나타내는 것은 매우 쉽습니다. 전위 표기법으로 표현할 때는 바로 부모 노드를 출력하고, 왼쪽 노드 및 오른쪽 노드에 방문하면 됩니다. 중위 표기법으로 표현할 때는 왼쪽 노드, 부모 노드, 오른쪽 노드로 방문하면 됩니다. 마지막으로 후위 표기법은 왼쪽 노드, 오른쪽 노드, 부모 노드를 차례대로 방문하면 됩니다.


  또한 재미있는 점은 중위 표기법을 제외하고 전위 표기법 및 후위 표기법에서는 괄호가 들어가지 않습니다. 괄호 없이 처리할 수 있다는 점에서 컴퓨터가 처리하기에 있어서는 가장 편리하고 간단한 표기 방식이라고 할 수 있습니다.


 ▶ 중위 표기 및 후위 표기 변환기: https://www.mathblog.dk/tools/infix-postfix-converter/


  또한 이 사이트에서는 중위 표기와 후위 표기를 마음대로 변환할 수 있도록 해줍니다. 상당히 유용해요.






728x90
반응형

Comment +0

728x90
반응형

  지난 시간에는 Cygwin을 설치하는 방법에 대해 알아보았습니다. 하지만 실제로 Cygwin을 이용해서 C언어 개발을 진행하기 위해서는 g++을 포함한 다양한 패키지를 설치해야 합니다. 따라서 Cygwin에서 C언어 개발 테스트를 하는 방법을 소개하고자 합니다. 아마 기본적으로 Cygwin을 설치만 하셨다면 C언어 관련 라이브러리를 즉시 손쉽게 사용할 수는 없을 겁니다. 정말 기본적인 것들만 설치가 되기 때문입니다. 따라서 다음과 같이 Cygwin 설치 프로그램을 다시 실행하여 원하는 패키지를 선택해 설치하시는 것이 좋습니다.


※ Cygwin 패키지 설치하기 ※



  먼저 위와 같이 카테고리(Category) 영역에서 G++을 검색하셔서 개발 도구를 전체 설치 설정해주도록 합니다.



  이후에 VIM을 거색해서 전체 영역을 다 설치해주도록 합시다.



  이제 설치할 때 위와 같이 설치할 내역이 등장하게 됩니다.



  설치가 정상적으로 진행되는 것을 확인할 수 있습니다.



  설치 이후에는 마찬가지로 바탕화면에서 바로 실행할 수 있도록 합시다.


※ Cygwin 환경변수 설정하기 ※


  이후에 Cygwin 환경변수를 설정해주도록 합시다. '제어판' -> '시스템 및 보안' -> '시스템'에 접속하신 뒤에 '고급 시스템 설정'에 들어갑니다. 여기에서 우리 컴퓨터가 특정한 라이브러리를 쉽게 사용할 수 있도록 설정이 가능합니다.



  이후에 다음과 같이 환경 변수 설정을 해주면 되는데 '시스템 변수'에 들어가서 'Path'를 더블 클릭하여 새롭게 추가해주시면 됩니다.



  더블 클릭합니다.



  이후에 위와 같이 C 드라이브에 Cygwin이 설치된 경로의 bin 폴더를 넣으시면 됩니다.



  환경변수 설정이 끝난 이후에는 모든 창을 닫고 Cygwin 터미널을 여시고 gcc --version을 입력해서 C언어 컴파일러 설치 여부를 확인하시면 됩니다.


※ C++ 개발 테스트하기 ※


  C언어의 문법을 포함하고 있는 C++을 이용해 개발 환경 테스트를 해보도록 하겠습니다.


  Cygwin에서 vi test.cpp을 입력해서 test.cpp 소스코드를 작성해봅시다.



  위와 같이 입력하시면 됩니다.



#include <iostream>

#include <vector>


using namespace std;


int main(void) {

        vector<int> v;

        v.push_back(1);

        v.push_back(3);

        v.push_back(5);

        for(int i = 0; i < v.size(); i++) {

                cout << v[i] << ' ';

        }

}


  이제 위와 같이 간단하게 C++ 벡터 STL을 이용해 출력하도록 프로그램을 작성해봅시다. 참고로 vi 에디터에서 나오실 때는 ESC를 누르시고 :wq를 입력하셔서 저장 및 종료를 해주시면 됩니다.



  위와 같이 g++ test.cpp을 이용해 컴파일한 이후에 ./a.exe를 입력해 실행해봅시다.



  그럼 위와 같이 1 3 5가 정상적으로 출력됩니다.

728x90
반응형

Comment +0

728x90
반응형

  이번 시간에는 윈도우(Windows) 운영체제에서 C언어를 공부하시는 분들을 위해 Cygwin이라는 소프트웨어를 소개하고자 합니다. Cygwin은 윈도우 환경에서 리눅스 환경을 흉내내어 다양한 프로그래밍 실습을 해 볼 수 있도록 해줍니다. C 언어 및 C++을 텍스트 데이터로 열어서 편집하고 리눅스 언어로 컴파일을 하여 실행을 해 볼 수도 있습니다. 바로 한 번 Cygwin을 설치해보도록 합시다.


  ▶ 시그윈 다운로드 사이트 : http://www.cygwin.com/



  위와 같이 사이트에 접속한 이후에 시그윈 설치 부분에서 설치 파일을 다운로드 해주시면 됩니다.



  이후에 위와 같이 설치 프로그램이 실행되는 것을 알 수 있습니다.



  설치를 진행할 때는 인터넷을 통해 진행하시는 것이 간단하고 편할 겁니다.



  위와 같이 설치 경로를 선택한 뒤에 진행하시면 됩니다.




  인터넷 연결을 할 때는 기본 시스템 프록시 설정을 통해 진행하도록 합니다.



  이제 실제로 설치를 하기 위해서 다운로드를 받을 서버를 설정하시면 됩니다. 저는 아무 서버나 선택해서 다운로드를 진행했습니다. 시그윈 자체가 가벼운 프로그램은 아니기 때문에 어떤 것을 선택해도 약 5분 가량의 시간이 소요될 겁니다.



  이제 구체적으로 어떠한 패키지를 설치할 것인지 물어보는데 저는 전체 패키지를 다 선택하도록 하겠습니다.




  이후에 위와 같이 설치를 진행해주시면 됩니다.



  이렇게 설치가 완료되었습니다. 이제 윈도우에서 리눅스 환경을 즐기실 수 있게 되었습니다.

728x90
반응형

Comment +0

728x90
반응형

C언어 개발환경 구축하기

나동빈(안경잡이개발자)


비주얼 스튜디오란?


  비주얼 스튜디오(Visual Studio)는 마이크로소프트에서 개발한 통합 개발 환경(IDE)입니다. 비주얼 스튜디오가 지원하는 기능은 매우 강력하고 다양해서 비주얼 스튜디오 하나만 깔아도 사실상 윈도우 응용 프로그램은 어떠한 종류든지 다 만들 수 있을 정도입니다. 우리가 공부할 C언어 문법 및 활용에 대한 학습도 비주얼 스튜디오를 이용해 전혀 어려움 없이 모두 수행할 수 있습니다. (물론 기본적으로 비주얼 스튜디오는 단순한 프로그램보다는 복잡하고 거대한 프로그램 개발에 초점이 맞추어져 있어 C언어보다는 C++이나 C#에 더 유리한 개발환경입니다.)


  실제로 C++ 및 C#을 활용한 그래픽 유저 인터페이스(GUI) 프로그램을 개발할 때도 비주얼 스튜디오가 제일 많이 사용됩니다. 이름부터가 비주얼이니 말 다했습니다. 최근에는 정말 다양한 플랫폼을 지원해서 게임 개발, 그래픽 모듈 개발 등 많은 분야에서 활용이 되고 있습니다. 대학교에서도 단순히 C언어 문법을 공부할 때에도 가벼운 Dev C++, 코드블럭스를 이용하지 않고 굳이 무거운 비주얼 스튜디오를 설치하여 배울 정도니까요. 


  ▶ 비주얼 스튜디오 다운로드 사이트: https://www.visualstudio.com/ko/downloads/



커뮤니티 버전을 다운로드 하시면 용량은 꽤 크지만 성공적으로 다운로드가 진행될 겁니다.



  저는 이전에 설치한 경험이 있기 때문에 위와 같이 나오는 것을 알 수 있습니다. 위와 같이 설치된 이후에 Visual Studio를 실행했을 때 성공적으로 실행 화면까지 나오면 정상입니다.




728x90
반응형

Comment +0

728x90
반응형

C언어의 개요

나동빈(안경잡이개발자)


C언어의 역사


C언어는 유닉스(UNIX) 운영체제를 만들기 위해 처음으로 개발되었습니다. C언어의 창시자는 미국 Bell 연구소의 데니스 리치(Dnnis Ritchie)이며 1978년에 <The C Programming Language>라는 책을 출간했습니다. 이후에 1983년 ANSI 표준 C가 발표되면서 그 구체적인 틀이 잡히게 되었습니다. 이러한 C언어는 최근에 가장 많이 사용되고 있는 Java, C# 등 고급 언어의 원형입니다. 특히 C언어의 문법을 포함하면서 다양한 라이브러리 및 객체 지향 기술을 지원하는 C++도 매력적인 언어 중 하나입니다.


C언어의 개념


프로그램(Program)컴퓨터가 처리할 작업 처리 절차를 의미하며 프로그래밍이란 프로그램을 만드는 행위입니다. 그러한 의미에서 프로그래밍 언어컴퓨터와 의사소통하기 위해 사용하는 언어라고 할 수 있습니다. 프로그래밍 언어로 가장 대표적인 것이 C언어이며 처음 프로그래밍을 입문할 때 가장 많이 접하는 언어이기도 합니다. 더불어 실무에서도 굉장히 많이 사용됩니다. (특히 나중에 시스템 해킹이나 게임 해킹 등을 공부하실 때 C를 모르면 아무것도 분석할 수 없습니다. 알고리즘 대회도 C++이 가장 많이 사용된다는 점을 기억하세요.)


C언어의 특징


1. 다양한 운영체제의 기반이 되는 언어이다.

  → 다시 말해 C를 할 수 있으면 운영체제를 만들 수도 있습니다.


2. 구조적 프로그래밍 언어로 모듈식 구현이 용이하다.

  → 그렇다면 C언어로 객체 지향 프로그래밍을 못 할까요? 원리적으로 불가능한 것은 아닙니다. 구조적 프로그래밍에 적합하다는 것 뿐이지 C언어로 객체 지향 프로그래밍 언어 자체를 개발할만큼 강력합니다.


3. 함수의 집합으로 구성된 함수형 언어입니다.

  → C 프로그램은 main() 함수부터 시작해 다양한 함수를 반복적으로 불러와 실행하고 종료됩니다.


4. 시스템간 호환 및 이식성이 좋다.

  → C언어는 세계적으로 컴퓨터 시스템의 주축이므로 당연한 소리겠지요?


5. 동적메모리 관리 및 하드웨어 제어에 유리하다.

  → C언어는 컴퓨터 메모리에 직접 접근이 가능한 강력한 언어입니다.


6. 고급 및 저급 언어간 인터페이스가 용이하다.

  → 나중에 리버싱 및 보안을 공부하실 때 어셈블리어를 뜯어보시고 이해해보세요.


7. 비트 및 증감연산자 등 풍부한 연산자를 지원한다.

  → 덕분에 비트마스크 기법 및 다양한 숏코딩이 가능합니다.

728x90
반응형

Comment +0