Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

루비(Ruby) 1.8.x 문법 정리

요즘은 루비(Ruby)를 보고 있는데 개념이야 그렇다 치고 새로운 언어를 공부하면서 가장 익숙치 않은게 문법이 아닐까 합니다. 공부하면서도 문법이 헷갈려서 이참에 헷갈리지 않도록 정리를 해놉니다.  아래 내용은 루비 1.8.x버전대를 기준으로 합니다.



루비의 몇가지 특징

● 루비에서 모든 것은 객체(Object)이다.(심지어 nil도 객체다.)
● 루비는 한줄에 하나의 표현식을 사용할 때는 끝에 세미콜론(;) 생략가능
● #는 한줄 주석
● 변수선언은 별도로 하지 않아도 됨(대입할 때 자동으로 만들어짐)
● 명시적으로 구분가능할 때는 괄호()가 생략 가능함
puts test("aaa")
puts(test("aaa")) 이 둘은 같은 의미
● null을 nil이라고 표현함
● ++, -- 같은 자동증가, 자동감소 연산자는 없음 (+=, -= 를 사용)
● 숫자 0이 false로 자동 변환되지 않음(nil과 false가 아닐때만 참이 됨)
● 논리연산자
&&가 and보다 우선순위 높음
||가 or보다 우선순위 높음
and와 or은 우선순위가 같지만 &&는 ||보다 우선순위 높음
not과 !는 같은 기능 (!가 우선순위 높음)
and,or,&&,|| 은 참거짓을 결정하는 피연산자의 값을 반환
● 병렬 대입 가능
a, b = 1, 2 를 실행하면 a에는 1, b에는 2가 대입
좌변의 갯수가 많으면 남은 값은 nil 이 됨
우변의 갯수가 많으면 남은 값은 무시됨
b, *c = a 에서 a가 [1,2,3,4]일 때 b는 1, c는 [2,3,4] 가 됨
b, c = *a 에서 a가 [1,2,3,4]일 때 b는 1, c는 2가 됨
● 치환
a, b = b, a 를 실행하면 a와 b의 값이 치환됨
● 범위
1..10 은 경계값 포함 즉, 1~10 (점2개)
1...10 는 종료값 포함안함 즉 1~9 (점3개)
● 콜론(:)의 사용
:test 는 test에 해당하는 Symbol객체 반환 즉, test 변수
test는 test의 값
● 해시
{ 'key1' => 'value1', 'key2' -> 'value2'}와 같이 해시 정의함(key1은 유일한 값)
test = Hash.new(0) 과 같이 기본값 지정 가능
없는 값은 nil 반환
● 정규식
/패턴/ 과 같이 사용
=~(참매치), !~(거짓매치로) 문자열 검사가능 매치되면 첫위치 아니면 nil 반환
● 대입문의 결과값은 항상 매개변수의 값이다.

class MyClass
    def test=(test)
        @test = test
        return 50
    end
end
ex = MyClass.new
a = ex.test = 2 #a는 50이 아닌 2 임

● 객체 비교
==             : 두 값이 같은지 비교
===           : case구분의 when항목이 비교할 대상과 동일한지 비교
<=>           : 일반적인 비교(완쪽이 작으면 -1, 같으면 0, 왼쪽이 크면 +1)
<,<=,>=,> : 작다,작거나같다,크거나같다,크다
eql?          : 왼쪽과 오른쪽이 서로 같은 타임이며 같은 값을 가질때만 참
equal?      : 왼쪽과 오른쪽이 같은 객체 ID일 경우만 참
● 문자리터럴
홑따옴표( ' )는 그대로 객체가 됨 (ex: 'test')
쌍따옴표는 이스케이프 함(ex: "test")
\n등을 이스케이프해줌
#{expression}와 같은 표현식 삽입(expression interpolation)을 표현값으로 변환해준다.





조건문
● IF 문

if 조건 then
    ...내용....
elseif 조건 then
    ...내용....
else
    ...내용....
end
# 위처럼 여러줄에 작성할 경우에는 then 생략가능
# 구문변경자(statement modifier)를 통해서 단일IF문의 경우에는 다음과 같이 작성가능
...내용... if 조건

● UNLESS문

# if의 부정형
unless 조건
    ...내용....
else
    ...내용....
end

● WHILE 문

while 조건
    ...내용....
end
# 구문변경자(statement modifier)를 통해서 다음과 같이 작성가능
...내용... while 조건

● UNTIL문

# while문의 반대
ultil 조건
     ...내용...
end
# 조건이 참이 되기 전까지만 실행
# 구문변경자(statement modifier)를 통해서 다음과 같이 작성가능
...내용... until 조건

● CASE문

# 방식 1
case
     when test < 0 then "음수"
     when test  > 0 then "양수"
     else "숫자아님"
end

# 방식 2
case mode 
     when "update" then
          ...내용...
     when "delete" then
          ...내용...
     else 
          ...내용...
end
# 위의 2가지방식을 모두 사용가능
# then대신에 콜론(:) 사용가능
# case문에서 비교는 ===로 사용

● FOR ... IN 문

# 보통의 foreach문과 같음
for test in MyClass
     ...내용...
end

● 반복문에서 실행흐름 바꾸기
break : 반복문 종료
redo   : 현재의 반복을 다시 수행하지만 다음 원소를 가져오거나종료조건을 재평가하지 않음
next    : 다음 반복을 시작함
retry    : 반복문을 처음부터 다시 실행



네이밍(Naming)
● 루비에서는 이름의 첫글자가 용도를 결정함.
● 지역변수, 메서드, 파라미터 : 소문자나 밑줄(_)로 시작
● 클래스, 모듈, 상수                 : 대문자로 시작
● 전역변수                                 : $로 시작( $변수명)
● 인스턴스변수                         : @로 시작 (@변수명)
● 클래스변수                             : @@로 시작 (@@변수명) -> 사용전에 반드시 초기화해야 함



메서드
● 메서드는 다음과 같이 정의함

def 메서드명 (파라미터)
     메서드내용
end
# 메서드의 마지막 라인에 실행된 표현식의 결과값이 자동으로 반환됨(return문도 사용가능)


# 파라미터 기본값 설정하기
def method1(arg1="111", arg2="222")
end


# 파라미터 여러개 자동으로 받기
def method1(arg1, *arg2)
end
# 별표(*)를 파라미터에 사용하면 arg2가 두번째부터의 모든 파라미터를 배열로 받음






클래스
● 클래스는 다음과 같이 정의함

class 클래스명
     def 메서드명(파라미터)
     end
end
# 객체생성은 MyClass.new()로 생성하며 객체가 생성되면서 자동으로 initialize메서드가 호출됨


# 상속(inheritance)
class MyClass < Parent
end
# MyClass클래스가 Parent의 하위클래스가 됨
# 메서드내에서 super를 파라미터없이 호출하면 부모클래스의 super를 호출한 메서드와 동일한 이름의 메서드를 호출함(부모클래스를 정의안하면 Object 클래스가 부모클래스임)

● GET 메서드
def test
     @test
end
인스턴스 변수에 대한 접근 메서드를 위과 같의 정의할 수 있다.
attr_reader를 이용해서 같은 기능을 축약해서 쓸 수 있음
attr_reader :test, :name
● SET 메서드
def test=(new_test)
     @test = new_test
end
인스턴스 변수에 할당이 가능하도록 위와같이 정의할 수 있다.
attr_writer를 이용해서 같은 기능을 축약해서 쓸 수 있음
attr_writer :test
● GET/SET 메서드
다음과 같이 사용하면 GET/SET 메서드를 한꺼번에 만들 수 있음.
attr_accessor :test
● 인스턴스 메서드와 클래스 메서드

# 기본적으로는 인스턴스메서드이고 클래스메서드는 다음과 같은 3가지 방법으로 정의할 수 있음.
class MyClass
     def MyClass.method1
     end
     def self.method2
     end
     class <<self
          def method3
          end
     end
end






접근 권한
● 클래스의 메서드는 기본적으로는 public임(initialize만 항상 private)

# 다음과 같이 public, protected, private함수를 이용해서 메서드의 기본접근권한을 지정할 수 있음(함수 뒤에 나오는 모든 메서드는 해당 접근권한을 따름
class MyClass
     def method1
     end

     public
          def method2
          end

     private
          def method3
          end

     protected
          def method4
          end
end


# 접근제어함수의 매개변수로 써서 이미 정의된 메서드의 접근제어권한을 지정할 수 있음
class MyClass
     public :method1, :method2
     private :method3
     protected :method4
end






코드블록
● 코드블록은 2가지 방법으로 정의가 가능함.
1. { 내용 }
2. do
          내용
     end
● 우선순위는 {}방식이 더 높음.
● 메서드뒤에 코드블록을 적어줌으로써 결합된 메서드에서 yield문으로 코드블록 호출가능
● yield(파라미터) 와 같이 적으면 코드블록에서는 파이프( | )로 연결

def test
     yield("111", 20)
end
test {|str, num|}


간단히 차이점위주로 기억해둬야할 걸 정리하려고 했는데 하다보니 생각보다 많군요. ㅎ
2009/04/05 01:57 2009/04/05 01:57