루비 (프로그래밍 언어)

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색
Ruby
루비
로고 그림
패러다임 다중 패러다임
발표년도 1995년
설계자 마쓰모토 유키히로
개발자 마쓰모토 유키히로 등 여러 사람들
최근 버전 2.1.1
자료형 체계 덕 타이핑, 동적 타이핑
주요 구현체 루비 MRI, YARV, JRuby, Rubinius, IronRuby, 맥루비, 핫루비
영향을 받은 언어 스몰토크, , 리스프, Scheme, 파이썬, CLU, 에펠, 에이다, Dylan
영향을 준 언어 D 언어,[1] 그루비, Nu, Falcon, Ioke, Mirah
운영 체제 크로스 플랫폼
라이선스 루비 사용 허가서 또는 GNU 일반 공중 사용 허가서 v2[2][3]
웹사이트 www.ruby-lang.org

루비(Ruby)는 마츠모토 유키히로(松本行弘 (まつもとゆきひろ))가 개발한 동적 객체 지향 스크립트 프로그래밍 언어이다. 루비는 순수 객체 지향 언어이다. 루비에서의 정수나 문자열 등을 포함한 데이터 형식 등 모든 것이 객체이다.

기능에는 클래스 정의, 가비지 컬렉션, 강력한 정규 표현식 처리, 다중 스레드, 예외 처리, 반복, 클로저, Mixin, 연산자 오버로드 등이 있다. 구문은 ALGOL계를 계승하면서 가독성을 중시하고 있다.

오랫동안 언어 사양이 명문화되지 않고 마츠모토의 구현 언어 사양에 준하는 것으로 간주되어 왔지만, 2010년 6월 RubySpec으로 언어 사양을 책정 중이다.

루비의 철학[편집]

루비의 개발자 마츠모토 유키히로는 루비가 스트레스가 없는 쉬운 프로그래밍이고, 루비는 우리의 삶을 반영해야 하며, 프로그래밍 언어는 (컴퓨터가 아닌) 인간 중심으로 설계되어야 한다고 했다.

구현 버전[편집]

루비는 이식성이 매우 높다. 대부분 GNU 리눅스에서 개발되었지만 유닉스, 맥 OS X, 윈도 95/98/Me/NT/2000/XP, 도스, BeOS, OS/2 등에서 동작한다. [2]

루비 인터프리터는 유닉스, 리눅스, 마이크로소프트 윈도, 맥 오에스 텐, MS-DOS, OS/2, 아미가 등 많은 플랫폼에 이식되어 있다.

루비 구현물은 크게 마츠모토 유키히로가 만든 공식 구현과 그외의 구현, 두 가지으로 나눌 수 있다.

공식 구현[편집]

  • MRI (Matz' Ruby Implementation): 1.8.x 이전의 공식 구현.
  • YARV (Yet Another Ruby VM): YARV는 2007년 12월에 발표된 루비 1.9.0 버전에 포함되어 있다. MRI를 확장하는 공식적인 구현이다. MRI 루비 인터프리터가 갖는 속도의 한계를 뛰어넘기 위해 만들어진 바이트코드 인터프리터이다. 이것은 소스 코드를 바이트 코드로 컴파일 후, 바이트 코드를 가상 머신에서 실행하는 인터프리터이다.

그외의 다른 구현[편집]

  • JRuby: 자바 가상 머신을 사용하는 것으로 순수한 자바에서 실행되기 때문에, 자바 환경을 실행시킬 수 있는 어떠한 곳에서도 실행 가능하다.
  • IronRuby: .NET Framework 기반의 구현
  • MacRuby: Mac OS X 에서 실행되는 Ruby 구현
  • Rubinius: 가상 머신에서 Ruby를 실행하는 JIT 방식의 바이트 코드 인터프리터이다. 대부분이 Ruby 언어로 구현되어 있다.
  • Cardinal: : Parrot 에서 Ruby를 동작시키기 위한 구현물이 개발되고 있다.

파이썬과의 비교[편집]

루비는 인터프리터 형식으로 실행되는 고기능 스크립트 언어이자 뛰어난 객체 지향적 언어이다. 이러한 특성을 가지면서 루비와 같이 가독성이 뛰어난 대표적인 스크립트 언어는 파이썬이다. 이런 유사함은 각각의 언어 사용자 간에 '어떤 언어가 더 뛰어난가?' 라는 논쟁을 일으켰다. 그러나 그런 논쟁은 대체적으로 기술적으로 너무 세부적인 곳에 집착한 의미 없는 논쟁이었다.

파이썬이 정형화된 들여쓰기를 요구하는 반면 루비는 정형화된 서식을 요구하지는 않는다.

사용자 수와 구현 시스템의 수와 질 등을 비교해 보면, 세계적으로 파이썬이 인기가 더 많다. 한편, 루비의 개발자가 일본 사람이기 때문에 일본에서는 루비의 인기가 높고 서적 등도 많이 출판되고 있다. 2004년까지는 루비로 작성된 킬러 애플리케이션이 없었다. 하지만, 2004년 말에 발표된 루비 온 레일즈가 2005년에 폭발적인 인기를 모으면서 루비는 큰 주목을 받게 되었다.

사용 예제[편집]

다음의 예는 대화형 루비 셸에서 동작시킬 수 있고 파일로 저장하여 명령줄에서 ruby <filename>을 타이핑하여 동작시킬 수 있다.

전통적인 Hello World 예:

puts "Hello World!"

기초적인 루비 코드:

# 리터럴을 포함한 모든 것이 객체이다. 그래서 이 코드가 동작한다:
-199.abs # 199
"ruby is cool".length # 12
"Your mother is nice.".index("u") # 2
"Nice Day Isn't It?".downcase.split("").uniq.sort.join # " '?acdeinsty"

변환:

puts "What's your favorite number?"
number = gets.chomp
output_number = number.to_i + 1
puts output_number.to_s + ' is a bigger and better favorite number.'

제어구조[편집]

다른 언어에서도 흔히 보이는 제어구조를 제공한다.

if "fablic".length > 3
  puts 'ya'
else
  puts 'nop'
end
 
# 결과:
# ya
 
n = 0
while n < 3
  puts 'foobar'
  n += 1
end
 
# 결과:
# foobar
# foobar
# foobar

일부 제어구조에서는 반복자(Iterator)로 대신한다.

문자열[편집]

루비에서 문자열을 정의하기 위한 다양한 방법이 있다.

다음의 할당은 동일하며 변수 보간(Variable interpolation)을 지원한다.

a = "\nThis is a double-quoted string\n"
a = %Q{\nThis is a double-quoted string\n}
a = %{\nThis is a double-quoted string\n}
a = %/\nThis is a double-quoted string\n/
a = <<-BLOCK
 
This is a double-quoted string
BLOCK

다음의 할당은 동일하며 원래 그대로의 문자열(raw string)을 산출한다.

a = 'This is a single-quoted string'
a = %q{This is a single-quoted string}

컬렉션[편집]

배열을 사용하여 구성하기

a = [1, 'hi', 3.14, 1, 2, [4, 5]]
 
puts a[2] # 3.14
puts a.[](2) # 3.14
puts a.reverse # [[4, 5], 2, 1, 3.14, 'hi', 1]
puts a.flatten.uniq # [1, 'hi', 3.14, 2, 4, 5]

루비에서 해시라 불리는 연관 배열(associative array)을 사용하여 구성하기

hash = { :water => 'wet', :fire => 'hot' }
puts hash[:fire] # Prints: hot
 
hash.each_pair do |key, value| # Or: hash.each do |key, value|
  puts "#{key} is #{value}"
end
 
# Prints: water is wet
# fire is hot
 
hash.delete :water # Deletes :water => 'wet'
hash.delete_if {|key,value| value=='hot'} # Deletes :fire => 'hot'

블록(Block)과 반복자(Iterator)[편집]

코드 블록을 생성하기 위한 두가지 문법이 있다.

{ puts "Hello, World!" } # { 중괄호 } 에 주목하시오.
#또는
do
  puts "Hello, World!"
end

블록을 사용하여 열거와 배열을 반복하기

array = [1, 'hi', 3.14]
array.each {|item| puts item }
# => 1
# => 'hi'
# => 3.14
 
array.each_index {|index| puts "#{index}: #{array[index]}" }
# => 0: 1
# => 1: 'hi'
# => 2: 3.14
 
# The following uses a Range
(3..6).each {|num| puts num }
# => 3
# => 4
# => 5
# => 6

클래스[편집]

class Person
  attr_reader :name, :age
  def initialize(name, age)
    @name, @age = name, age
  end
  def <=>(person) # 정렬을 위한 비교 연산자
    @age <=> person.age
  end
  def to_s
    "#@name (#@age)"
  end
end
 
group = [
  Person.new("Bob", 33), 
  Person.new("Chris", 16), 
  Person.new("Ash", 23) 
]
 
puts group.sort.reverse

열린 클래스[편집]

# re-open Ruby's Time class
class Time
  def yesterday
    self - 86400
  end
end
 
today = Time.now # => Thu Aug 14 16:51:50 +1200 2008
yesterday = today.yesterday # => Wed Aug 13 16:51:50 +1200 2008

예외[편집]

begin
# 어떤 것을 하는 코드
rescue
# 예외를 처리할 코드
else
# 예외가 발생하지 않았을 경우 실행할 코드
ensure
# 예외가 발생하든 안 하든 실행할 코드
end

메타프로그래밍[편집]

COLORS = { :black => "000",
           :red     => "f00",
           :green   => "0f0",
           :yellow  => "ff0",
           :blue    => "00f",
           :magenta => "f0f",
           :cyan    => "0ff",
           :white   => "fff" }
 
class String
  COLORS.each do |color,code|
    define_method "in_#{color}" do
      "<span style=\"color: ##{code}\">#{self}</span>"
    end
  end
end

생성된 메소드는 이렇게 사용될 수 있다.

"Hello, World!".in_blue
=> "<span style=\"color: #00f\">Hello, World!</span>"

같이 보기[편집]

주석[편집]

  1. Building assert() in Swift, Part 2: __FILE__ and __LINE__ - Swift Blog -. Apple Developer. 26 September 2014에 확인. “Swift borrows a clever feature from the D language: these identifiers expand to the location of the caller when evaluated in a default argument list.”
  2. LICENSE.txt on Ruby official site
  3. COPYING.txt on Ruby official site

바깥 고리[편집]