Ruby in Detail

Oct. 2010 written by 이주형 (Lee Ju Hyung)

객체와 클래스

루비의 세계에선 모든 것이 객체다. 심지어 class 마져도 객체다.

  • 객체는 instance variable 을 가지며, 객체의 class 가 instance method 를 가지고 있다. (클래스가 아닌 객체와 클래스 객체와의 차이)
  • 루비의 class 는 언제라도 편집 가능한 열린 class 이며, Class class 의 instance 이다
  • 루비의 모든 코드는 객체 컨텍스트안에서 실행된다. (self 는 현재 실행중인 코드의 객체 컨텍스트를 나타낸다)

실행 결과

class 실행문 안에서 실행되는 루비코드들도 모두 해당 class 객체 컨텍스트 안에서 실행되게 된다.

실행 결과

객체의 instance method 는 그 객체의 클래스 (or 메타 클래스) 가 가지고 있다. 다시 말해 어떤 객체의 method 를 호출 한다는 것은
그 클래스 (or 메타 클래스) 의 instance method 를 호출하는 것이다.

메타 클래스 실험..

실행 결과

모듈 또한 mix-in 하게 되면 내부적으로는 익명의 프록시 클래스 객체가 만들어지고, mix-in 된 클래스의 직접적인 상위 클래스로 끼워넣어진다.

리터럴 생성자를 가지는 내장 클래스

클래스 리터럴 생성자
String 겹 따옴표(“) 혹은 홑 따옴표(‘) “new string” or ‘new string’
Symbol 맨 앞의 콜론(:) :symbol or :”symbol with spaces”
Array 각괄호([]) [1, 2, 3, 4, 5]
Hash 중괄호({}) {“Korea” => “KR”, “Japan” => “JP”}
Range 두 개 혹은 세 개의 점(.) – 세 개의 점은 마지막 요소를 제외 0..9 or 0…10
Regexp 슬래시(/) /[a-z]+/

연산자 우선순위

연산자 의미
:: 범위(scope) 분해
[] 첨자
+(단항), !, ~ 양의 부호, 논리 부정, 비트반전
** 제곱승
-(단항) 음의 부호
*, /, % 곱셈, 나눗셈, 나머지연산
+, – 덧셈, 뺄셈
<<, >> 좌측 비트 시프트/데이터 출력, 우측 비트 시프트/데이터 입력
& 비트곱(AND)
|, ^ 비트합(OR), 배타적 비트합(XOR)
>, >=, <, <= 대소 비교
<=>, ==, ===, !=, =~, !~ 비교, 같음, case같음, 같지 않음, 패턴매치, 패턴비매치
&& 논리곱(AND)
|| 논리합(OR)
.., … 범위 생성
? : 조건 연산자
=, +=, -=, []=, 등 대입
not 논리부정
and, or 논리곱, 논리합

배열 전개 (1.8 기준)

같은 원리로 메소드의 가변길이 매개변수에 적용할 수 있다

루비 클래스 내부 구조도

RubyClassInDetail

내장된 기본 클래스들의 주요 메소드

Class < Module < Object < Kernel

Kernel

  • block_given? - 현재 문맥에서 블록을 실행할 수 있다면 true 를 반환
  • lambda - 주어진 블록으로 새로운 Proc 객체를 생성
  • local_variables
  • global_variables
  • binding - 호출 시점의 바인딩 객체 (Binding)를 생성
  • eval - 스트링을 주어진 바인딩 문맥에서 실행 (기본 바인딩은 새로운 블록과 같다고 보면될걸?)

Object

  • object_id - 정수로 된 고유 객체 번호를 반환
  • class - 객체의 클래스 객체를 반환
  • instance_of?
  • kind_of?, (aka: is_a?)
  • respond_to? - 수신자 객체가 주어진 method 에 응답하면 true 를 반환
  • method_missing - 객체에 처리할 수 없는 method 가 전달되면 루비는 이 method 를 호출해서 resolve 를 수행할 수 있다 (기본적으로는 NoMethodError 예외를 발생 시킨다)
  • method - 주어진 이름의 method 를 찾아서 Method 객체를 반환 (Method 객체는 수신자 객체와 바인딩이 된 형태)
  • send - 수신자 객체에 method symbol 과 매개변수와 블록을 넘겨 method 를 실행
  • extend
  • instance_variables - 수신자 객체의 인스턴스 변수 이름들을 배열로 반환
  • instance_variable_get/set - 수신자 객체의 인스턴스 변수 값을 반환/설정
  • instance_eval - 수신자 객체의 문맥에서 스트링이나 블록을 실행
  • remove_instance_variable (Private)
  • methods (aka: public_methods) - 수신자 객체에 public 으로 접근할 수 있는 method 들을 Array 로 반환
  • protected_methods - 수신자 객체에 protected 로 접근할 수 있는 method 들을 Array 로 반환
  • private_methods - 수신자 객체에 private 로 접근할 수 있는 method 들을 Array 로 반환
  • singleton_methods
  • singleton_method_added (Private)
  • singleton_method_removed (Private)
  • singleton_method_undefined (Private)

Module

  • name - 모듈의 이름을 반환
  • class_eval (aka: module_eval) - 수신자 클래스 객체의 문맥에서 스트링이나 블록을 실행 (클래스에 method 등을 추가할 때 사용할 수 있다)
  • class_variable_get/set
  • class_variables
  • remove_class_variable (Private)
  • constants
  • const_defined?
  • const_get/set - 주어진 객체에 상수 값을 반환 or 설정
  • const_missing - 정의 되지 않은 상수를 참조했을때 자동으로 호출되는 콜백 함수 (임의의 상수의 기본값을 정해줄 수 있다)
  • remove_const (Private)
  • include (Private) - 모듈을 포함
  • include?
  • included (Private) - 모듈 객체가 다른 모듈이나 클래스에 include 되면 자동으로 호출되는 콜백 함수
  • included_modules
  • extended (Private)
  • extend_object (Private)
  • instance_method - 클래스의 instance method 를 UnboundMethod 의 객체로 반환 (다른 객체와 bind 해서 Method 객체로 변환 후 call 가능)
  • private_class_method
  • public_class_method
  • define_method (Private) - 수신자에 instance method 를 정의
  • remove_method (Private)
  • undef_method (Private)
  • method_added (Private)
  • method_removed (Private)
  • method_undefined (Private)
  • method_defined?
  • alias_method (Private)
  • attr_accessor (Private) - readable/writable 접근자 함수를 만든다
  • attr_reader (Private) - readable 접근자 함수를 만든다
  • attr_writer (Private) - writable 접근자 함수를 만든다
  • private (Private) - 매개변수가 없으면 이후로 정의하는 method 가 private 가 되도록 기본 접근을 바꾼다. 매개변수가 있으면 주어진 이름의 method 들을 모두 private 로 설정한다
  • protected (Private) - 매개변수가 없으면 이후로 정의하는 method 가 protected 가 되도록 기본 접근을 바꾼다. 매개변수가 있으면 주어진 이름의 method 들을 모두 protected 로 설정한다
  • public (Private) - 매개변수가 없으면 이후로 정의하는 method 가 public 가 되도록 기본 접근을 바꾼다. 매개변수가 있으면 주어진 이름의 method 들을 모두 public 로 설정한다
  • instance_methods - 클래스의 접근 가능한 instance method 들을 Array 로 반환
  • public_instance_methods - 클래스의 public instance method 들을 Array 로 반환
  • private_instance_methods - 클래스의 private instance method 들을 Array 로 반환
  • protected_instance_methods - 클래스의 protected instance method 들을 Array 로 반환

Class

  • inherited - 다른 클래스에 서브 클래싱 됐을 경우 자동으로 호출되는 콜백 함수
  • new - 수신자 클래스 객체의 새로운 instance 를 할당하고 해당 객체의 initialize 를 호출하고 argument 들을 전달
  • superclass - 상위 클래스 객체 or nil 반환

예제

루리웹에서 카테고리 별 공략 게임 이름과 이미지 주소 리스트 뜯어오기

그 밖에 참고할 만한 자료

  1. 루비 공식 한글 홈 페이지
    http://www.ruby-lang.org/ko
  2. 루비 도큐먼트 페이지
    http://ruby-doc.org/
  3. Ruby Language Reference Manual (by Yukihiro Matsumoto)
    http://web.njit.edu/all_topics/Prog_Lang_Docs/html/ruby/index.html
  4. 루비를 메타 프로그래밍 관점에서 자세히 설명
    http://ruby-metaprogramming.rubylearning.com/
  5. Ruby's Metaprogramming Toolbox
    http://weare.buildingsky.net/2009/08/25/rubys-metaprogramming-toolbox
  6. 루비 메타 프로그래밍 동영상 강의
    http://www.infoq.com/presentations/metaprogramming-ruby
  7. 루비 포럼
    http://www.ruby-forum.com/
  8. 맥 루비
    http://www.macruby.org/
  9. Ruby On Rails
    http://rubyonrails.org/

Leave a Reply

Your email address will not be published. Required fields are marked *