루비(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 반환
-
대입문의 결과값은 항상 매개변수의 값이다.
1 2 3 4 5 6 7 8 |
|
- 객체 비교
- == : 두 값이 같은지 비교
- === : case구분의 when항목이 비교할 대상과 동일한지 비교
- <=> : 일반적인 비교(완쪽이 작으면 -1, 같으면 0, 왼쪽이 크면 +1)
- <,<=,>=,> : 작다,작거나같다,크거나같다,크다
- eql? : 왼쪽과 오른쪽이 서로 같은 타임이며 같은 값을 가질때만 참
- equal? : 왼쪽과 오른쪽이 같은 객체 ID일 경우만 참
- 문자리터럴
- 홑따옴표( ' )는 그대로 객체가 됨 (ex: 'test')
- 쌍따옴표는 이스케이프 함(ex: "test")
- \n등을 이스케이프해줌
- #{expression}와 같은 표현식 삽입(expression interpolation)을 표현값으로 변환해준다.
조건문
● IF 문
1 2 3 4 5 6 7 8 9 10 |
|
● UNLESS문
1 2 3 4 5 6 |
|
● WHILE 문
1 2 3 4 5 |
|
● UNTIL문
1 2 3 4 5 6 7 |
|
● CASE문
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
● FOR ... IN 문
1 2 3 4 |
|
- 반복문에서 실행흐름 바꾸기
- break : 반복문 종료
- redo : 현재의 반복을 다시 수행하지만 다음 원소를 가져오거나종료조건을 재평가하지 않음
- next : 다음 반복을 시작함
- retry : 반복문을 처음부터 다시 실행
네이밍(Naming)
● 루비에서는 이름의 첫글자가 용도를 결정함.
● 지역변수, 메서드, 파라미터 : 소문자나 밑줄(_)로 시작
● 클래스, 모듈, 상수 : 대문자로 시작
● 전역변수 : $로 시작( $변수명)
● 인스턴스변수 : @로 시작 (@변수명)
● 클래스변수 : @@로 시작 (@@변수명) -> 사용전에 반드시 초기화해야 함
메서드
● 메서드는 다음과 같이 정의함
1 2 3 4 |
|
1 2 3 |
|
1 2 3 4 |
|
클래스
● 클래스는 다음과 같이 정의함
1 2 3 4 5 |
|
1 2 3 4 5 |
|
- GET 메서드
1 2 3
def test @test end- 인스턴스 변수에 대한 접근 메서드를 위과 같의 정의할 수 있다.
- attr_reader를 이용해서 같은 기능을 축약해서 쓸 수 있음
- attr_reader :test, :name
- SET 메서드
1 2 3
def test=(new\_test) @test = new\_test end- 인스턴스 변수에 할당이 가능하도록 위와같이 정의할 수 있다.
- attr_writer를 이용해서 같은 기능을 축약해서 쓸 수 있음
- attr_writer :test
- GET/SET 메서드
- 다음과 같이 사용하면 GET/SET 메서드를 한꺼번에 만들 수 있음.
- attr_accessor :test
- 인스턴스 메서드와 클래스 메서드
1 2 3 4 5 6 7 8 9 10 11 |
|
접근 권한
● 클래스의 메서드는 기본적으로는 public임(initialize만 항상 private)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 |
|
코드블록
- 코드블록은 2가지 방법으로 정의가 가능함.
- { 내용 }
-
1do
- 우선순위는 {}방식이 더 높음.
- 메서드뒤에 코드블록을 적어줌으로써 결합된 메서드에서 yield문으로 코드블록 호출가능
- yield(파라미터) 와 같이 적으면 코드블록에서는 파이프( | )로 연결
1 2 3 4 |
|
간단히 차이점위주로 기억해둬야할 걸 정리하려고 했는데 하다보니 생각보다 많군요. ㅎ
좋은 자료 잘 읽었습니다. 요즘 루비온테일즈로 사이트나 만들어볼까 생각에 나름 신기술이라 자료가 별로 없네요. 그래서 이곳저곳 뒤지다가 좋은 자료 발견 한 것 같습니다.
감사합니다. 루비온레일즈도 좀 공부하다가 지금은 손도 못대고 있네요. ^^