[[TableOfContents]] = 1 루비의 세계에 온 것을 환영합니다. = 이 절에서는 여러분이 루비 언어를 공부하기 위해 필요한 루비 언어의 문법적인 사항(syntactic sugar)들과 언어적인 제한 사항(linguistic misfortunes)들을 최대한 간략하게 소개하려고 합니다. 만약 여러분이 자신을 루비 구루라고 생각하거나, 어떤 이유로는 언어 강좌를 싫어한다거나, 지난 밤에 Holiday Inn Express에서 묵으셨다면(또는 그러려고 했지만 자금 문제로 포기했던 경우에도) 이 절을 건너뛰어도 좋습니다. == 루비의 기본 개념 == 루비는 객체 지향 언어이지만, 여러분이 C++ 혹은 다른 부정확한 객체 지향 언어(unfortunate excuse for an object-oriented language)를 사용해 왔었기 때문에 이 절에서 설명할 내용을 모두 이해하고 있을 것이라고 판단하여 이 절을 건너뛰기 전에 잠시만 멈춰 최소한 다음 한 문장 만이라도 읽어주길 바랍니다. 루비에서는 여러분이 조작하는 '''모든 것'''은 객체입니다. 모든 것이라는 말은 객체 간의 연산에 의한 결과 조차도 객체라는 것을 뜻합니다. 이러한 접근법은 원시 자료형(primitive types)을 가지거나 아무런 값도 반환하지 않는 문장(statement)을 가진 C++나 자바와는 다른 것입니다. 만약 여러분이 객체 지향 프로그래밍(혹은 프로그래밍 자체)에 익숙하지 않다면, 이것은 전혀 다른 이야기입니다. 루비 코드를 작성할 때나 일반적인 객체 지향 코드를 작성하는 경우에는, 여러분이 코드에서 처리하고 싶은 과정을 표현하기 위한 모델을 작성하는 것이 중요합니다. 예를 들어 요리법을 알려주기 위한 프로그램을 작성하는 경우라면, 여러가지 조리법에 대한 목록을 작성하고 싶을 것입니다(내 추론이 놀랍지 않나요?). 그리 객체 지향적이지 않은 방식으로 모델링하게 되면, 여러분은 아마도 여러 가지 데이터들을 저장하기 위한 몇 가지 종류의 목록들을 사용할 것이며 이들 각각의 데이터에 대한 위치를 파악하기가 매우 힘들어 질 것입니다. 객체 지향 프로그래밍은 이러한 작업을 간편하게 처리해 주며, 필요한 요소들을 모델링하기 위해 클래스와 객체들을 생성할 수 있도록 해 줍니다. 위의 예제에서 여러분은 문자열 타입의 name 속성과 author 속성을 가지며, 해시 혹은 배열 타입의 ingredients 속성을 가진 Recipe 클래스를 생성할 수 있습니다. 클래스의 목적은 여러분이 작성할 프로그램 내의 어떤 ''것''을 ''모델링''하는 것입니다. 클래스는 프로그램 내의 명사(객체)를 위한 '''기본 틀'''을 생성합니다. 클래스의 인스턴스(instance) 혹은 객체(이 두 가지 용어는 같은 의미로 사용할 수 있습니다)는 이 기본 틀을 이용하여 실제 데이터를 처리합니다. 이 예제에서 목록 내의 각 조리법에 대한 객체들은 Recipe 클래스의 인스턴스가 될 것이며, 이들은 데이터를 저장하거나, 조리법과 관련된 연산(예를 들면, 재료의 목록을 저장하거나, 목록에 재료를 추가하는 등의 작업)을 수행하거나, 일반적인 조리법에 적용되는 제한 사항(예를 들면 재료의 양을 말할 때는 숫자만을 사용한다든지 조리법에는 이름이 있어야 한다는 등의 사항)들을 적용하는 것이 가능합니다. == 루비의 자료형 == 앞에서 루비 내의 모든 것은 객체라고 했던 말은, 모든 것이 (특화된 기능이 없는) 일반적인 것이라든가, '''내장'''(built-in) 클래스가 존재하지 않는다는 말은 아닙니다. 루비는 여러분의 응용 프로그램 내의 모든 요소들을 구성하는 데 사용할 수 있는 몇 가지 내장 클래스들을 제공합니다. 이러한 타입들은 Object클래스라는 한가지 클래스로부터 파생된다는 점에서 다른 언어들과 차이를 보입니다. 이러한 구조는 C 언어와 같이 몇 가지의 기본 타입을 가진다는 것이 아니라 오직 하나의 "기본" 타입만이 존재하는 것을 의미합니다. 다음은 이러한 타입들의 특징과 사용법에 대해서 알아보기로 합니다. === 문자열 === 가장 먼저 살펴볼 자료형은 문자열 타입입니다. 이것은 단순히 일련의 문자들을 표현하기 위한 바이트의 순차적인 모임입니다. 문자열은 여러 가지 방식으로 구성될 수 있지만, 가장 일반적인 형태는 문자열 상수(string literal)를 사용하는 것입니다. 문자열 상수는 작은 따옴표나 큰 따옴표로 둘러싸인 문자들의 집합을 말합니다. 예를 들면 다음과 같습니다. {{{puts 'Hello, Darling.' → Hello, Darling. puts 'What\'s up?' → What's up? puts "A\tTab." → A tab.}}} 잠시만요! 저 안에 사용된 역슬래시는 무엇일까요? 이들은 예외 문자(escape sequence)들로 역슬래시 뒤에 영문자 하나를 붙여 일반적으로는 출력할 수 없는 문자(예를 들어, 위의 예제에서 \t는 탭 문자를 생성하기 위해 사용했지만 다른 것을 이용하면 줄바꿈 문자(new line)나 수직 탭과 같은 것들도 생성할 수 있습니다)를 생성하기 위해 사용합니다. 제가 출력할 수 없는 문자라고 했던 것은 두 번째 문장에서 작은 따옴표를 출력하기 위해 \'를 사용했기 때문입니다. 일반적으로 작은 따옴표 문자는 (작은 따옴표를 통해 구성된 문자열에서) 문자열의 끝을 나타내는데 사용되므로 출력할 수 없습니다. 이미 알아챈 분들도 있을테지만, 위의 예제에서 어떤 문자열에는 작은 따옴표를 사용했고 다른 것에는 큰 따옴표를 사용했습니다. 이 두 가지 표기법에는 차이점이 있습니다. 작은 따옴표를 통해 생성된 문자열은 좀 멍청해서 매우 적은 종류의 예외 문자들만을 사용할 수 있으며 (사실은 역슬래시+작은 따옴표만을 사용할 수 있답니다), 여러분이 성능을 향상시키는 데 주안점을 두고 있는 것이 아니라면 (큰 따옴표로 구성된 문자열을 작은 따옴표로 바꾸는 작업은 아마도 성능 개선 시에 시도해 볼 만한 마지막 수단일 것입니다.) 일반적으로 자주 사용되지 않습니다. 반면에 큰 따옴표를 통해 생성된 문자열은, 문자열 치환?(interpolation)을 통해 더 많은 기능을 제공합니다. 먼저, 큰 따옴표 문자열은 훨씬 더 많은 예외 문자들을 지원합니다. 위에서 보았듯이 줄바꿈 문자를 생성하기 위해 \n을, 탭 문자를 생성하기 위해 \t 등을 사용할 수 있습니다. 아래는 큰 따옴표 문자열 내에서 사용할 수 있는 모든 예외 문자를 정리해 둔 표입니다(그리 많지 않네요). |||||||| 예외 문자 || || \a || 벨 알람 || \f || 폼 피드(form feed) || || \??? || 8진수 값 || \n || 줄바꿈 || || \x?? || 16진수 값 || \r || 리턴 || || #{???} || Ruby 표현식 ???의 값 || \s || 공백 || || \e || 이스케이프(escape) || \t || 탭 || || \c?[[BR]]\C-? || 컨트롤-? || \v || 수직 탭 || || \M-? || 메타-? || \b || 백 스페이스 || || \M-\C-? || 메타-컨트롤-? || 표를 보시면 아마 큰따옴표로 묶인 문자열이 또 다른 흥미로운 기능을 제공한다는 사실을 알아채실지도 모르겠습니다 그것은 바로 (expression interpolation) <- 이겁니다... 이 얘기를 통해 간단하게 다음과 같은 생각을 해볼 수 있겠군요. 문자열에 바로 값을 집어넣을 수 있는것... (PHP에서는 간접적으로 가능했지만 루비에서는 정말 정곡 제대로 찔러주는군요) 다시 말해두겠지만 루비의 모든 요소는 다 객체이고 심지어는 결과도 객체입니다. 결국 다음과 같은것도 가능하다는 얘기지요 :) {{{ "Inches/yard: #{12*3}" → Inches/yard: 36 "#{"Tora! "*3}" → Tora! Tora! Tora! }}} 두번째 예제에서는, 루비 코드상에 존재하는 모든 것이 객체라는 것을 알아차릴 때까지는 당황스럽게 만들 것입니다. (말 그대로, 문자열 조차도 객체입니다. 문자열은 문자열 클래스나 다름 없죠). 문자열이 문자열 클래스 객체로 만들어지기 전에는 이 객체를 다른 객체처럼 부려먹을수도 있습니다. 위와 같은 경우에는, 3으로 문자열을 곱한다는것에 대해 이렇게 생각하실수도 있습니다 : 문자열을 세번 나타나도록 하는 공식...!? 한편으로는, 문자열을 만들어내는, 드물지만 근사한 방법중에 하나가 바로 구분자인 %Q 또는 %q를 사용하는 방법입니다. 이 생성자를 통한 방법으로 동작하는 방법은 알파벳 숫자나 멀티바이트 문자를 사용하지 않은 %Q 나 %q를 활용하는 것인데 다음을 보시면 이해가시리라 믿습니다. {{{ %q{Hoagies & grinders!} → Hoagies and grinders! %Q;#{"Navy beans! "*3}; → Navy beans! Navy beans! Navy beans! }}} 주의할 점이라면 %q 는 작은 따옴표가 붙은 문자열같이 다룬다는 것이고 %Q 는 큰따옴표로 묶인 문자열처럼 다룬다는 것입니다. 한마디로 문자의 크기에 따라 다르다는거죠.. 정리하자면: 작은 q는 작은따옴표, 큰 Q는, 큰따옴표입니다. 루비에서 문자열을 생성하는 또다른 방법으로는 here documents 혹은 "heredocs"라고 하는 것이 있습니다(펄 프로그래머들이여 기뻐합시다!). 이 방식은 문자열이 시작됨을 알리기 위해 << 기호 뒤에 구분자를 지정하고 문자열의 맨 끝에 지정된 구분자를 넣는 방식입니다. 예를 들면 아래와 같습니다: {{{ my_string = <