사용자와 대화하기

우리는 무엇을 다룰 것인가?
사용자에게 데이타를 입력하도록 요청하는 법
그리고 일단 입력된 데이타를 읽는 법
우리는 수치 그리고 문자열에 기초한 데이타를 읽는 법을 보여 줄 것이다.
또한 우리는 명령어 라인의 인수로 입력된 데이타를 읽는 법을 살펴 볼 것이다.

지금까지 우리의 프로그램은 정적인 데이타만을 다루어 왔다. 필요하다면, 우리는 그것을 프로그램이 실행되기 전에 조사할 수 있고 그런식으로 프로그램을 적절하게 수정할 수 있다. 대부분의 프로그램은 그렇지 않다. 대부분의 프로그램은 사용자가 주도해주기를 예상하며, 적어도 무슨파일이 열리고, 어떤 파일을 편집할 것인가 등등까지는 지시해 주어야 한다. 또 다른 프로그램들은 사용자에게 상세한 데이타를 요구한다. 우리가 더 이상 나아가기 전에 어떻게 그것이 가능한지 알아보자.

>>> print raw_input("Type something: ")

여러분이 보듯이 raw_input 은 단순히 주어진 프롬프트를 나타내고 사용자가 반응하여 타이프한 어떤 것이라도 사로잡는다. 그리고 나서 Print는 그 반응을 출력한다. 우리는 대신에 그것을 변수에 할당할 수 있다:

resp = raw_input("What's your name? ")
print "Hi, %s, nice to meet you" % resp

raw_input input이라고 부르는 사촌이 있다. 차이점은 raw_input 은 사용자가 타이프한 문자를 수집하고 그것을 문자열로 나타내는 반면에, input은 그것들을 모아서 숫자로 변형하려고 한다. 예를 들어 사용자가 '1','2','3' 이라고 타이프하면 input 은 그것을 3개의 문자로 읽어서 숫자 123으로 변형할 것이다.

input을 사용하여 어떤 곱셈표가 출력될지를 결정해 보자:

multiplier = input("Which multiplier do you want? Pick a number ")
for j in range(1,13):
   print "%d x %d = %d" % (j, multiplier, j * multiplier)

BASIC INPUT

베이직에서 INPUT 서술문은 사용자로부터 입력을 다음과 같이 읽어 들인다:

INPUT "What multiplier do you want, pick a number ";M
FOR J = 1 to 12
    PRINT M "x" J "= " M*J
NEXT J

여러분이 보듯이 여러분이 그 변수를 마지막에 놓는다는 점만 빼고는 이것은 파이썬과 대단히 비슷하다. 또한 베이직은 INPUT 숫자와 문자열 모두에 사용한다. 베이직의 INPUT 서술문에는 보통 몇개의 추가적인 사양이 있다. 여러분만의 특별한 목적을 위하여 여러분은 문서를 참조하여야 한다.

Tcl에서 입력을 읽기

티클은 자신만의 입력 메카니즘을 가지고 있다, 그것은 (표준입력 그리고 표준출력파일을 포함하여) 파일들과 gets라고 부르는 명령어에 기초한다. 이것은 특별한 파일로부터 입력을 읽는다. 그 파일은 우리의 경우에는 stdin가 될 것이다.
[ 주의: ]이 프로그램은 표준적인 tclsh80 혹은 wish80 프롬프트에서는 작동하지 않을 것이다. 대신에 여러분은 이것을 (예를 들어 input.tcl) 파일로 타이프해 넣을 필요가 있다. 그리고 다음과 같은 명령어 프롬프트에서 그것을 실행할 필요가 있다:

    C:\PROJECTS\Tcl>tclsh80 input.tcl

우리의 프로그램의 티클 버전은 다음과 같을 것이다:

puts -nonewline stdout "What multiplier do you want? "
flush stdout
set mult [gets stdin]
for {set j 1} {$j <= 12} {incr j} {
    puts [format " %d x %d = %d" $j $mult [expr $mult * $j] ]
    }

puts에 대한 -nonewline선택사항은 커서가 프롬프트 메시지를 출력한 후에 다음라인으로 단순히 이동하지 못하도록 한다. flushstdout 가 그 내용을 즉시 출력하도록 강제하여 스크린에 확실하게 나오도록 한다. for 회돌이는 우리가 회돌이의 섹션에서 본 버전과 거의 동일하다.

명령어 라인 매개변수

다른 형태의 입력은 명령어 라인으로부터 입력된다. 예를 들어 여러분이 텍스트 편집기를 다음과 같이 실행시키면:

EDIT Foo.txt

어떻게 그 편집기는 그 파일이름을 읽는가?

대부분의 언어에서 시스템은 명령어 라인의 단어들을 담고 있는 문자열의 리스트 혹은 배열을 제공한다. 그리하여 첫 번째 요소는 명령어 자체를 담을 것이며, 두 번째 요소는 첫 번째 인수, 등등을 담을 것이다. 보통 어떤 종류의 마법의 변수가 있어서 리스트에 있는 요소의 개수를 가지고 있다.

파이썬에서 그 리스트는 sys모듈이 가지고 있으며 argv ('argument values'의 약칭)라고 불리운다. 우리는 그 요소들을 지표화를 사용하거나 혹은 리스트를 순회함으로써 추출할 수 있다, 다음과 같이:

import sys
for item in sys.argv:
    print item

print "the first argument was:", sys.argv[1]

이것은 여러분이 파일로(예를 들어 args.py)로 입력하고 그것을 운영체제의 프롬프트에서 다음과 같이 실행할 때만이 실행된다는 것을 주목하라:

C:\Python\PROJECTS> python args.py 1 23 fred
args.py
1
23
fred
thr first argument was: 1
C:\PYTHON\PROJECTS>

Tcl의 명령어 라인

티클은 3개의 변수로 된 비슷한 구조를 가진다:

  • argv0 - 명령어 이름,
  • argv - 명령어 라인에 있는 나머지를 담고 있는 문자열
  • argc - 그리고 argv 에 있는 단어의 개수를 담는다

    티클에서 명령어 라인 인수에 접근하는 예제는 다음과 같다:

    puts "the command was: $argv0"
    puts "The first argument was:  [lindex $argv 0]"
    

    또 다시 여러분은 이것을 스크립트로 운영체제의 명령어 프롬프트에서 실행 할 필요가 있다. 그리고 약간의 샘플 인수를 제공해야할 필요가 있다.

    그리고 BASIC

    티클은 'input'과 동등한 것을 가지고 있지 않은 것 같아 보이며, 베이직은 argv와 동등한 것을 가지고 있지 않은 것 같이 보인다. 운영체제의 능력을 사용하여 그것들에게 접근하는 것이 가능하다고 할지라도 - 예를 들어 그것들은 도스에서 환경 변수에 저장된다. 그래서 여러분은 GETENV 함수를 사용할 수 있다. 그렇지만 그것은 이 강좌를 너무 넘어서는 것이다 그리고 나는 베이직 프로그램에서 여러분이 사용자에게 대화적으로 그 값을 요구하기를 추천한다.

    그것이 실제로 이 강좌에서 우리가 사용자 입력으로 진행할 것이다. 그것은 대단히 기초적이지만 여러분은 그것으로 유용한 프로그램을 작성할 수 있다. 유닉스 혹은 피씨의 초창기에는 그것이 오직 여러분이 가질 수 있는 유일한 대화방식이었다. 파이썬, 티클, 그리고 베이직은 모두 ('눈에 보이는' 실현으로) 윈도우, 대화상자 등등의 복잡한 GUI 프로그램을 작성할 수 있다... 그러나 그것은 이강좌를 약간 넘어서는 것이다. 사례 연구가 파이썬에서 GUI를 통하여 입력을 받는 짧막한 예제를 제공한다고 말했지만 우리는 그것이 어떻게 작동하는지에 관해서는 더 이상 설명하지 않을 것이다. 여러분이 핵심들위에 훌륭한 기초를 획득한다면, 그것을 하기 위한 웹 지침서들이 사용가능하다. 나는 그들 중 약간을 참조 페이지에서 나열할 것이다.

    기억해야할 요점
    • 숫자를 읽기 위해서는 input 을 사용하라, 문자/문자열을 읽기 위해서는 raw_input 을 사용하라.
    • inputraw_input 모두 사용자에게 프롬프트상태를 문자열을 출력하여 보여줄 수 있다.
    • BASIC의 INPUT 명령어는 어떠한 종류의 데이타에도 사용할 수 있다.
    • 명령어 라인 매개변수는 파이썬에서 sys 모듈로 부터 수입된 argv 리스트로부터 획득될 수 있으며, 거기에서 첫 번째 항목은 그 프로그램의 이름이다.
    • 티클은 비슷하게 이름지어진 argv 리스트를 사용하여 명령어 라인 데이타를 획득한다, 그러나 그 프로그램의 이름은 별개의 argv0 에 존재한다.
    • 그 모듈이 명령어 라인으로 부터 실행된다면( 또는 윈도우에서는 더블 클릭되면), __name__ 변수는 "__main__" 에 설정될 것이다.

    Previous  Next  Contents


    이 페이지에 대하여 질문이나 제안사항이 있으면 다음 주소로 나에게 전자메일을 보내라: agauld@crosswinds.net