오늘은 '데이터 정렬해서 출력하기' 글에서 만든 프로그램을 common_lib 에 넣어서 편하게 가져다 사용할 수 있게 만들어 보겠다.
그리고 지난 글에서 얘기한 대로 특정 데이터를 원하는 색으로 출력하는 것도 해보겠다.
우선 아래 코드와 같이 Utils 모듈을 하나 만들고 그 안에 모듈 메서드 'print_table' 을 정의하자.
'print_table' 메서드의 내용은 지난번에 만든 최종 코드를 그대로 사용하면 된다. 다만 출력할 헤더 정보와 데이터가 들어 있는 data 배열은 파라미터로 선언해 주자.
module Utils
def self.print_table(data)
data = data.map do |row|
row.map do |col|
if col.is_a?(String)
col.encode("CP949")
else
col.to_s
end
end
end
data.each_with_index do |row, i|
if i == 0
row.unshift("#NO")
else
row.unshift(i.to_s)
end
end
col_widths = data.transpose.map { |cols| cols.map { |col| col.bytesize }.max }
c_del = " | "
l_del = "| "
r_del = " |"
data = data.map do |row|
row.map.with_index { |col, i| col.ljust(col_widths[i] + (col.size - col.bytesize)) }.join(c_del)
end
data = data.map { |str| "#{l_del}#{str}#{r_del}" }
tot_width = col_widths.sum + (c_del.length * (col_widths.size - 1)) + l_del.length + r_del.length
line = "-" * tot_width
puts line
data.each_with_index do |str, i|
puts str
puts line if i == 0
end
puts line
end
end
이제 이 코드를 D:/blog/ruby/common_lib 폴더 아래 utils 폴더를 하나 만들고 그 안에 print_table.rb 파일로 저장하자.
그리고 Utils 모듈의 print_table 메서드를 테스트해 보기 위해 D:/blog/ruby/string_just 폴더 아래 test_utils.rb 파일에 아래 코드를 작성한 후 실행해 보자.
이전 글에서 마지막에 실행했던 것과 동일한 결과가 나올 것이다.
$LOAD_PATH.unshift("D:/blog/ruby/common_lib")
require 'utils/print_table'
data = [["종목명", "구매단가", "현재가"],
["삼성전자", "77,500", "74,300"],
["현대차", "245,000", "246,000"]]
Utils.print_table(data)
그러면 이제 출력되는 내용 중에 원하는 값에 색을 입힐 수 있는 옵션을 인수로 줄 수 있게 print_table 메서드를 수정해 볼 차례인데, 먼저 어떻게 하면 텍스트를 특정 색으로 화면에 출력할 수 있는지 알아보자.
루비에서는 특정 기능을 담은 코드와 관련 문서 등을 gem 이라고 부르는 패키지 형태를 통해 쉽게 배포하고 공유할 수 있는데, 우리가 지금 필요한 색상 출력 기능도 gem 을 통해 쉽게 가져다 사용할 수 있다.
웹브라우저를 열어 주소창에 rubygems.org 를 입력하자. 그러면 아래와 같은 사이트가 보일텐데, 이 사이트는 루비 gem을 위한 공식 저장소로서 이곳에 자신이 만든 gem을 배포하여 다른 개발자들과 공유할 수도 있고 지금 우리처럼 필요한 gem을 검색하여 사용할 수도 있다.
검색창에 'rainbow' 를 입력해서 검색해 보자. 그러면 gem 이름에 'rainbow' 가 포함된 여러 gem들이 보이는데 우리가 사용할 gem은 젤 위에 있는 rainbow gem이다.
rainbow 를 클릭하면 해당 gem에 대한 설명이 있는 메인 페이지가 나온다.
오늘 날짜 기준으로 전체 다운로드 수는 4억 5천만 회가 넘는다. 당연히 같은 기능을 제공하는 gem이라면 다운로드 수가 많은 gem을 선택하는 것이 좋다.
우측의 Homepage 나 Documentation 링크를 클릭하면 rainbow gem의 설치 및 예제 코드 등 자세한 내용을 볼 수 있다.
우리가 사용하려고 하는 gem 의 이름을 알고 있으면 이런식으로 gem 공식 사이트에서 바로 찾을 수 있지만 만약 gem의 이름을 모른다면 먼저 구글링이 필요하다.
나도 구글에서 'ruby color text' 등으로 검색을 해서 rainbow gem 의 존재를 알게 되었다.
또 다른 사이트로는 ruby-toolbox.com 이 있는데 여기서는 gem 검색을 카테고리별로 좀 더 쉽게 할 수가 있다.
검색창에 'color' 를 입력하면 단순히 gem 이름에 'color'가 포함된 걸 보여주는 게 아니라 카테고리 중에 검색어랑 관련이 있는 카테고리들과 해당 카테고리에 속한 대표적인 gem 몇 개를 보여주는 것 같다. 카테고리 이름을 보면 우리가 필요한 gem들은 'Terminal Coloring'이라는 카테고리에 속해 있는 것 같다.
'Terminal Coloring' 링크를 클릭해 들어 가면 막대 그래프와 함께 대표적인 gem들이 몇 개가 보이는데, 'colorize'라는 gem도 꽤 사용이 되는 것 같아 보인다.
필요한 gem을 검색하는 방법은 어느 정도 설명했으니, 이제 rainbow gem을 설치해 보자.
gem을 설치하는 방법은 너무나도 간단하다. 그냥 아래 그림처럼 cmd 창을 열고 명령 프롬프트에 'gem install rainbow' 을 입력하고 엔터를 누르면 끝이다.
rainbow gem 자체 소스 파일뿐만 아니라 필요하다면 rainbow gem 소스 안에서 사용하는 다른 gem 들까지도 알아서 설치해준다.
이제 irb 창을 열어 아래 그림처럼 rainbow gem을 로드한 후 직접 테스트를 해 보자.
'빨강'이나 '노랑' 등 원하는 색깔로 텍스트를 출력할 수 있고 배경색을 지정하는 것도 가능하다. 그리고 밑줄도 표시할 수 있고 텍스트 색상과 배경을 동시에 주는 것도 전혀 어렵지 않다.
rainbow gem 에서 지원하는 모든 색깔의 종류나 기타 다른 기능들이 궁금하다면 앞에서 봤던 Homepage 나 Documentation 페이지를 참고하길 바란다.
그런데 앞의 그림에서 Rainbow.class 의 결괏값을 보면 Module로 나오는데 그 아래 코드들을 보면 Rainbow를 마치 메서드처럼 사용하고 있다.
실제 Rainbow 는 모듈이면서 메서드이기도 하다. 아래 그림처럼 모듈 이름과 동일하게 메서드 이름을 만들고 모듈을 프로그램 최상위에서 include 하면 해당 메서드를 바로 호출할 수 있다. 이때 인수도 없고 괄호도 없으면 모듈로 인식한다.
루비 프로그램은 'main' 이란 이름의 Object 클래스의 객체를 최상위 레벨로 하여 실행이 되는데,
이때 최상위 레벨에서 어떤 모듈을 include 하면 마치 Object 클래스에서 직접 해당 모듈을 include 한 것처럼 동작한다.
따라서 Object 클래스의 객체인 'main' 역시 include 를 통해 믹스인된 메서드를 호출할 수 있게 되는 것이다.
아래 그림을 보면 irb 에서 self 를 입력하면 'main' 이 출력되는 걸 볼 수 있고 self.class 를 실행하면 Object 클래스라고 나온다. 그리고 Foo 모듈을 include 하기 전후에 각각 self.class.ancestors 를 호출해 보면 include 한 후에 Foo모듈이 Object 클래스와 Kernel 모듈 사이에 포함된 걸 볼 수 있다. 또한 메서드 목록에서도 Foo 메서드를 찾을 수 있다.
클래스 또는 모듈에 대해 자세히 알고 싶다면 내가 쓴 '객체와 클래스' 와 '클래스와 모듈' 시리즈 글을 참고하길 바란다.
오늘 생각보다 내용이 길어져 print_table 메서드에 색상 옵션을 넣는 것은 다음 글로 미뤄야 할 것 같다.^^*
See you again~~