EnglishDeutschFrançaisEspañolPortuguêsIndonesian日本語한국어简体中文繁體中文PolskiTürkçe
1 | 2 | 3 | 4

루비 20분 가이드

“Greeter” 객체를 만들어서 사용해 봅시다.

irb(main):035:0> g = Greeter.new("Pat")
=> #<Greeter:0x16cac @name="Pat">
irb(main):036:0> g.say_hi
Hi Pat!
=> nil
irb(main):037:0> g.say_bye
Bye Pat, come back soon.
=> nil

“g” 객체가 만들어진 이후에는 “Pat”이란 이름을 기억합니다. 직접 이름을 접근할 있냐구요?

irb(main):038:0> g.@name
SyntaxError: compile error
(irb):52: syntax error
        from (irb):52

보다시피 가능지 않습니다.

객체 들여다보기

객체 변는 객체 안에 숨겨져 있습니다. 사실 객체 변가 그렇게 꽁꽁 숨겨져 있는 것은 아니지만, 루비는 기본적으로 데이타를 숨겨두는 객체지향 방식을 따르고 있습니다. “Greeter” 객체에는 어떤 메서드가 들어있을까요?

irb(main):039:0> Greeter.instance_methods
=> ["method", "send", "object_id", "singleton_methods",
  "__send__", "equal?", "taint", "frozen?",
    "instance_variable_get", "kind_of?", "to_a",
    "instance_eval", "type", "protected_methods", "extend",
    "eql?", "display", "instance_variable_set", "hash",
    "is_a?", "to_s", "class", "tainted?", "private_methods",
    "untaint", "say_hi", "id", "inspect", "==", "===",
    "clone", "public_methods", "respond_to?", "freeze",
    "say_bye", "__id__", "=~", "methods", "nil?", "dup",
    "instance_variables", "instance_of?"]

메서드가 상당히 많은 것을 알 있습니다. 우리가 정한 메서드는 2개에 불과한데 어떻게 된 것일까요? 위 리스트는 “Greeter” 클스 자체 메서드 뿐만 아니라 모든 부모 클스 메서드도 포함고 있기 때문입니다. “false”를 인자로 기면 부모 클스에 정된 메서드를 제외한 리스트를 볼 있습니다.

irb(main):040:0> Greeter.instance_methods(false)
=> ["say_bye", "say_hi"]

우리 “Greeter” 객체가 어떤 메서드에 응답는지를 개별적으로 확인는 것도 가능합니다.

irb(main):041:0> g.respond_to?("name")
=> false
irb(main):042:0> g.respond_to?("say_hi")
=> true
irb(main):043:0> g.respond_to?("to_s")
=> true

즉 “g” 객체는 “say_hi”라는 이름 메서드를 가지고 있고 “to_s”라는 이름 메서드도 가지고 있지만, “name”이란 이름 메서드에 응답지는 않습니다.

클스 정 변경기

만약 객체 변 ”@name” 내용을 확인고 변경고 싶다면 어떻게 해야 할까요? 루비는 객체 변를 접근게 해주는 편리한 방법을 제공고 있습니다.

irb(main):044:0> class Greeter
irb(main):045:1> attr_accessor :name
irb(main):046:1> end
=> nil

루비에서는 클스를 언제 열어서 정를 변경할 있습니다. 새로운 객체를 만들어서 ”@name”에 접근해봅시다.

irb(main):047:0> g = Greeter.new("Andy")
=> #<Greeter:0x3c9b0 @name="Andy">
irb(main):048:0> g.respond_to?("name")
=> true
irb(main):049:0> g.respond_to?("name=")
=> true
irb(main):050:0> g.say_hi
Hi Andy!
=> nil
irb(main):051:0> g.name="Betty"
=> "Betty"
irb(main):052:0> g
=> #<Greeter:0x3c9b0 @name="Betty">
irb(main):053:0> g.name
=> "Betty"
irb(main):054:0> g.say_hi
Hi Betty!
=> nil

“attr_accessor”은 두개 메서드를 새로 정는데, “name”은 객체변 값에 접근기 위해서이고 “name=”은 객체변 값을 변경기 위해서입니다.

Mega Greeter

이번에는 여러 명 사람에게 인사를 할 있는 “Mega Greeter”를 한번 만들어 보도록 합시다.

이번에는 IRB 루비 인터랙티브 해석기를 사용는 대신에 별도 파일에 코드를 작성해봅시다.

IRB에서 빠져기 위해서는 “quit” 는 “exit”이라고 입력거 Control-D를 누르면 됩니다.

#!/usr/bin/env ruby

class MegaGreeter
  attr_accessor :names

  # Create the object
  def initialize(names = "World")
    @names = names
  end

  # Say hi to everybody
  def say_hi
    if @names.nil?
      puts "..."
    elsif @names.respond_to?("each")

      # @names is a list of some kind, iterate!
      @names.each do |name|
        puts "Hello #{name}!"
      end
    else
    puts "Hello #{@names}!"
    end
  end

  # Say bye to everybody
  def say_bye
    if @names.nil?
      puts "..."
    elsif @names.respond_to?("join")
      # Join the list elements with commas
      puts "Goodbye #{@names.join(", ")}. Come back soon!"
    else
      puts "Goodbye #{@names}. Come back soon!"
    end
  end

end

if __FILE__ == $0
  mg = MegaGreeter.new
  mg.say_hi
  mg.say_bye

  # Change name to be "Zeke"
  mg.names = "Zeke"
  mg.say_hi
  mg.say_bye

  # Change the name to an array of names
  mg.names = ["Albert", "Brenda", "Charles",
    "Dave", "Englebert"]
  mg.say_hi
  mg.say_bye

  # Change to nil
  mg.names = nil
  mg.say_hi
  mg.say_bye
end

위 파일을 “ri20min.rb”로 저장을 고, “ruby ri20min.rb”라고 입력해서 실행을 시킵니다. 결과는 다음과 같아야 합니다.

Hello World!
Goodbye World. Come back soon!
Hello Zeke!
Goodbye Zeke. Come back soon!
Hello Albert!
Hello Brenda!
Hello Charles!
Hello Dave!
Hello Englebert!
Goodbye Albert, Brenda, Charles, Dave, Englebert. Come
back soon!
...
...

이번 제에는 새로운 내용들이 여럿 있으므로 다음에서 씩 자세히 살펴보도록 합시다.


forum.rubykr.org rubyforge.org rpple.ikspres.com rubyforge.org rubyforge.org radiantcms.org rubyforge.org tryruby.hobix.com rubyforge.org