루비(Ruby)를 통해서 프로그래밍 시작하기

개요

해당 문서는 프로그래밍 또는 루비입문자를 위해 작성했습니다.

작성 이유는 _국내에 루비관련 자료가 너무 없어_서 루비로 입문하는 입문자들을 위해 작성했습니다.

본래 글 쓰는 재주도 없고 실력도 그닥 없어서 읽는 분들께서 잘 이해할 수 있을지 의문입니다.

지금 당장 이해가 안되는 내용들은 그냥 건너뛰어주시면 좋겠습니다.

후반부에 조금 더 상세히 풀어보고자합니다.

부족한 부분이나 잘 못된 부분 피드백 해주시면 좋겠습니다.

피드백을 통해서 앞으로 문서를 많이 다듬어야 할 것 같습니다.

그럼, 프로그래밍의 대한 간단한 제 생각과 루비의 대한 설명을 말씀드리겠습니다.

프로그래밍 언어는 매우 많습니다.

처음 입문하는 분들께서는 “어떤 언어를 배워야하지?” 와 같은 고민을 많이합니다.

너무 어려운 언어를 선택하였을 경우, 진입장벽을 느껴 흥미를 잃을 수 있습니다.

개인적으로 파이썬이나 루비를 추천해드리고싶습니다.
이 언어들은 타 언어들에 비해 배우기 쉽고 간단해서 초보 프로그래머들이 어려운 문법에 허우적거리지않고 프로그래밍 할 수 있습니다.

꼭 프로그래밍 입문자가 아니어도 루비를 배울려는 분이라면 해당 문서가 아주 조금의 도움이 되길 바랍니다.

제가 처음으로 입문했던 프로그래밍 언어는 C (열혈 C 프로그래밍..ㅋㅋ) 언어 였습니다.

게임으로 비유하자면 자유도가 낮고 플레이에 좀 한정적인 편에 속했죠.

구조자체가 워낙 strict 한 면이많았습니다.

진입장벽을 느끼는 친구들도 있었습니다.

이 후에 객체지향에 관심이 생겨서 c++로 넘어갔었습니다.

c++을 다소 어렵게 개념을 이해했고, 아마 처음에 c++을 배웠다면 아마 진입장벽을 느끼지않았을까 싶습니다.

그에 비해서 앞으로 다룰 프로그래밍 언어 _[루비(Ruby)](https://www.ruby-lang.org/ko/)_는 쉽고 빠르게 배울수있는 프로그래밍 언어입니다.

애자일 개발 방법론을 지향하는 개발자들이 루비나 파이썬언어를 선호하는 이유는

배우기 쉽고 생각한것 을 코드로 바로 작성할 수 있어 빠른 작업물을 내놓을수있다는 장점이있습니다.

프로그래밍은 절대 언어가 전부가 아닙니다.

언어는 언제든지 배울수있는 것 이죠.

저 또한 지금 루비를 막 배우는 새내기입니다.

프로그래밍의 대하여 여러분들보다 조금의 지식이 있을 뿐 별반 다르지않습니다.

(출처 : CarlCheo.com (http://carlcheo.com/startcoding))

프로그래머는 무에서 유를 만드는 사람이라 말합니다.

저 또한 이 말에 매우 동감하고있습니다.

사람마다 재 각기 다르겠지만, 지금 입문해서 자신이 생각하는 방대한 프로그램을 만들기에는 힘듭니다.

그러니 지금 당장의 결과를 만들기보다 작은 것의 행복감과 성취감을 느끼면 좋겠습니다.

프로그래밍 공부는 수영과 같은 것 같습니다.

바로 당장 물에 뜨는사람도있고 물에 바로 가로 앉는사람이있습니다.

하나 확실한건 자신이 잘 한다고 생각되서 거만해지면 안됩니다.

분명히 자신보다 잘하는 사람들도 많습니다.

반면에 못한다고 해서 절대 실망하지마세요.

처음에는 누구나 다 서툴기 때문입니다.

꾸준히 연습하다보면 자유형·평영·접영·배영·혼영·계영·개인혼영 등을 할 수 있게 될 겁니다.

그러니 너무 욕심내지말고 하나 씩 진도를 나가는 것을 중요시하면 좋겠습니다.

프로그래머가 만든 프로그램은 하나의 _도구_입니다.

그 도구를 통해서 정말 수 없이 많은 결과물을 연계하여 만들 수 있으며

수 천만명, 수 억만명이 동시에 사용할 수 있는 것은 우리 세대가 처음일 것 입니다.

모두가 소비를 할 때, 우리는 생산을 할 수있는사람인 것 입니다.

프로그래밍은 정말 재밌습니다.

하지만 그 재미를 느끼기 위해서는 아주 조금의 지식이 필요합니다.

프로그래밍은 유치원생부터 할머니, 할아버지까지 누구나 다 할 수있습니다.

게임으로 비유하자면 현재 입문자님께서는 지금 레벨 1인 상태 입니다.

몬스터 한마리 사냥하기 벅찬 그런 상태인 거죠.

프로그래밍은 컴퓨터가 이해할수있는 언어로 작성된 텍스트를 메모리에 실으면 컴퓨터는 그 텍스트가 표현한 일을 합니다.

쉽게 말해서 _컴퓨터에게 일을 시키는 것_이라 생각하면 됩니다.

컴퓨터는 아주 똑똑합니다. 그런 똑똑한 컴퓨터에게 일을 시킬려면 컴퓨터와 대화할수있는 언어가 필요합니다.

그 언어를 통해서 코드를 작성합니다. 작성하는 과정을 코딩이라 말합니다. 우리는 프로그래밍을 통해 _생산성 및 효율성_을 높일수있습니다.

예를 들어서, 한 공장에서 50명의 직원이 쿠폰을 검수하고 발급하는 작업하고있다고 가정해봅시다.

대략적인 업무의 흐름은 쿠폰의 유효를 확인 유효하다면 쿠폰을 발급합니다. 하루 작업량은 50,000개 입니다.

하지만 이 부분을 기계가프로그램 을 통해서 대체한다면 하루 작업량의 소요시간이 3 -5분(가정) *직원수 일 때 이를 통해서 회사는 더 많은량의 생산을 할 수있고 인력이 필요하지않으니 인권비또한 아주 적게 소비됩니다.

프로그램은 기계의 저장매체(메모리)에 저장/할당 됩니다. 학교에서 대부분 배우는 내용입니다.

기계는 저장매체에서 _전기가 흐르거나 자기장이 극성_이 변화하면 1

전기가 흐르지 않거나 자기장이 변하지 않으면 0 으로 인식합니다.

기계는 인식된 0또는 1값만으로 표현합니다.

처음에 프로그래머들은 0또는 1의 값으로 프로그램을 만들었습니다. 이렇게 구성된 것을 기계어라고 한다.

이진법이 사용되는 이유 중 하나는 논리의 조립이 간단해서 입니다.

이후에 프로그래머들이 힘들다고 느껴서 고안한게 [어셈블리어](https://namu.wiki/w/%EC%96%B4%EC%85%88%EB%B 8%94%EB%A6%AC%EC%96%B4)입니다.

기계어보다 확실히 많이 나아졌지만 역시 생산성은 좋지못했습니다.

이후에 많이 개선된 고급 프로그래밍 언어들이 많이 나왔습니다.

여기서의 고급이란 사람이 이해하기 쉽게 작성된 프로그래밍 언어입니다.

이러한 언어들로 인해서 프로그래머들은 쉽게 프로그래밍을 할 수 있게되었습니다.

그렇다면 컴퓨터는 그 수많은 언어를 어떻게 인지할까요?

우리는 컴파일을 통해서 컴퓨터에게 우리가 작성한 코드를 컴퓨터가 이해할수있는 언어로 변환합니다..

컴파일이란 프로그래밍언어를 통해작성한 _소스코드를 컴퓨터가 이해할수있는 기계어 구조(이진코드)로 변환_하는 일련의 과정을 말합니다.

작성한 소스코드들을 컴파일러에 의해서 컴파일이 정상적으로되면 기계어 변경되어 .obj(오브젝트 코드)로 저장 된다.

오브젝트 코드는 컴파일과 어셈블리 과정을 거친 파일로서 기계어(0과1)로 이루어져있다.

컴퓨터 아키텍처에 의존적인 파일이기 때문에 변환 환경이 변경되면 다시 컴파일 과정을 거쳐아한다.

그 후에 링커에 의해서 링크를 합니다.

컴파일러의 종류로는 볼랜드 c++ , ms c , 터보c 비주얼 c++ , lcc, 왓콤, dec-c++등이 있습니다.

컴파일의 실행단계는 크게 4단계로 나눌 수 있다.

  1. 구문분석 1. 소스 코드 파일을 읽어 개별 문법요소(연산자, 괄호, 식별자 등) 단위로 자른후, 이 문법요소들을 해석하여 추상 구문 트리를 생성한다. 이 과정에서 문법에 맞지 않는 소스 코드는 사용자에게 알려준다.
  2. 최적화 1. 추상 구문 트리를 분석하여 최적화를 수행한다. 도달할 수 없는 코드를 식별하거나, 상수 표현식을 미리 계산해 두거나, 루프 풀기 등의 대부분의 최적화가 이 단계에서 수행된다.
  3. 코드생성 1. 최적화된 구문 트리로부터 목적 코드를 생성한다. 목표 언어가 기계어일 경우, 레지스터 할당, 연산 순서 바꾸기 등 하드웨어에 맞는 최적화가 이 단계에서 수행된다. 대부분의 하드웨어 최적화 알고리즘은 NP 복잡도를 갖지만, 휴리스틱을 통해 많은 최적화가 수행된다.
  4. 링킹 1. 목적 코드가 기계어일 경우, 여러 라이브러리 목적 코드를 묶어 하나의 실행 파일을 생성하게 된다. 이 과정은 링커에 의해 수행되며, 어떤 사람들은 링커를 컴파일러의 일부로 간주하지 않기도 한다.

위의 기재된 최적화란 고급언어를 그대로 어셈블리어로 직역하는 것이 아니라 더 좋은 성능을 발휘할수 있는 상태로 번역한다고 생각하면된다. 따라서 사용자의 의도와 다르게 컴퓨터가 다르게 동작하는 경우가 발생할 수 있다.

우리가 앞으로 배울 루비는 인터프리터(Interpreter) 방식의 언어입니다.

인터프리터란 소스코드를 한번에 기계어로 변환시키는 컴파일러와는 달리 소스코드 한 줄씩 기계어로 해석하여 실행하는 언어처리 프로그램입니다. 줄 단위로 번역, 실행되기 때문에 시분할 시스템에 유용하며 원시 프로그램의 변화에 대한 반응이 빠릅니다.

컴파일러와 인터프리터의 차이점은 아래와 같습니다.

컴파일러

인터프리터

번역 단위

전체

한줄씩

실행 속도

빠름

느림

번역 속도

느림

빠름

목적 프로그램

생성함

생성하지 않음

메모리 할당

목적 프로그램 생성시 사용,

사용안함

위 내용은 짧게 마치고, 이외 상세한 내용들은 제 블로그에 검색해보시면 찾아보실 수 있을겁니다.

앞으로 여러분은 저와 함께 간단한 몇가지의 프로그램을 만들 것 입니다.

마지막에는 실 서비스에서 사용가능한 프로그램을 만들어보는 시간을 가질 생각이니 천천히 따라와주시면 좋겠습니다.

프로그래밍은 그냥 _즐긴다면 좋은 프로그래머_가 될 수 있을거라 생각합니다.

저 또한 아직은 주니어 개발자라 모르는 것이 산더미이고 많이 부족하여 항상 배우고있습니다.

서론이 길었네요. 각설하고 이제 루비에 대하여 알아봅시다.

루비

**
**

루비(Ruby)는 일본의 개발자(마츠모토 유키히로)가 개발한 동적 객체 지향 스크립트 프로그래밍 언어입니다.

객체지향에 대해서는 현재는 무시하고 읽으셔도 무관합니다. 뒤에서 설명할 예정입니다.

루비를 개발 하면서 영향 받은 다른언어는 Smalltalk, Perl, Lisp, Scheme, Python, CLU, Eiffel, Ada, Dylan 등이 있습니다.

Python과는 지금도 서로 영향을 주고 받는 라이벌 관계입니다.

이렇 듯 다양한 언어들의 영향을 받아 역시 다중 패러다임을 지향합니다.

처음에는 일본내에서만 사용하였고 그렇게 인기있는 언어는 아니었습니다.

문서들을 점점 영문으로 번역하기 시작했고 해외 Geek들이 관심을 가지며 사용하다 점점 그 수가 기하급수적으로 늘어났습니다.

루비 공홈에는 2006년도에 급격하게 늘어났다고 말하고있습니다.

여기에는 복합적인 이유가있겠지만 아마도 크게 두개로 볼 수 있지않을까 싶습니다.

Andrew Hunt, David Thomas가 “실용주의 프로그래머”에서 Perl 대신 Ruby를 언급 한 것과 Rails라는 웹 애플리케이션 프레임워크의 등장.

이 두가지가 아닐까 개인적으로 생각하고있습니다.

Rails에 대한 비하인드 스토리가 조금 있습니다.

PHP개발을 하다 회의감을 느낀 DHH(David Heinemeier Hansson)라는 개발자가 Rails라는 웹 애플리케이션 프레임워크를 Ruby로 작성했습니다.

Rails 는 엄청난 인기를 얻었고 많은 유저들의 사랑을 받았습니다.

이를 뒷 받치는 것이 현재의 루비는 웹 프로그래밍 중심으로 축이 조금 기울어져있다고 보면 됩니다.

DDH 79년 생이네요. 현재는 basecamp 에서 CTO를 하고있습니다.

앞으로 ROR(Ruby on Rails)도 해당 포스팅에서 다룰 예정입니다.

마츠는 루비가 스트레스가 없는 쉬운 프로그래밍이고, 루비는 우리의 삶을 반영해야 하며, 프로그래밍 언어는 컴퓨터가 아닌 인간 중심으로 설계되어야 한다고 말했습니다. 쉽게말해 기계가 아닌 사람을 위하는 프로그램을 만들고싶다. 이것이 루비의 모토입니다.

자신들을 한 문장으로 아래와 같이 표현하고있습니다.

루비 : 프로그래머의 단짝 친구(Ruby-Programmer’s Best Friend)

루비는 진입장벽이 타 언어에 비해 매우 낮고 배우고 쉬운 언어입니다.

예전 루비와 파이썬을 두고 어떤 것을 스터디할지 고민하다 파이썬을 선택했었습니다.

그런데 이번에 일본 개발자들과 협업할 기회가 생겼습니다만 .. 루비를 사용하게되었습니다.

그래서 이번기회에 배우고 즐겨보자라는 생각으로 임하고있습니다^^.

일본에서는 프로그래밍 언어로 루비를 많이 사용하고있습니다.

특히 웹은 물론 프론트, 백엔드 심지어 임베디드까지 안쓰는 곳이 없을 정도로 다방면에 절찬리 쓰이는 중입니다.

반면에 한국에서는 루비 개발자가 별로없습니다.

그래도 요즘은 스타트업 회사들이 루비를 빠른 개발을 위해 루비를 많이 채택하고있습니다.

루비는 제가 태어난 해1995년에 출시되었습니다.

1995년도에 개발된 대표적인 프로그래밍 언어는 5개가있습니다. (델파이 빼고 다 해보고있네요..)

루비의 영원한 라이벌 파이썬은 91년도에 나왔습니다.

  • 자바
  • 자바스크립트
  • php
  • 루비
  • 델파이 (오브젝트 파스칼)

프로그래밍 언어의 역사는 매우 깁니다.

어릴때 배운 C는 제가 태어나기 한참 전인 68년도에 발표되었습니다.

하지만 아직도 우리는 C, 파스칼등 오래된 프로그래밍 언어를 많이 사용합니다.

지금도 수 많은 방법론으로 새로운 체계의 언어들이 나오고 사라집니다. 하지만 그 본틀을 절대 바뀌지않습니다.

언어의 영향을 받지않고 유연하게 프로그래밍하는 개발자가 저는 개인적으로 멋있다고 생각합니다.

루비는 어떤 장단점이 있는지 알아보겠습니다.

장점

  • 1. 확장성과 이식성
    • 유지보수 비용과 시간을 절약할수있다. 대부분 GNU Linux에서 개발되었지만 대부분의 UNIX, 맥 OS X, Windows 95/98/Me/NT/2000/XP, DOS, BeOS, OS/2 등에서 동작합니다.
  • 배우기 쉽고, 코딩의 재미
    • 루비는 타 언어보다 상대적으로 배우기 쉬우며 구문등이 간결하고 신박하여 코딩할때 조금 더 재미를 느낄수있다.

단점

  • 성능
    • 1 .9까지는 단순반복만 했을 때는 C가 1이라면 Python이 3~5정도, 루비가 10정도로 느리다. 최근에는 굉장히 빨라졌으며, 최근 LLVM으로 컴파일해서 속도를 획기적으로 늘리는 방안이 제안되었다. 하지만 아직까지는 대규모 서비스에 적용하는 것은 무리가있고 빨리 결과물내서 시장의 반응을 봐야하는 스타트업에서 사용하기 적합하다.

루비가 꼭 큰 서비스에 적합하지않은 것 은아니다.

우리가 알고있는 큰 서비스들에서도 사용되고있고 서로 재각기 다른 성능개선 방법을 찾아서 사용하고 있을 것 입니다.

현재 루비를 사용하고있는 서비스들은 아래와 같다.

  1. Hulu
  2. Groupon
  3. LivingSocial
  4. Twitter
  5. SoundCloud
  6. ZenDesk
  7. Scribd
  8. YellowPages
  9. Basecamp
  10. Shopify
  11. Urban Dictionary
  12. SlideShare
  13. Github

루비를 배움에 있어서 책 구매의사는 자신의 몫이지만, 전 따로 구매하지않았습니다.

코드 아카데미[tutorialspoint](http://www.tutorialspoint.com/ruby/ruby_ranges.htm)를 참고하면 공부에 도움 되실겁니다.

따로 책 구매를 구매하실 의향이있다면 프로그래밍 루비를 추천해드립니다.

설치

**
**

윈도우를 사용하고있다면 인스트롤러를 통하여 설치할 수 있습니다.

UNIX-계열의 운영체제를 사용하신다면, 운영체제의 패키지 관리자를 통해서 실치해봅시다.

우분투 기준으로 아래 명령어를 실행하여 설치합니다.

$ sudo apt-get install ruby-full

글을 쓰는 시점에서, ruby-full 패키지는 루비 1.9.3을 설치합니다. 이 버전은 Debian이나 Ubuntu의 오래된 안정 버전입니다.

위의 방법들이 처음에 쉽게 사용할 수 있는 방법이니 어려우신분을은 위의 방법으로 설치하시길 바래요.

앞으로 2.0과 1.9.3버전을 다룰 예정입니다.

2.0에서 달라진 점은 1.8과 1.9의 변화의 비하면 비교적 적은편입니다.

저는 RVM을 통해서 설치해보겠습니다.

RVM은 _Ruby Version Manager_의 약자입니다.

루비의 설치 과정을 간소화시켜주는 동시에 여러버전의 루비를 쉽게 관리할수있는 스크립트입니다.

현재 시스템의 여러가지의 루비 버전이있다고 가정하고 위의 패키지 관리자를 통해 설치할 경우 환경변수가 꼬이는 순간 멘탈이 무너질수있으니 이 점 유의하시길 바랍니다. 그리고 본인 우분투에 Curl이 설치되어있어야합니다.

rbenvrvm은 다르다. rvm이 먼저 출시되었습니다.

어떤게 더 좋을까요?

rvm이 일단 여러면에서 rbenv 보다 간단합니다.

안정된 RVM 버전을 받아주시구요.

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3\curl -L https://get.rvm.io | bash -s stable

이후, source 명령어를 실행합니다.

source ~/.rvm/scripts/rvm

해당 경로에서 파일을 찾을 수 없을 경우, /usr/local/rvm으로 시도해보시길 바랍니다.

rvm requirements

해당 명령어를 실행해주면 RVM 설치는 끝났습니다.

이제 RVM을 통해서 쉽게 루비를 설치합니다.

rvm install ruby

가장 최근 버전의 루비가 설치됩니다.

혹여 여러가지 버전들과 충돌이 나지않게 기본 버전을 설정합니다.

루비 1.9 이상부터 RubyGems가 내장되어있습니다.

낮은버전이라면 따로 RubyGems를 설치해야합니다.

RubyGem이란 Ruby library를 배포_하고 사용하는 _표준화 패키징 및 설치 프레임워크 입니다.

node에서 사용하는 npm, php에의 composer, MS의 Nuget 과 비슷합니다.

나중에 자신만의 Gem(보석)을 만들어, RubyGem의 업로드해보는것도 좋을 것 같다.

rvm use ruby --default

“Hello, World” 를 Ruby 를 통해서 출력해보자.

Ruby 에서는 화면에 출력 데이터 출력하는 메소드가 3개(‘p’,’print’,’puts’)가 있다.

차이점은 아래와 같다.

  1. p : 문자열화 해서 출력 후 줄 바꿈
  2. puts : 출력 후 줄 바꿈
  3. print : 출력
puts 'Hello, world!' # Print out "Hello world"

이렇게 루비에 대해 짧게 끄적여봤다. 도움이 조금 이라도 되었으면 좋겠다.

루비 단점에 한가지를 더 추가해야할 것 같다. 호환성.. 문제가 좀 있다.

루비를 지원하는 IDE(개발통합환경) 가 많이 존재한다.

어떤 것이 Rubyists들에게 인기가 많은지 검색해 보았다.

아래는 100명의 루비 개발자들에게 설문을 토대로 순위를 매겨본 자료다.

  1. No IDE (Rubyists not favoring IDEs)
  2. RubyMine
  3. Aptana Studio
  4. IntelliJ IDEA
  5. Kuso IDE

셀 프롬프트 사용에 익숙한 리눅스또는 유닉스 체제 이용들한테 좀 유리할수있겠다.

jetbrains에서 지원하는 RubyMine은 현재 유료입니다.

설치하려 들어가니 감성을 자극하는 문구를 발견..

The drive to develop Create Anything

30일 무료 체험판을 지원하고있다. 한번 사용해봐야겠습니다.

아니면 저 처럼 아톰을 사용하시는 것도 추천드립니다.

지금 채 3분도 안되는 시간동안 살펴보니 UI/UX는 불편함을 느끼지못하겠고 현재까지는 꽤 만족하고있다.

Cloud IDE 도 한번 사용해보세요.

아래 링크를 참고하시길 바래요.

http://blog.hax0r.info/680

마침

**
**

대략적인 큰 그림으로 띄엄띄엄 설명했습니다.

다음 시간에는 객체, 클래스, 변수에대해서 알아볼 예정입니다.

피드백 사항이나 궁금하신점은 따로 메일([email protected]) 보내주세요.

부족한 글 읽어주셔서 감사합니다.

참고 자료

  1. How To Install Ruby on Rails on Ubuntu 12.04 LTS (Precise Pangolin) with RVM
  2. RVM and rbenv
  3. Installing RVM
  4. Rubygems-guides
  5. Which IDEs do Rubyists Use?
  6. What internet companies use Ruby?

Comments