정보공간_1

루비 프로그래밍 언어 시작하기 본문

IT 놀이터/IT Storehouse

루비 프로그래밍 언어 시작하기

알 수 없는 사용자 2011. 10. 8. 00:30
안녕하세요, 수원 멤버십에서 활동중인 21-1기 박동섭이라고 합니다.

저는 루비 프로그래밍 언어로 이야기를 시작해보고자 합니다.



 Ruby는 1995년, 마츠모토 유키히로라는 일본인 프로그래머에 의해 고안된 프로그래밍 언어로, 흔히 사람들이 많이 사용하는 C++나 Java처럼 객체지향 언어라고 알려져 있습니다.

일단 루비 프로그래밍 언어의 공식 홈페이지을 접속해 봅시다. 이런 문구를 만나실 수 있을거에요.

"간결함과 생산성을 강조한 동적인 오픈 소스 프로그래밍 언어입니다."
"루비의 우아한 문법으로 자연스럽게 읽고 쓰기 편한 프로그램을 만들수 있습니다."

 자세히 보기를 누르시면, 루비 프로그래밍 언어의 특징에 대해 쭉 나옵니다. 코드도 한번 읽어보세요. 어떤 느낌을 받으셨나요? 기존에 흔히 사용하는 언어들에 비해서 문법이 굉장히 단순하고 직관적이라는 느낌을 받지는 않으셨나요?

 일단, 공식 홈페이지에서도 이야기하는 것처럼 루비에서의 모든 것은 객체입니다. Java처럼 기본 데이터 타입이라는 것이 존재하지 않지요. 이를테면, 정수의 경우도 값이 아닌 객체로 저장합니다. Fixnum이라는 타입으로 말이죠.

 믹스인(Mix-in)이라는 개념이 있습니다. 대부분의 객체지향 언어가 그러하듯이, 루비 역시 다중상속을 지원하지 않습니다. Java의 경우에는 다중상속을 간접적으로 지원하기 위해 인터페이스라는 것을 제공했던 반면, 루비의 경우에는 믹스인이라는 도구를 제공합니다. 믹스인이라는 용어는 JavaScript를 공부하셨던 분들이라면 아마 한번쯤은 보셨을 것 같습니다. LISP를 공부하신 분이 계신가요? 저는 LISP라는 언어를 공부한 적은 없습니다만, 이 믹스인이라는 도구가 LISP라는 언어에서 넘어온 것이라고 합니다. 믹스인에 대해서는 차후에 이야기하도록 하겠습니다.

LISP 이야기가 나와서인데, 루비를 두고 이런 짖궂은 표현을 쓰기도 합니다.

 'ALGOL의 탈을 쓴 LISP'

저는 이것을 이렇게 생각해보는데요.

'ALGOL 계열 언어의 구조적인 측면과 LISP의 유연함을 갖추었다!'

 흔히 C, C++, Java 등과 유사한 형태의 문법을 가진 언어들을 ALGOL 계열 언어라고 이야기하곤 합니다. 루비도 그렇습니다. 기본적인 문법의 골격은 ALGOL의 형태를 취하고 있습니다.

 LISP는 흔히 함수형 언어로 구분되는 것으로 알고 있습니다. 함수형 언어를 거론할때 Haskel이나 Erlang같은 언어와 같이 거론되곤 하지요. 요 근래 종종 거론되는 언어들 중에는 유난히 함수형 언어적인 느낌이 많이 나는 언어들이 많은데, 함수형 언어적 도구를 사용하면 복잡한 문제를 조금 더 매끄럽게 해결할 수 있기 때문이 아닌가 하는 생각이 듭니다. 혹시 C#을 하시는 분들이라면 이 말에 공감하실 수 있을 것이라고 생각합니다. 자바에서 리스너(listener) 인터페이스를 구현하여 사용해야 하는 이벤트 처리를 C#에서는 델리게이트(delegate)를 사용함으로서 문제가 깔끔해지지 않던가요?

 루비는 ALGOL 형식의 문법을 지닌 함수형 언어일까요? 조금 애매합니다. 보통 객체지향 언어라고 이야기를 합니다. 객체지향 언어에 함수형 언어적 도구를 도입했다고들 이야기하는 것이 보통입니다. 박쥐같은 녀석이죠.

 객체지향 언어라는 패러다임과와 함수형 언어라는 패러다임은 완전히 다른 것일까요? 저는 아니라고 생각합니다. 단지 프로그래밍 언어를 어떤 관점에서 바라보느냐의 차이인 것같습니다.

 프로그래밍 언어들은 사용되어지고 발전하면서 다른 언어들의 영향을 받아 스스로의 생태계를 유지하고 있습니다. Java나 C#같은 언어가 어떻게 변화해왔는지에 대해 비교해보면 그 흐름을 엿볼 수 있는데요, 처음에 시작할 때에는 나름대로의 컨셉을 가지고 있다가 차츰 그 성격이 섞이고 섞여 그 형태를 명확히 구분하기가 매우 힘들어져가고 있다는 사실을 발견할 수 있습니다. 대표적인 사례가 최근에 세상에 모습을 보인 JDK7에서의 클로저 지원이라고 할 수 있겠네요.

 혹시 프로그래밍 언어에 대해 관심이 많으신 분들이라면 이런 시도를 권해드리고 싶습니다. 'C로 객체지향 흉내내기', 'LISP에서 객체지향 흉내내기', 'JavaScript에서 객체지향 흉내내기' 실제로 LISP에서 객체지향 흉내를 내는 주제에 대해서는 전에 마이크로소프트웨어라는 잡지에서 다루어진 적이 있으니 찾아보시면 그 내용을 확인하실 수 있을 것입니다.

 앞에서 루비를 두고 'ALGOL의 탈을 쓴 LISP'라는 표현을 인용하였습니다. 왜 LISP의 탈을 쓴 ALGOL이 아닐까요? 저는 이 답이 루비의 블록(Block)이라고 하는 도구에 있다고 생각합니다. 흔히 루비 클로저(Closure)라고 불리기도 하는 이 도구는 함수형 언어에서 넘어온 클로저(Closure)라는 언어적 도구를 루비에 도입한 것이라고 하는데요, 루비 코드를 만지다 보면 정말 자주 만나게 됩니다. 루비스트(루비를 사랑하는 프로그래머들을 지칭합니다.)들은 '루비스러운 코드'라는 말을 즐겨 사용하는데, 여기서 루비스러운 코드들을 보면 블록을 즐겨 사용하는 것을 확인할 수가 있습니다. 블록이 자주 사용된 코드들을 보면 흡사 LISP 코드와 그 형태가 비슷해지는 것같기도 합니다. 그래서 루비를 두고 'ALGOL의 탈을 쓴 LISP'이라고 말하는지도 모르겠습니다.

 마침 클로저에 대한 이야기가 나온 김에 클로저에 대한 몇 가지 예시만 들어보겠습니다. Java에도 이와 비슷한 문법이 있는데, 아마 이런 코드를 보신 적이 있을 것입니다.


혹시 C의 qsort 함수나 C++ STL의 sort 함수를 사용해보신 적이 있으신가요? 그렇다면 이런 코드도 보셨을 것입니다.



이런 예시는 어떨까요? Unix 계열의 운영체제에서 pthread 프로그래밍시에 pthread_create 함수의 사용 예제입니다.


 뭔가 번거롭게 보이지 않나요? C/C++에서는 이벤트 핸들러(혹은 콜백)을 함수 안에 지정할 수가 없습니다. Java의 경우에도 불가능하죠. 단지, 익명 클래스를 만들어냄으로서 간접적으로 클로저와 비슷하게 구현했을 뿐입니다.

그러면 루비 코드를 보도록 하겠습니다.


 Thread 객체를 초기화하는 시점에 블록이 하나 정의가 되고 있는 것을 확인할 수가 있습니다. 여기서 블록은 유닉스의 pthread에서 pthread_create에 인자로 넘겨주는, 스레드의 동작에 관한 함수라고 할 수 있습니다. 위와 같은 코드가 기존의 C/C++, Java의 문법에서 가능했던가요? 위와 같이 코드를 작성함으로서 얻을 수 이점은 무엇일까요? 일단 저는 생산성 증가과 직관적인 코드라고 생각합니다. 스레드에서 어떤 동작을 할 것인지에 대해 정의하기 위해 굳이 따로 함수를 만들 필요가 없고, 관련된 코드끼리 묶어놓았기 때문에 왔다갔다 할 필요가 없기 때문입니다.


짧게 루비 프로그래밍 언어에 대해 살펴봤습니다.

앞으로의 포스팅 계획은 이러합니다.

 조건문이나 반복문 등의 기본적인 문법들은 건너 뛰고, 다음 포스팅에서는 루비에서의 객체지향 언어적 특징, 클로저, 모듈 등에 대한 개념들을 주로 다루고자 합니다.

 루비 프로그래밍 언어의 범주에서 다룰 수 있는 내용을 어느 정도 끝마친 다음에는 좀 더 실용적인 사례들을 다루거나 분석해보고자 합니다. 이를테면 루비 온 레일스 프레임워크 분석이라거나, 루비로 작성하는 쉘 스크립트 등의 주제로 말이죠.