저번 글에서 만들어 두었던 class의 객체를 생성합시다.
g 객체를 한번 생성하면 그 이름이 Pat이라는 것을 기억하는군요. 흠.. 만약에 name 변수에 직접 접근하면 어떻게 될까요?
오호.. 안되는 군요..
Under the Object’s Skin
인스턴스 변수들은 항상 객체 속안에 숨겨져 있습니다. (인스턴스 변수는 @name 과 같이 @를 붙여서 만드나 봅니다.) 심하게 감춰져 있지는 않고 객체를 조사해보면 그들에게 접근 할 수 있는 다른 방법들이 존재합니다만…Ruby는 data를 숨기기 좋은 객체 지향 접근법을 사용합니다.
그럼 Greeter 객체 안에는 어떤 메소드들이 있을까요?
와오.. 엄청나게 많네요. 여기 보이는 메소드들은 Greeter 객체가 가지고 있는 모든 메소드입니다. 조상(부모도 포함됐겠죠? :)으로 부터 받은 많은 메소드들도 포함되어 있습니다. 만약에 우리가 만든 method들만 보고 싶다면 조상들에게 정의되어 있는 메소드를 보길 원치 않는 다는 의미로 false를 파라미터로 넘겨주면 됩니다.
자 그럼 이제 어떤 method들이 우리가 가진 객체가 반응을 하는지 봅시다:
say_hi와 to_s(어떤 것을 string으로 바꿔주는 method군요. 기본적으로 모든 객체들이 가지고 있습니다.) 그러나 name이란 메소드는 모르네요.
Altering Classes—It’s Never Too Late
만약에 name을 바꾸거나 보고 싶다면 어떻게 해야할까요? Ruby는 객체의 변수에 접근할 수 있는 쉬운 방법을 제공합니다.
Ruby에서는 class를 다시 열어서 수정을 할 수 있습니다. 기존에 이미 만들어져 있는 객체들은 바뀌지 않지만 이 후에 새로 만들어지는 객체들은 영향을 받습니다. 그래서 이제 새로운 객체를 만들고 @name 속성을 가지고 놀아봅시다.
attr_accessor 을 사용해서 getter에 해당하는 name과 setter에 해당하는 name= 두개의 메소드를 정의했습니다.
Greeting Anything and Everything, MegaGreeter Neglects None!
이 greeter 는 그다지 흥미롭지 않군요. 이 class는 오직 한번에 한사람만 다루는데요 여러 사람들에게 인사를 하는 class를 만들 순 없을까요?
그렇게 할 수 것을 Ruby interpreter인 IRB에 직접 쓰는 대신에 파일로 만들어 봅시다.
IRB를 끝내기 위해서 “quir”이나 “exit” 또는 그냥 컨트롤+D 를 입력합니다.
C:Documents and Settingskeesun>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 @name.respond_to?(“each”)@name.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
endend
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
cmd창을 열고 위처럼 입력한 뒤
컨트롤 + c를 입력하면 위에 입력한 것을 바로 처리합니다.
Goodbye world. Come back soon!
Hello Zeke!
Goodbye Zeke. Come back soon!
Hello AlbertBrendaCharlesDaveEnglebert!
Goodbye Albert, Brenda, Charles, Dave, Englebert. Come back soon!
…
…
위와 같은 결과를 보셨다면 제대로 된 것입니다.
윈도우의 도스창에서 바로 실행시키지 않고.
위의 코드를 ri20min.rb 라고 저장한 뒤 ruby ri20min.rb 를 이용하여 실행하여도 같은 결과를 볼 수 있습니다.