루비의 몇가지 특징
● 루비에서 모든 것은 객체(Object)이다.(심지어 nil도 객체다.)
● 루비는 한줄에 하나의 표현식을 사용할 때는 끝에 세미콜론(;) 생략가능
● #는 한줄 주석
● 변수선언은 별도로 하지 않아도 됨(대입할 때 자동으로 만들어짐)
● 명시적으로 구분가능할 때는 괄호()가 생략 가능함
puts test("aaa")
puts(test("aaa")) 이 둘은 같은 의미
● null을 nil이라고 표현함puts(test("aaa")) 이 둘은 같은 의미
● ++, -- 같은 자동증가, 자동감소 연산자는 없음 (+=, -= 를 사용)
● 숫자 0이 false로 자동 변환되지 않음(nil과 false가 아닐때만 참이 됨)
● 논리연산자
&&가 and보다 우선순위 높음
||가 or보다 우선순위 높음
and와 or은 우선순위가 같지만 &&는 ||보다 우선순위 높음
not과 !는 같은 기능 (!가 우선순위 높음)
and,or,&&,|| 은 참거짓을 결정하는 피연산자의 값을 반환
● 병렬 대입 가능||가 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가 됨
● 치환좌변의 갯수가 많으면 남은 값은 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개)
● 콜론(:)의 사용1...10 는 종료값 포함안함 즉 1~9 (점3개)
:test 는 test에 해당하는 Symbol객체 반환 즉, test 변수
test는 test의 값
● 해시test는 test의 값
{ 'key1' => 'value1', 'key2' -> 'value2'}와 같이 해시 정의함(key1은 유일한 값)
test = Hash.new(0) 과 같이 기본값 지정 가능
없는 값은 nil 반환
● 정규식test = Hash.new(0) 과 같이 기본값 지정 가능
없는 값은 nil 반환
/패턴/ 과 같이 사용
=~(참매치), !~(거짓매치로) 문자열 검사가능 매치되면 첫위치 아니면 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일 경우만 참
● 문자리터럴=== : case구분의 when항목이 비교할 대상과 동일한지 비교
<=> : 일반적인 비교(완쪽이 작으면 -1, 같으면 0, 왼쪽이 크면 +1)
<,<=,>=,> : 작다,작거나같다,크거나같다,크다
eql? : 왼쪽과 오른쪽이 서로 같은 타임이며 같은 값을 가질때만 참
equal? : 왼쪽과 오른쪽이 같은 객체 ID일 경우만 참
홑따옴표( ' )는 그대로 객체가 됨 (ex: 'test')
쌍따옴표는 이스케이프 함(ex: "test")
쌍따옴표는 이스케이프 함(ex: "test")
\n등을 이스케이프해줌
#{expression}와 같은 표현식 삽입(expression interpolation)을 표현값으로 변환해준다.
#{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 : 반복문을 처음부터 다시 실행
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
@test
end
인스턴스 변수에 대한 접근 메서드를 위과 같의 정의할 수 있다.
attr_reader를 이용해서 같은 기능을 축약해서 쓸 수 있음
attr_reader를 이용해서 같은 기능을 축약해서 쓸 수 있음
attr_reader :test, :name
● SET 메서드def test=(new_test)
@test = new_test
end
인스턴스 변수에 할당이 가능하도록 위와같이 정의할 수 있다.
attr_writer를 이용해서 같은 기능을 축약해서 쓸 수 있음
● GET/SET 메서드@test = new_test
end
인스턴스 변수에 할당이 가능하도록 위와같이 정의할 수 있다.
attr_writer를 이용해서 같은 기능을 축약해서 쓸 수 있음
attr_writer :test
다음과 같이 사용하면 GET/SET 메서드를 한꺼번에 만들 수 있음.
attr_accessor :test
● 인스턴스 메서드와 클래스 메서드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
● 우선순위는 {}방식이 더 높음.2. do
내용
end
● 메서드뒤에 코드블록을 적어줌으로써 결합된 메서드에서 yield문으로 코드블록 호출가능
● yield(파라미터) 와 같이 적으면 코드블록에서는 파이프( | )로 연결
def test
yield("111", 20)
end
test {|str, num|}
간단히 차이점위주로 기억해둬야할 걸 정리하려고 했는데 하다보니 생각보다 많군요. ㅎ
좋은 자료 잘 읽었습니다. 요즘 루비온테일즈로 사이트나 만들어볼까 생각에 나름 신기술이라 자료가 별로 없네요. 그래서 이곳저곳 뒤지다가 좋은 자료 발견 한 것 같습니다.
감사합니다.
루비온레일즈도 좀 공부하다가 지금은 손도 못대고 있네요. ^^