ncurses 03 – Hello World!

어떠한 환경이던 일단 기본적으로 했던 것이 바로 Hello World입니다. ncurses에서도 마찬가지인데요, 어떻게 구성되어 있는지 우선 코드를 작성하여 보여드리겠습니다.

스크린샷 2017-10-06 오후 4.24.22.png

프로그램 구조는 C와 동일합니다. 아니, C 코드 그 자체입니다. 근데 보면 뭔가 다른 코드들이 막 있습니다. 이게 어떤 함수들을 이용한 것인지 설명하겠습니다.

우선 stdio를 삽입 안하고 바로 ncurses를 삽입하였습니다. 그렇습니다. 화면에만 뿌리는 작업, 기본적인 ncurses 작업에는 stdio는 필요하지 않습니다. printf 함수는 stdio에 정의되어 있던 함수이기 때문에 우리는 첨에 hello world를 C에서 출력할 때에는 그걸 그대로 이용했습니다만, ncurses에서는 ncurses용 함수를 이용했기 때문에 안쓴 것이죠.

이제 함수들을 하나 하나 살펴보겠습니다. 단순한 설명을 우선적으로 진행합니다.

  • initscr: 화면을 초기화 하는 것입니다. 터미널의 쉘 환경 화면에서 새로 그리기 위해 화면을 초기화 합니다. 그리고 빈 화면을 출력합니다.
  • printw: print window. 화면에 프린트 하는 함수입니다. 사용법은 printf와 비슷합니다.
  • refresh: 화면을 리프래시 해준다. 이 때에 화면에 printw에 있는 문자열이 출력된다. (중요!)
  • getch: 사용자에게 문자 하나를 입력받을 준비를 한다.
  • endwin: ncurses 윈도우를 종료한다.

함수들이 어떤 기능을 하는지를 확인하니 윈도우를 그리는 과정을 알 수 있겠죠? 화면 초기화 -> 데이터 입력 -> 화면 그리기 -> 화면 종료 이런 식으로 간단하게 보여줬습니다. 단, getch로 사용자 입력을 기다리게 해서 화면이 지속적으로 떠 있도록 해줬던 것이 차이점입니다.

여기서 지금 중요한 이야기를 하나 진행합니다. 바로 refresh에 대한 내용인데, 이게 정말 중요합니다. 왜 refresh, 즉 새로 그리기를 해야지만 다시 보여줄 수 있는 것인지?

터미널에서 보여주는 화면은 우리가 메모리에서 저장된 내용을 보여주게 됩니다. 그런데, 메모리에 저장된 내용이 단순한 문자열 한 줄인 경우에는 그냥 기존처럼 출력하게 되지만, 윈도우 화면으로 만들려고 한다면 윈도우 화면을 수동적으로 만들어서 보여줄 수 있어야 합니다. 그런 윈도우 화면을 자료구조 형태로 만들어서 메모리에 적재하는 과정이 바로 initscr 함수에서 진행합니다. 그리고 해당되는 빈 자료구조 중에 기본적인 윈도우의 역할을 하는 자료구조는 stdscr이라는 내부 자료구조가 있어서, 이 자료구조가 초기화되고 뿌려진 상태가 바로 아무것도 없는 검은 화면이 되는 것입니다.

여기에 이제 printw로 문자열을 화면 출력용 자료구조에 삽입하여도 일단 출력된 자료구조와 현재 메모리에 저장되어 있는 자료구조와는 다른 데이터를 갖게 되는 것이죠. 이 것을 refresh 함수가 다시 읽어오게 됩니다. 다시 읽어온 메모리 덤프 데이터가 그대로 출력되어야지만 비로소 화면에 출력이 되는 것인데, 이 과정 때문에 refresh 함수가 반드시 필요합니다.

처음에 ncurses를 개발하다보면 자꾸 refresh를 까먹을 수 있는데, 화면이 변경되어 새로 그리게 되면 반드시 쓰게 되는 함수라고 생각하고 있어야 합니다.

실제로 실행을 하게 되면 어떻게 되는지 보여드리겠습니다. 저장하고 나서 컴파일을 진행합니다.

그리고 컴파일 결과물인 hello를 직접 실행해 보겠습니다.

빈 화면에 kyuling: hello world라고 떠 있습니다. 왼쪽 상단에 위치하는데, 왼쪽 상단 좌표를 0,0으로 설정하고 출력하기 때문에 그쪽부터 출력되는 것입니다. 그 뒤에 커서는 입력 대기를 하는 것이고요. 여기서 아무 키나 누르게 되면 다시 원래 화면으로 돌아갑니다.

다시 이전 화면으로 돌아갑니다. ncurses 내부를 파해치는 것이 아니라 더 이상의 자세한 설명은 생략하겠습니다만, 프로그래밍을 하다보면 “아, 이거 그거다.”라고 금방 이해하고 알 수 있는 날이 올 것입니다. 나중에 다세히 쓰기도 하겠지만요.

hello world를 출력해보면서 간단한 구조를 살펴봤습니다. 이제 조금씩 더 다뤄가면서 그래픽 프로그래밍 같아 보이는 작업들을 보여주도록 하겠습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.