본문 바로가기
카테고리 없음

구구단 프로그램 만들기2

by 경자꿈사 2024. 7. 4.

오늘은 키보드를 통해 입력 받은 정수에 대해 구구단을 실행해 보여주도록 프로그램을 업그레이드 해보자.

아래와 같이 irb 창에서 STDIN.gets 을 입력하고 엔터를 누르면 다시 입력을 기다리는 커서가 깜빡이는 걸 볼 수 있는데, 원하는 글자들을 입력하고 엔터를 눌러보자. 그러면 입력한 글자들을 문자열 형태의 결과 값으로 돌려주는 걸 볼 수 있다. 만약 한글을 입력했고 한글 그대로 결과 값이 나오지 않는다면 일단 영어나 숫자로 테스트해 보길 바란다.

>> STDIN.gets
12345
=> "12345\n"
>>

STDIN(Standard Input) 은 Ruby 에서 표준 입력 처리를 위해 기본으로 제공하는 객체로서 IO 클래스의 인스턴스이다.

사용자로부터 입력을 받을 때 사용하는데, 앞의 경우처럼 일반적으로 키보드 입력을 받는 데 사용한다. 

참고로 IO 는 'Input Output' 을 gets 는 'get string' 을 뜻한다.

 

이제 사용자 입력을 다룰 수 있게 되었으니 우리가 원하는 프로그램을 다음과 같이 작성해 볼 수 있다.

def gugudan(num)
  for i in 1..9
    puts "#{num} x #{i} = #{num * i}"
  end
end

input = STDIN.gets

gugudan(input.to_i)

 

구구단은 정수와 정수의 곱셈을 결과로 보여줘야 하는데 STDIN.gets 으로 입력을 받게되면 숫자를 입력해도 문자열 형태로 돌려주기 때문에 gugudan 메서드에 인수로 넘겨 주기 전에 해당 문자열을 정수로 변환해 줘야 한다.

to_i 가 바로 그 기능을 해주는 메서드이다. (i 는 integer를 뜻한다)

아래처럼 to_i 메서드를 여러 경우에 대해 테스트해 보기 바란다.

>> 123.to_i
=> 123
>> 123.9.to_i
=> 123
>> "123".to_i
=> 123
>> "abc".to_i
=> 0
>>

그런데 위의 예제 코드는 아직 뭔가 좀 부족하다. 입력을 받아 구구단을 출력하는 일을 여러 번 원하는 만큼 반복할 수가 없다. 그렇다면 원하는 만큼 반복하려면 어떻게 해야 할까? 우리는 이미 반복문을 사용해봤다!

다음처럼 다시 코드를 수정해보자.

def gugudan(num)
  for i in 1..9
    puts "#{num} x #{i} = #{num * i}"
  end
end

while true
  input = STDIN.gets
  break if input == "\n"
  
  gugudan(input.to_i)
end

 

프로그램을 무한정 실행할 수는 없으므로 원하는 때 반복문을 빠져나올 수 있도록 break if input == "\n" 라는 코드도 함께 추가했다.

irb 에서 STDIN.gets 를 테스트해 보면 아무것도 입력하지 않고 그냥 엔터를 누르면 반환 값이 "\n" 으로 나오는 게 보일텐데 "\n" ('New line' 또는 '개행문자' 라고 읽으면 된다) 이 바로 엔터키를 나타내는 특수 문자이다. 정확히 말하면 '이스케이프 문자' 라고 하는데, 왜 '이스케이프' 냐면 문자 그대로의 의미에서 '탈출' 시켜 다른 의미를 갖게 하기 때문이다.

Ruby에서 정해놓은 몇 가지 특정 문자 앞에 백슬래시('\')를 붙여 이스케이프 문자를 표현할 수 있다.

 

결국 break if input == "\n" 는 사용자가 아무것도 입력하지 않고 바로 엔터키를 눌렀다면 반복문을 끝내라는 의미이다.

이 밖에 구구단이 의미하는 대로 1단에서 9단까지만 허용하는 등 프로그램의 완성도를 높이기 위해서는 할 일이 아직 남아 있다. 여러분이 연습 삼아 직접 해 보길 바란다.