[ruby] 루비 언어 입문하기

2 minute read

루비(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) @nameseach에 반응할 경우, 반복문 수행
(3) 그렇지 않으면 Hello @names! 출력

이터레이션

(2) 에 해당하는 영역을 자세히 확인해보자.

@names.each do |name|
  puts "Hello #{name}!"
end

each는 코드 블록을 받아와서 리스트의 원소에 순차적으로 적용시키는 메서드이며, doend 사이가 블록이며 | 사이의 변수는 블록에 넘겨지는 파라미터이다.

튜토리얼 코드는 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