{{위키데이터 속성 추적}}
{{프로그래밍 언어 정보
|이름 = 루비<br />Ruby
|로고 = Ruby logo.svg
|로고크기 = 64px
|패러다임 = [[프로그래밍 패러다임]]: [[객체 지향 프로그래밍]], [[명령형 프로그래밍]], [[함수형 프로그래밍]], [[반영 (컴퓨터 과학)|반영]]
|연도 = [[1995년]]
|설계자 = [[마쓰모토 유키히로]]
|개발자 = [[마쓰모토 유키히로]]및 관계자
|형 체계 = 
|구현체 = [[루비 MRI]], [[YARV]], [[:en:Rubinius|루비니우스]], [[:en:MagLev (software)|메렐]], [[:en:JRuby|J루비]], [[:en:MacRuby|맥루비]], [[:en:RubyMotion|루비모션]], [[:en:mruby|뮤비]]
|파일 확장자 = .rb
|방언 =
|영향을 받은 언어 = [[에이다 (프로그래밍 언어)|에이다]], [[C++]], [[:en:CLU (programming language)|CLU]], [[:en:Dylan (programming language)|딜란]], [[에펠 (프로그래밍 언어)|에펠]], [[리스프]], [[루아 (프로그래밍 언어)|루아]], [[펄]], [[파이썬]], [[스몰토크]]
|영향을 준 언어 = [[클로저 (프로그래밍 언어)|클로저]], [[커피스크립트]], [[:en:Crystal (programming language)|커스텔]], [[D (프로그래밍 언어)|D]], [[Elixir]], [[팰컨 (프로그래밍 언어)|팰컨]], [[그루비]], [[:en:Ioke (programming language)|록크]], [[줄리아 (프로그래밍 언어)|줄리아]], [[:en:Mirah (programming language)|미라]], [[:en:Nu (programming language)|Nu]], 포인트온, [[:en:Reia (programming language)|레이아]], [[러스트 (프로그래밍 언어)|러스트]], [[스위프트 (프로그래밍 언어)|스위프트]]
|라이선스 = 루비 라이선스<br />[[GNU 일반 공중 사용 허가서|GNU GPLv2]]<br />[[BSD 라이선스]]
| latest_release_version = {{wikidata|property|reference|edit|Q161053|P348}}
| latest_release_date = {{시작 날짜와 나이|{{wikidata|qualifier|Q161053|P348|P577}}}}
}}

'''루비'''({{llang|en|Ruby}})는 [[마쓰모토 유키히로]]가 개발한 [[객체 지향 프로그래밍|동적 객체 지향]] [[스크립트 언어|스크립트]] [[프로그래밍 언어]]이다. 루비는 순수 객체 지향 언어라, 정수나 문자열 등을 포함한 데이터 형식 등 모든 것이 객체이다.

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

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

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

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

루비 인터프리터는 [[유닉스]], [[리눅스]], [[마이크로소프트 윈도우]], [[OS X]], [[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년에 폭발적인 인기를 모으면서 루비는 큰 주목을 받게 되었다.

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

전통적인 Hello World 예:
<syntaxhighlight lang="ruby">
puts "Hello World!"
</syntaxhighlight>

기초적인 루비 코드:
<syntaxhighlight lang="ruby">
# 리터럴을 포함한 모든 것이 객체이다. 그래서 이 코드가 동작한다:
-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"
</syntaxhighlight>

변환:
<syntaxhighlight lang="ruby">
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.'
</syntaxhighlight>

=== 제어구조 ===
다른 언어에서도 흔히 보이는 제어구조를 제공한다.
<syntaxhighlight lang="ruby">
if "fablic".length > 3
  puts 'ya'
else
  puts 'nop'
end

# 결과:
# ya

n = 0
while n < 3
  puts 'foobar'
  n += 1
end

# 결과:
# foobar
# foobar
# foobar
</syntaxhighlight>
일부 제어구조에서는 반복자(Iterator)로 대신한다.

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

다음의 할당은 동일하며 변수 보간(Variable interpolation)을 지원한다.
<syntaxhighlight lang="ruby">
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
</syntaxhighlight>
다음의 할당은 동일하며 원래 그대로의 문자열(raw string)을 산출한다.
<syntaxhighlight lang="ruby">
a = 'This is a single-quoted string'
a = %q{This is a single-quoted string}
</syntaxhighlight>

=== 컬렉션 ===
배열을 사용하여 구성하기
<syntaxhighlight lang="ruby">
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]
</syntaxhighlight>

루비에서 해시라 불리는 연관 배열(associative array)을 사용하여 구성하기
<syntaxhighlight lang="ruby">
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'
</syntaxhighlight>

=== 블록(Block)과 반복자(Iterator) ===
코드 블록을 생성하기 위한 두가지 문법이 있다.
<syntaxhighlight lang="ruby">
{ puts "Hello, World!" } # { 중괄호 } 에 주목하시오.
#또는
do
  puts "Hello, World!"
end
</syntaxhighlight>
블록을 사용하여 열거와 배열을 반복하기
<syntaxhighlight lang="ruby">
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
</syntaxhighlight>

=== 클래스 ===
<syntaxhighlight lang="ruby">
class Person
  attr_reader :name, :age # Getter
  def initialize(name, age)
    @name, @age = name, age
  end
  def <=>(person) # 정렬을 위한 비교 연산자
    @age <=> person.age
  end
  def to_s # 객체를 String으로 바꾸기 위한 메서드
    "#@name (#@age)"
  end
end

group = [
  Person.new("Bob", 33),
  Person.new("Chris", 16),
  Person.new("Ash", 23)
]

puts group.sort.reverse
</syntaxhighlight>

==== 열린 클래스 ====
<syntaxhighlight lang="ruby">
# 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
</syntaxhighlight>

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

=== 메타프로그래밍 ===
<syntaxhighlight lang="ruby">
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
</syntaxhighlight>
생성된 메소드는 이렇게 사용될 수 있다.
<syntaxhighlight lang="ruby">
"Hello, World!".in_blue
=> "<span style=\"color: #00f\">Hello, World!</span>"
</syntaxhighlight>

== 같이 보기 ==
* [[루비 온 레일즈]] (RoR, Ruby on Rails)

== 각주 ==
{{각주}}

== 외부 링크 ==
{{위키공용분류}}
* [http://www.ruby-lang.org/ 루비 공식 홈페이지]
* [http://www.ruby-doc.org 루비 문서 사이트]
* [http://groups.google.com/group/rubykr 한국 루비 사용자 모임]
* [http://rubyonrails.org/ 루비 온 레일스 프레임워크] - 루비언어로 구현된 MVC모델 웹 프레임워크
* [http://ruby-korea.github.io 루비 프로그래밍 언어 한국어 문서] {{웨이백|url=http://ruby-korea.github.io/ |date=20200220221645 }} - 루비에 관련된 한국어 문서 링크집
* [https://www.toptal.com/ruby/how-to-set-up-a-microservices-architecture 루비 Microservices 아키텍처]

{{자유-오픈 소스 소프트웨어}}
{{주요 프로그래밍 언어}}

{{전거 통제}}

[[분류:루비 (프로그래밍 언어)| ]]
[[분류:객체 지향 프로그래밍 언어]]
[[분류:스크립트 언어]]
[[분류:ISO 표준]]
[[분류:1995년 개발된 프로그래밍 언어]]
[[분류:C로 작성된 자유 소프트웨어]]
[[분류:BSD 라이선스 소프트웨어]]
[[분류:동적 프로그래밍 언어]]
[[분류:자유 컴파일러와 인터프리터]]
[[분류:다중 패러다임 프로그래밍 언어]]
[[분류:동적 타입 프로그래밍 언어]]
[[분류:텍스트 지향 프로그래밍 언어]]
[[분류:ISO 표준 프로그래밍 언어]]