본문 바로가기
CS/Languages

[Ruby] Ruby 20분 가이드

by seoyamin 2025. 2. 1.

* 해당 게시글은 Ruby 공식 문서를 바탕으로 학습한 후 개인적으로 정리한 내용을 담고 있습니다.

https://www.ruby-lang.org/ko/documentation/quickstart/

 

Ruby 20분 가이드

소개 이 문서는 20분 정도면 따라 해볼 수 있는 간단한 Ruby 튜토리얼입니다. 이 튜토리얼을 따라 하기 위해서는 컴퓨터에 Ruby가 설치되어 있어야 합니다. (아직 Ruby가 설치되어 있지 않다면, 시작

www.ruby-lang.org

 

1. 출력

Ruby는 데이터를 화면에 출력할 때 puts라는 메서드를 이용한다.

 

irb(main):002:0> puts "Hello World"
Hello World
=> nil

 

 

2. 계산

간단한 Ruby의 수 계산 연산자는 아래와 같다.

특히 제곱근을 구할 때 사용하는 Math는 메서드 컬렉션인 '모듈'에 해당한다.

 

  • 곱셈 : *
  • 거듭제곱 : **
  • n의 제곱근 : Math.sqrt(n)
irb(main):004:0> 3*2
=> 6

irb(main):005:0> 3**2
=> 9

irb(main):006:0> Math.sqrt(9)
=> 3.0

 

 

3. 메서드

3.1. 메서드 정의

메서드를 정의할 때는 def...end 구조를 이용한다.

 

def say_hello
  puts "hello world"
end

say_hello		# hello world

 

3.2. 매개 변수 사용

매개 변수가 존재하는 메서드는 아래와 같이 정의한다.

이때, Python과 유사하게 매개 변수가 별도로 입력되지 않는 경우 default값을 지정할 수 있다.

 

def say_this(this = "default")
  puts "hello #{this}"
end

def say_this(this)
  puts "hello #{this}"
end

def say_capitalized_this(this)
  puts "hello #{this.capitalize}"
end


say_this				# hello default
say_this("mindong")			# hello mindong
say_capitalized_this("mindong")		# hello Mindong

 

 

4. 객체

4.1. 객체 정의

Greeter라는 객체를 만드는 예제는 아래와 같다.

인스턴스 변수인 @name을 정의하고, 각 메서드에서 활용하고 있는 것을 볼 수 있다.

 

class Greeter
  def initialize(name = "default")
    @name = name
  end

  def say_hi
    puts "hi #{@name}\n"
  end

  def say_bye
    puts "bye #{@name}\n"
  end
end

g = Greeter.new("mindong")
g.say_hi				# hi mindong
g.say_bye				# bye mindong

 

 

4.2. 객체 내 메서드 확인

Ruby의 객체 내에 어떠한 메서드들이 존재하는지 확인하는 방법은 아래와 같다.

우리가 정의한 say_hi, say_bye 외에도 모든 상속된 메서드가 출력된다.

 

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?"]

 

 

부모 클래스에 정의된 메서드를 제외하고 출력하려면 false를 인자로 넘기면 된다.

 

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

 

 

객체가 어떤 메서드에 응답하는지 개별 확인도 가능하다.

 

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

 

 

4.3. 클래스 정의 변경

attr_accessor를 이용하면 클래스 내 정의를 변경할 수 있다.

 

class Greeter
  attr_accessor :name
  
  def initialize(name = "default")
    @name = name
  end

  def say_hi 
    puts "hi #{@name}\n"
  end

  def say_bye
    puts "bye #{@name}\n"
  end
end

g = Greeter.new("mindong")
g.say_hi						# hi mindong

g.name = "minwoo"
g.say_hi						# hi minwoo

 

 

4.4. 실행 파일 예제

*.rb 형태의 실행 파일로 Ruby 코드를 구성하는 예제이다.

ruby test.rb 명령어로 해당 파일을 실행할 수 있다.

 

이때 __FILE__은 현재 파일명이 저장된 특수한 변수이며, $0은 현재 프로그램을 시작한 파일명이 저장된 변수이다.

if __FILE__ == $0 구문은 '현재 파일이 메인 파일로 사용된 것이라면 ~'의 의미를 갖는다.

 

#!/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!
...
...

 

 

5. 조건문

Ruby의 조건문은 Python과 많이 닮아있다.

if...elsif....else 형식을 사용한다.

 

def say_hi
  if @names.nil?
    puts "..."
  elsif @names.respond_to?("each")
    @names.each do |name|
      puts "Hello #{name}!"
    end
  else
    puts "Hello #{@names}!"
  end
end

 

 

6. 반복문과 블록

만약 객체가 each에 반응한다면, 해당 객체의 내용물에 순차 접근이 가능하다.

 

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

 

위의 예제에서 do...end 부분은 블록이다. 블록은 마치 lambda 함수처럼 동작한다.

| name | 은 블록의 매개 변수로 name이 넘겨진다는 의미이다.

 

def say_bye
  if @names.nil?
    puts "..."
  elsif @names.respond_to?("join")
    puts "Goodbye #{@names.join(", ")}.  Come back soon!"
  else
    puts "Goodbye #{@names}.  Come back soon!"
  end
end

 

블록은 객체의 타입과 관계없이 해당 객체가 어떤 메서드를 갖고 있는지에만 의존한다.

이러한 특성을 덕 타이핑(Duck Typing)이라고 한다.

'CS > Languages' 카테고리의 다른 글

[Ruby] Ruby에 대해서  (0) 2025.02.01
[Node.js] node.js 관련 개념  (0) 2022.06.29
[React Native] 개발 환경 설정하기  (0) 2022.06.22
[Vue.js] 기초 #3  (0) 2021.09.07
[Vue.js] 기초 #2  (0) 2021.09.03