|
| 1 | +--- |
| 2 | +layout: page |
| 3 | +title: "루비에 대해서" |
| 4 | +lang: ko |
| 5 | +--- |
| 6 | + |
| 7 | +루비가 왜 인기 있을까요? 루비의 팬들은 아릅답고 기교가 뛰어난 언어이기 때문이라고 말합니다. 하지만 이 말로는 부족하지요. 어떤 |
| 8 | +점이 루비를 이처럼 매력적인 언어로 만드는 것일까요? |
| 9 | + |
| 10 | +### 루비를 만든 마츠의 목표 |
| 11 | + |
| 12 | +{: |
| 13 | +style="padding-left:8px;"} |
| 14 | +{: style="float:right"} |
| 15 | + |
| 16 | +루비는 균형잡힌 언어입니다. 루비를 만든 [유키히로 마츠모토][1](일명 마츠)는 그가 좋아하는 언어인 펄, 스몰토크, 아이펠, |
| 17 | +에이다, 리스프를 섞어서 명령형 프로그래밍언어이자 함수형 언어인 새로운 언어를 만들었습니다. |
| 18 | + |
| 19 | +그는 “루비를 단순하게 만드는 것이 아니라 자연스럽게 만들려고 노력한다”라고 말하곤 합니다. 우리의 삶을 반영하고자 한다는 |
| 20 | +것이지요. |
| 21 | + |
| 22 | +이렇게 말한 적도 있습니다. |
| 23 | + |
| 24 | +> 루비는 언뜻보기에는 간단해보입니다. 하지만 그 내부는 무척이나 복잡하지요. 마치 사람의 몸처럼요\[1\]. |
| 25 | +
|
| 26 | +### 루비의 성장세 |
| 27 | + |
| 28 | +1995년에 처음 공개된 이후로 전세계에 많은 루비 개발자가 생겨났습니다. 특히 2006년에는 수많은 사람들이 루비를 배웠습니다. |
| 29 | +전 세계의 왠만한 도시에는 활발한 사용자 그룹이 만들어졌고, 루비와 관랸된 컨퍼런스는 모두 매진되었습니다. |
| 30 | + |
| 31 | +{: style="padding-left:8px;"} |
| 34 | +{: style="float:right"} |
| 35 | + |
| 36 | +루비의 주된 커뮤니케이션 채널인 루비 토크는 하루에 평균 200개의 글이 올라올 정도로 성장하였습니다. |
| 37 | + |
| 38 | +프로그래밍 언어 인기 순위를 제공하는 [TIOBE 인덱스][2]에 따르면 루비는 세계에서 10번째로 많이 쓰이는 프로그래밍 |
| 39 | +언어이다. 그리고 2006년 ‘올해의 언어로’ 꼽히기도 하였다. 이런 성장은 루비로 만들어진 대중적인 소프트웨어, 특히나 루비 온 |
| 40 | +레일스 웹 프레임워크\[2\]의 공이다. |
| 41 | + |
| 42 | +루비는 [완전히 무료](license.txt)이다. 사용뿐 만 아니라 복사, 수정, 배포까지도 무료이다. |
| 43 | + |
| 44 | +### 모든 것은 객체이다. |
| 45 | + |
| 46 | +처음에 마츠는 이상적인 문법을 가진 언어를 찾고 있었다. 그 때를 회고하며 그는 “나는 펄보다 강력하고 파이썬보다는 객체지향적인 |
| 47 | +스크립트 언어가 필요했다\[3\]”라고 말해다. |
| 48 | + |
| 49 | +루비에서는 모든 것이 객체이다. 따라서 루비에서 모든 것은 자신만의 속성과 액션을 갖는다. 객체지향 프로그래밍에서 이런 속성을 |
| 50 | +*인스턴스 변수*라고 하고, 액션을 *메서드*라고 한다. 루비의 순수 객체지향 접근법은 아래의 예제처럼 숫자에 액션을 취하는 |
| 51 | +코드로 대표되곤 한다. |
| 52 | + |
| 53 | + 5.times { print "우리는 루비를 *사랑*해요! 너무 멋져요!" } |
| 54 | +{: .code .ruby-code} |
| 55 | + |
| 56 | +많은 언어에서 숫자는 원시 타입이지 객체는 아니다. 하지만 루비는 스몰토크의 영향을 받아 모든 형태의 것에 메서드와 인스턴스 |
| 57 | +변수를 부여한다. 이는 모든 곳에서 일관되게 적용되므로 루비 사용법을 쉽게 해준다. |
| 58 | + |
| 59 | +### 루비의 유연함 |
| 60 | + |
| 61 | +개발자가 루비의 어떤 부분이든 자유롭게 바꿀 수 있기 때문에 매우 유연한 언어라고 할 수 있다. 원한다면 루비 코어 부분도 |
| 62 | +제거하고 재정의할 수 있다. 이미 존재하는 코드에 무엇인가를 덧붙일 수도 있다. 루비는 기본적으로 개발자의 사고를 제한하지 |
| 63 | +않는다. |
| 64 | + |
| 65 | +예를 들어 아래는 `+` 연산자 대신 plus 라고 쓰는 것이 더 읽기 편하다고 결정했다면 루비의 빌트인 클래스인 |
| 66 | +`Numeric`에 메서드드를 추가하면 된다. |
| 67 | + |
| 68 | + class Numeric |
| 69 | + def plus(x) |
| 70 | + self.+(x) |
| 71 | + end |
| 72 | + end |
| 73 | + |
| 74 | + y = 5.plus 6 |
| 75 | + # 이제 y는 11이 되었다 |
| 76 | +{: .code .ruby-code} |
| 77 | + |
| 78 | +루비의 연산자는 메서드를 이용한 문법 단축에 불과하다. 물론 이 부분도 재정의할 수 있다. |
| 79 | + |
| 80 | +### 루비의 표현력을 풍부하게 해주는 블럭 |
| 81 | + |
| 82 | +루비의 블럭 기능 또한 뛰어난 유연성의 원천입니다. 개발자는 어떤 메서드에든 클로저를 추가함으로써 메서드의 동작을 기술할 수 |
| 83 | +있습니다. 루비에서 이 클로저를 *블럭*이라고 부릅니다. 이는 PHP, 비주얼베이직 등 다른 명령형 언어에서 루비로 이주한 |
| 84 | +개발자에게 가장 매력적인 기능으로 꼽힌다. |
| 85 | + |
| 86 | +블럭은 함수형 언어에서 아이디어를 따왔다. 마츠는 “루비 클러저를 만들면서 나는 리스프의 클로저 기능을 존중하고 |
| 87 | +싶었다\[4\]”고 말했다. |
| 88 | + |
| 89 | + search_engines = |
| 90 | + %w[Google Yahoo MSN].map do |engine| |
| 91 | + "http://www." + engine.downcase + ".com" |
| 92 | + end |
| 93 | +{: .code .ruby-code} |
| 94 | + |
| 95 | +위 예제에서 블럭은 `do ... end` 문법 구조에 기술되었다. `map` 메서드는 주어진 단어 리스트에 블럭을 적용한다. |
| 96 | +이처럼 루비의 다른 메서드들도 그 동작 중 일부를 자신의 블럭으로 채워넣을 수 있도록 개발자에게 열린 구조를 제공하고 있다. |
| 97 | + |
| 98 | +### 루비와 믹스인 |
| 99 | + |
| 100 | +다른 객체지향 언어와 달리 루비는 **의도적으로** 단일 상속만을 제공한다. 대신 루비에는 모듈 개념(Object-C에서는 |
| 101 | +카테고리라 불리는)이 있다. 모듈은 메서드의 컬렉션이다. |
| 102 | + |
| 103 | +클래스에 모듈을 믹스인할 수 있는데, 그렇게 하면 유용한 메서드를 손쉽게 얻을 수 있다. 예를 들어 `each` 메서드를 구현하고 |
| 104 | +있는 클래스는 어떤 것이든 `Enumerable` 모듈을 믹스인하기만 하면, `each`를 루프에 이용해 많은 함수들이 추가된다. |
| 105 | + |
| 106 | + class MyArray |
| 107 | + include Enumerable |
| 108 | + end |
| 109 | +{: .code .ruby-code} |
| 110 | + |
| 111 | +대부분 루비스트들은 위와 같은 기능이 복잡하기만하고 제한적인 다중 상속보다 훨씬 간결한 방법이라고 보고 있다. |
| 112 | + |
| 113 | +### 루비 코드의 외향 |
| 114 | + |
| 115 | +루비에는 변수 선언이 없다. 단지 변수의 범위를 나타내기 위해 몇가지 간단한 이름 관례를 사용하고 있다. |
| 116 | + |
| 117 | +* `var` 지역변수. |
| 118 | +* `@var` 인스턴스 변수. |
| 119 | +* `$var` 전역변수. |
| 120 | + |
| 121 | +이런 몇가지 장치는 변수의 역할을 명확히 드러냄으로써 프로그래머가 코드를 읽기 쉽게 해준다. 그리고 모든 인스턴스 메서드에 |
| 122 | +붙인다면 정말 피곤할 `self.`도 대부분 생략할 수 있다. |
| 123 | + |
| 124 | +### 고급 기능 |
| 125 | + |
| 126 | +루비는 개발자의 편의를 위해 많은 기능을 제공한다. 그 중 유용한 일부는 아래와 같다. |
| 127 | + |
| 128 | +* 루비에는 자바, 파이썬처럼 예외 처리 기능이 있다. 따라서 에러 처리를 간편하게 할 수 있다. |
| 129 | +^ |
| 130 | + |
| 131 | +* 루비는 모든 객체를 대상으로 마크-스윕 가바지 컬렉터를 제공한다. 확장 라이브러리에서 참조 카운트를 관리할 필요는 없다. |
| 132 | + 마츠는 “건강을 위한” 기능이라고 표현했다. |
| 133 | +^ |
| 134 | + |
| 135 | +* C 에서 루비를 사용하기 위한 간결한 API를 제공하기때문에, 펄이나 파이썬보다 쉽게 C 확장기능을 만들 수 있다. 여기에는 |
| 136 | + 스크립팅을 위해 루비를 임베딩하는 것도 포함된다. 물론, SWIG 인터페이스도 제공된다. |
| 137 | +^ |
| 138 | + |
| 139 | +* OS가 지원한다면 확장 기능을 동적으로 로드할 수 있다. |
| 140 | +^ |
| 141 | + |
| 142 | +* 루비는 운영체제에 의존하지 않는 스레딩 기능을 제공한다. 그리고 이는 루비가 동작하는 모든 플랫폼에 적용된다. 따라서 스레드를 |
| 143 | + 지원하지 않는 MS-DOS에서도 다중 스레드 프로그램을 작성할 수 있다. |
| 144 | +^ |
| 145 | + |
| 146 | +* 루비는 이식성이 매우 높다. 대부분 GNU 리눅스에서 개발되었지만 대부분의 유닉스. 맥 OS X, 윈도우 |
| 147 | + 95/98/Me/NT/2000/XP, 도스, BeOS, OS/2 등에서 동작한다. |
| 148 | + |
| 149 | +#### 참조 |
| 150 | + |
| 151 | +<sup>1</sup> 마츠, 루비토크 메일링리스트에서, [May 12th, 2000][3]. |
| 152 | +{: #fn1} |
| 153 | + |
| 154 | +<sup>2</sup> 자세한 내용은 [루비 온 레일스][4] 홈페이지를 참조. |
| 155 | +{: #fn2} |
| 156 | + |
| 157 | +<sup>3</sup> 마츠, [An Interview with the Creator of Ruby][5], Nov. 29th, |
| 158 | +2001. |
| 159 | +{: #fn3} |
| 160 | + |
| 161 | +<sup>4</sup> 마츠, [Blocks and Closures in Ruby][6], December 22nd, 2003. |
| 162 | +{: #fn4} |
| 163 | + |
| 164 | + |
| 165 | + |
| 166 | +[1]: http://www.rubyist.net/~matz/ |
| 167 | +[2]: http://www.tiobe.com/index.htm?tiobe_index |
| 168 | +[3]: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/2773 |
| 169 | +[4]: http://rubyonrails.org/ |
| 170 | +[5]: http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html |
| 171 | +[6]: http://www.artima.com/intv/closures2.html |
0 commit comments