12월 162013
 

루비(Ruby)언어 정리

소스코드를 통하여 주요한 기능만 확인해보고 넘어간다.

클래스와 객체

class Car
    @@run_car = 0  # 클래스 변수 / static 변수

    attr_reader :pos    # 읽기 전용 속성(attribute)
    attr_writer :pos    # 쓰기 전용 속성
    attr_accessor :light # 읽기/쓰기 가능 속성

    def initialize(color) # 생성자
        @color = color  # @는 멤버변수 없는 것은 지역변수
    end

    def get_color
        return @color
    end

    def get_run_car
        return @@run_car
    end

    def Car.run(num)  # 클래스 메소드 | static 함수
        @@run_car += num
    end

    def id_car()  # id_car값 반환 접근자 메소드
        @id_car
    end

    def id_car=(id_car)  # pos값 쓰기 접근자 메소드
        @id_car = id_car
    end

protected # 메소드 공개 범위 (JAVA와 같음)
    def alaram
    end

private # 메소드 공개 범위 (JAVA와 같음)
    def check 
    end
end

class SuperCar < Car   # 상속
   def initialize(color)
       super(color)  # 부모 생성자 호출
   end

   def get_color
       return "red"
   end
end

supercar = SuperCar.new("blue") # 인스턴스 생성
Car.run(100) # 클래스 메소드 호출 

모듈

module Computer
    def Computer.buy(com)
        puts com + " buy"
    end

    class CPU
        def CPU.run
            puts cpu + " run"
        end
    end
end

include "computer.pb" # 외부 루비 파일 입포트
Computer.buy "Alpha"
Computer::CPU.run   # module의 class는 ::을 이용하여 접근한다.

모듈 혼합

module LeftClick
    def lclick
        puts "Left Clicked"
    end
end

module RightClick
    def rclick
        puts "Right Clicked"
    end
end 

class Mouse
    include LeftClick
    include RightClick
end

mouse = Mouse.new() # Mouse는 LeftClick, RightClick 2가지 기능이 혼합된다. (다중상속), Module은 인스턴스 생성이 불가하나 Mouse는 class이므로 가능
12월 162013
 

루비(Ruby)언어 정리

조건문

if

if Boolean [then | :]
   code1
[elsif Boolean [then | :]
   code
]...
[else
   code ]
end
  • Boolean : 식의 Return 값이 Boolean형인 결과 값
  • code1 : 조건(Boolean)이 참일 경우 실행
  • elsif : elseif 가 아니고 elsif인 것에 주의할 것

unless

if문과 반대로 작동함

unless Boolean [then | :]
   code1
[else
   code ]
end
  • Boolean : 식의 Return 값이 Boolean형인 결과 값
  • code1 : 조건(Boolean)이 거짓일 경우 실행

if/unless를 수식어 형태로 사용

puts "true" if res > 100 : 100보다 클 경우 true를 출력

puts "false" if new <= 100 : 100 이하일 경우 false를 출력

case 문

case value
when expression [, comparision]... [then | :]
   code
when expression [, comparision]... [then | :]
   code
.
.
.
[else
    code]
end

조건에 알맞는 value값에 대해 when의 조건에 맞는 것을 실행함

goal = 100
case goal
when 95..100
    puts "A+"
when 90...95
    puts "A"
when 85...90
    puts "B+"
when 80...85
    puts "B"
when 75...80
    puts "C+"
when 70...75
    puts "C"
else
    puts "F"
end

위와 같은 형식으로 Range와 함께 사용 가능

? 연산자

condition ? true : false 형식으로 이용.

예제: res = r >= 70 ? "pass" : "fail"

순환문

while

while condition [ do | : ]
   code
end 

condition의 조건이 참일 경우에만 실행

until

until condition [ do | : ]
    code
end

condition의 조건을 만족할 때 까지 실행

while/until의 수식어 형태 사용

value += 10 until value == 100

value += 1 while value < 100

for

for variable [, variable]... in collection [do | :]
    code
end

collection을 차례대로 variable에 넣으면서 code를 실행한다.

  • 예제 1
for value in 1..10
   data += value
end
  • 예제 2
for data in ["I", "love", "you"]
   puts data
end

Ruby Iterator

collection do |variable|
   code
end

collection의 내용을 variable에 하나씩 넣으면서 code를 실행. 아래는 이를 사용한 예제.

data = ["Hello", "World", "!!"]
res = ""

0.upto(grades.length - 1) do |loop_index|
    res = data[loop_index] + " "
end

puts res
  • 0.upto(n) : 0부터 n까지 순환문을 만듬
  • 10.downto(0) : 10부터 0까지 값을 감소시키며 순환
  • 2.step(11, 3) : 11까지 2부터 3씩 증가시키는 순환문 작성(예 : 2, 5, 8, 11)
  • 5.times : 5회 반복
  • data.each : data가 컬렉션이면 모든 항목들을 순서대로 가져옴
  • loop : 무한 루프 (break문을 통해서 반복문 탈출)

반복문에서 사용할 수 있는 구문

  • break : 반복문을 탈출
  • redo : 반복문의 현재 단계를 한 번 더 실행
  • next : 다음 단계를 실행함 (C++/JAVA++의 continue와 같음)
  • retry : 반복문을 처음부터 다시 시작

메소드 정의

hello란 이름의 메소드 정의

def hello
   puts "Hello World!!"
end

사용 방법은 hello라고 하는 것 만으로 가능

  • 메개변수 전달방법
def hello(name)
   puts "Hello World!!, " + name
end

hello "Gildong"
  • 가변 개수
def hello(data, *others)
    puts data + "!! Hello World!! " + others.join(", ")
end

hello "Ruby", "Gildong", "Gilsoon", "Cheolsoo"

Ruby에서 *는 배열이라는 뜻임. 파라미터를 넘길 경우에도 사용 가능

  • 메소드 값을 리턴
def sum(a, b)
    return a + b
end
  • 2개 이상의 값 리턴
def sum_minus(a, b)
    return a+b, a-b
end
arr = sum_minus(30, 20)   # 배열 형태
s, m = sum_minus(30, 20)  # 각각 리턴값이 s, m으로 리턴
  • 변수의 유효 범위

동일 이름일 경우에 매소드 내부가 최우선

  • 블록 (block)

메소드에 파라미터(Parameter)처럼 전달될 수 있는 코드를 말함, {}를 이용하여 작성

{ puts "Hello World!!" }

또는

do
   puts "Hello World!!" 
end

형태로 작성 가능함

yield문을 이용하여 블록을 실행할 수 있다.

def hello
    yield
end

hello { puts "Hello World!!" }
  • 블록에 데이터 전달
def hello
   yield "Ruby", "Gildong"
end

hello { |word1, word2| puts word1 + " Hello World!! " + word2 }

||안에 있는 변수에 차례대로 데이터가 전달된다.

  • 반복자와 함께 블록 사용
["Hello", "World", "!!"].each {|word| puts word}
4.times {puts "!"}
  • BEGIN/END 블록
BEGIN {puts "Hi "}

puts "Hello World!"

END { puts "Bye!" }

Ruby 프로그램이 메모리에 올라갈 때 BEGIN 블록이 실행 되며 종료 될 때 END 블록이 실행된다.

12월 152013
 

숫자를 쓰는 몇가지 방법

  • 3.14
  • 31415.9e-4
  • 123456789
  • 12_345_678_910
  • 0x3D3A

문자열 (아래는 같은 문자열임)

  • “Hello World”
  • ‘Hello World’
  • %q!Hello World!
  • %Q!Hello World!
  • %q/Hello World/
  • %{Hello World}

HERE 문서 기능

print << HERE
Hello 
World 
!!
HERE`

1번째 줄의 HERE부터 마지막줄 HERE까지 하나의 문자열로 봄
즉 자동으로 개행문자를 붙여 줌

상수/변수

  • 대문자 Only : 상수
  • 그 이외 : 변수

큰따옴표 문자열 안에 변수 값 삽입

puts "My name is #{name}." #{}를 이용하여 해결한다.

간단한 입출력 예제

print please enter your name: 
gets
chomp
puts "Your name is #{$_}."
  1. gets$_에 키보드로 입력한 문자열을 저장한다.
  2. chomp$_ 뒤에 개행 문자를 제거한다.
  3. #{$_}를 입력받은 결과물을 출력한다.

심볼

C언어 enum에서 쓰는 값과 유사한 것이다. :data와 같은 형식으로 이용한다.

C언어와 다른 연산자

  • ** : Exponential(누승)
  • <=> : 작으면 음수, 같으면 0, 크면 양수 반환
  • == : 같다
  • === : case문의 when절에서 사용하는 동치 연산자
  • =~ : 정규 표현식 패턴 검사 연산자
  • defined? : 어떤 심볼이 정의되어 있으면 참
  • begin, end : 블록 표현식
  • if, unless, while, until : 실행문

배열 첨자 차이

array\[start, count] : 리턴값은 start부터 갯수 만큼의 원소를 가져온다.

해 쉬

res = {"first" => "Gildong", "last" => "Hong"} : 형식으로 사용

res["first"] : res에서 first라는 값을 가져온다

범 위(range)

1..4 : 1, 2, 3, 4

1...4 : 1, 2, 3

배열 변환

.to_a 라는 메소드를 이용

  • (1..4).to_a : [1,2,3,4]
  • (1...3).to_a : [1,2,3]

오름차순을 이용해야 배열로 변환 가능