[ruby] 루비 언어 입문하기
루비(ruby)는 마츠모토 유키히로(마츠)가 개발한 동적 객체지향 스크립트 프로그래밍언어다. 1995년 개발된 루비는 레일즈(rails)라는 웹 어플리케이션 프레임워크가 개발되면서 상승세를 탔다. 2020년 12월 현재 TIOBE 점유율 15위를 기록하고 있다.
1. 튜토리얼
루비는 파이썬처럼 대화형 셸을 제공하며, 이를 통해 간단한 테스트를 해볼 수 있다.
macOS에서는 터미널을 실행하여 irb
를 입력하면 대화형 루비 셸을 실행할 수 있다.
다음은 name
파라미터를 받아 문자열을 출력하는 함수 h 다.
irb(main):015:0> def h(name)
irb(main):016:1> puts "Hello #{name}!"
irb(main):017:1> end
=> :h
irb(main):018:0> h("SY")
Hello SY!
=> nil
함수의 정의는 def
로 시작하여 end
로 끝난다.
1.1 클래스의 정의와 객체 생성하기
irb(main):024:0> class Greeter
irb(main):025:1> def initialize(name = "World")
irb(main):026:2> @name = name
irb(main):027:2> end
irb(main):028:1> def say_hi
irb(main):029:2> puts "Hi #{@name}!"
irb(main):030:2> end
irb(main):031:1> def say_bye
irb(main):032:2> puts "Bye #{@name}, come back soon."
irb(main):033:2> end
irb(main):034:1> end
=> nil
클래스의 정의는 class
키워드를 사용한다.
@name
은 인스턴스 변수로서 모든 메서드에서 접근 가능하다.
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
루비에서는 위와 같이 변수명 = 클래스명.new()
를 통해 인스턴스를 생성한다.
생성된 인스턴스를 통해 메서드에 접근할 수 있으며, g.@name
을 통한 인스턴스 변수에 직접접근은 불가능 하다.
1.2. 파일코드를 통한 클래스 작성
ri20min.rb
#!/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", "Engelbert"]
mg.say_hi
mg.say_bye
# Change to nil
mg.names = nil
mg.say_hi
mg.say_bye
end
[참고] 루비에서 #
으로 시작하는 줄은 주석이다.
위 코드의 실행결과는 다음과 같다.
Hello World!
Goodbye World. Come back soon!
Hello Zeke!
Goodbye Zeke. Come back soon!
Hello Albert!
Hello Brenda!
Hello Charles!
Hello Dave!
Hello Engelbert!
Goodbye Albert, Brenda, Charles, Dave, Engelbert. Come
back soon!
...
...
say_hi
메서드를 확인해보자.
def say_hi
if @names.nil? # (1)
puts "..."
elsif @names.respond_to?("each") # (2)
# @names is a list of some kind, iterate!
@names.each do |name|
puts "Hello #{name}!"
end
else # (3)
puts "Hello #{@names}!"
end
end
(1) @names
가 nil(null)일 경우, …을 출력
(2) @names
가 each
에 반응할 경우, 반복문 수행
(3) 그렇지 않으면 Hello @names
! 출력
이터레이션
(2) 에 해당하는 영역을 자세히 확인해보자.
@names.each do |name|
puts "Hello #{name}!"
end
each
는 코드 블록을 받아와서 리스트의 원소에 순차적으로 적용시키는 메서드이며,
do
와 end
사이가 블록이며 |
사이의 변수는 블록에 넘겨지는 파라미터이다.
튜토리얼 코드는 https://www.ruby-lang.org/ 의 루비 20분 가이드를 참고했다.
2. java와 ruby의 유사점과 차이점
유사점
- 메모리는 가비지컬렉터에서 관리.
- 객체는 강(strongly) 타입이다.
- public, private, protected 접근자가 있다.
- 내장화된 문서화 툴이 있다. (RDoc)
차이점
- 자바는 컴파일이 필요하지만 루비는 인터프리터 형식으로 실행.
- 코드블록 정의시 중괄호 대신
end
키워드를 사용. import
대신require
사용.- 모든 멤버변수는
private
이다. - 메서드 호출시 괄호는 대체로 생략한다.
- 완전 객체지향으로
Primitive
(원시) 타입이 없다. (숫자도 객체) - 정적 타입 체크가 없음.
- 변수 선언시 타입을 지정하지 않음.
- 형변환이 없음 (메서드 호출)
- 인스턴스 생성 시 자바는
Foo foo = new Foo("hi")
라면 루비는foo = Foo.new("hi")
- 생성자는
initialize
로 정의. - 인터페이스 대신
mixins
사용. null
대신nil
사용.==
과equals()
의 취급이 반대. 루비에서는==
는 값이 같은지 체크하고,equal?()
를 통해 동일 객체인지 확인한다.
Comments