[루비 사용자 가이드] 간단한 예제

루비/레일스 프로그래밍/루비 사용자 가이드 2007.04.27 09:33

팩토리얼(factorial)을 계산하는 프로그램을 짜 봅시다. 수학적으로 n 팩토리얼은 다음과 같이 정의되지요:

n! = 1                (n==0일 떄)
   = n * (n-1)!       (다른 경우)

루비에서는 다음과 같이 쓸 수 있습니다:

def fact(n)
  if n == 0
    1
  else
    n * fact(n-1)
  end
end

end가 반복되는걸 보실 수 있을겁니다. 루비는 이 때문에 "알골(Algol)하고 유사"하다고 일컬어집니다(실제로는 루비 문법은 에펠(Eiffel)이라는 언어를 많이 닯았습니다). 여러분은 또 return 명령이 없다는 사실을 알 수 있습니다. 루비 함수는 함수 내부에서 가장 마지막에 계산된 식의 값을 반환합니다. 그래서 루비가 return을 제공하기는 하지만 프로그램 작성시 굳이 사용하지는 않습니다.

작성한 팩토리얼 함수를 한번 돌려봅시다. 한 줄만 더 입력하면 동작하는 프로그램으로 만들 수 있습니다:

# 팩토리얼을 계산 하는 프로그램
# fact.rb라는 이름으로 저장하세요.

def fact(n)
  if n == 0
    1
  else
    n * fact(n-1)
  end
end

puts fact(ARGV[0].to_i)

여기서 ARGV는 커맨드라인 인자를 저장하고 있는 배열입니다. 그리고, to_i는 스트링을 정수로 변환합니다.

% ruby fact.rb 1
1
% ruby fact.rb 5
120

40을 인자로 넘기면 잘 동작할까요? 보통 계산기는 오버플로우가 나는 큰 수일텐데요...

% ruby fact.rb 40
815915283247897734345611269596115894272000000000

잘 동작하네요. 실제로 루비는 컴퓨터 메모리가 허락하는 한 모든 정수를 처리할 수 있습니다. 따라서 400!도 계산 가능합니다:

% ruby fact.rb 400
64034522846623895262347970319503005850702583026002959458684
44594280239716918683143627847864746326467629435057503585681
08482981628835174352289619886468029979373416541508381624264
61942352307046244325015114448670890662773914918117331955996
44070954967134529047702032243491121079759328079510154537266
72516278778900093497637657103263503315339653498683868313393
52024373788157786791506311858702618270169819740062983025308
59129834616227230455833952075961150530223608681043329725519
48526744322324386699484224042325998055516106359423769613992
31917134063858996537970147827206606320217379472010321356624
61380907794230459736069956759583609615871512991382228657857
95493616176544804532220078258184008484364155912294542753848
03558374518022675900061399560145595206127211192918105032491
00800000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000

한 눈에 이 값이 제대로 된 것인지 체크할 수는 없지만, 올바른 답임에 틀림 없습니다. :-)

입력/계산(Input-evaluation) 루프

여러분이 루비를 인자 없이 실행하면, 표준 입력에서 명령을 읽어들여서 모든 입력이 끝난 후 그 명령을 실행합니다:

% ruby
puts "hello world"
puts "good-bye world"
^D
hello world
good-bye world

위에서 ^D는 컨트롤-D를 의미합니다. 그것은 유닉스(Unix)계열의 OS에서 입력의 끝(end-of-input)을 시스템에 입력하는 편리한 방법입니다. 도스(DOS)나 윈도(Windows)에서는 F6^Z를 살포시 눌러주시면 됩니다.

(역주: 이 단락에서 설명하는 eval.rb 대신 irb를 사용해도 됩니다.) 루비에는 eval.rb라는 프로그램도 포함되어 있습니다. 그 프로그램은 인터액티브 환경에서 여러분이 명령을 키보드로 입력하고, 그것을 실행한 결과를 여러분에게 보여주도록 되어 있습니다. 이 가이드에서는 그 환경을 많이 사용하게 될 겁니다.

만약 여러분이 ANSI 기능을 지원하는 터미널을 사용한다면(거의 대부분의 유닉스 시스템이나 ANSI.SYS이나 ANSI.COM을 실행시킨 도스환경이 이에 해당됩니다; 윈도 XP는 그렇게 하는게 거의 불가능하지요. 하지만 적당한 터미널 프로그램을 구하면 됩니다.) 향상된 eval.rb를 사용해서 인덴테이션 지원과 경고사항 보고, 그리고 컬러 하이라이팅 기능을 사용할 수 있을겁니다. 여기 짧은 eval.rb 세션을 하나 보여드립니다:

% ruby eval.rb
ruby> puts "Hello, world."
Hello, world.
   nil
ruby> exit

hello world가 code>puts를 사용해 출력됩니다. 다음 줄에 나오는 nil은 가장 마지막에 계산된 식의 값입니다. 루비는 명령문(statements)식(expressions)의 구분이 없기 때문에 코드를 계산한다는 말과 코드를 실행한다는 말이 동일한 말입니다. 여기서 nilputs가 의미있는 값을 반환하지 않는다는 것을 의미합니다. 우리는 이 인터프리터를 exit라는 명령을 입력해서 종료할 수 있습니다(물론 ^D도 여전히 동작합니다).

이 가이드 안에서, "ruby>"는 eval.rb프로그램의 입력 프럼프트를 나타냅니다.



Trackbacks 0 : Comments 0

Write a comment