코드라이언 3주차 루비 배우기

루비만이 가지는 최대 강점이 있다.


루비의 최대 강점을 꼽으라면 그 형태가 간결하고 자연스럽다는 것이다.


1995년에 루비가 처음 공개된 이후로, 루비를 사용하는 인구는 전 세계적으로 계속 증가하고 있다.


루비의 또다른 장점으로 객체 지향(object-oriented)적인 속성을 강하게 보여준다는 것이다.

객체 지향언어와 절차 지향언어 비교




루비에서 다루어지는 데이터형(data type)은 크게 3가지로 분류할 수 있다.

  • 숫자(number)0~9 사이 아라비아 숫자들의 조합을 입력하면 숫자로 인식한다. 정수(integer), 실수(float) 등으로 세분화할 수 있다.
  • 문자열(string): 숫자 혹은 문자들을 작은 따옴표(') 혹은 큰 따옴표(")로 묶어 입력하면 문자열로 인식한다.
  • 불리언(boolean): 비교 연산 혹은 논리 연산에 사용되는 기본 단위로서 true와 false 중 하나의 값만을 가진다.

루비에서 특정한 값, 혹은 변수에 대입된 값을 화면에 출력하는 방법에는 두 가지가 있다.

먼저 print 의 경우, 특정한 값을 출력한 후 줄넘김을 하지 않는다.


한편 puts 의 경우, 특졍한 값을 출력한 후 자동으로 줄넘김을 한다.




만약 문자열 안에 다른 변수(문자열, 숫자, 불리언 등)를 포함시켜 출력하고 싶다면, #{ }를 이용하면 된다. 

* puts와 print는 앞으로 루비 프로그램을 작성하면서 꽤 자주 사용하게 될 것이나, 이후에 레일스로 넘어가면 거의 사용되지 않는다. 그러나 #{ }의 경우, 루비에서보다도 이후에 레일스로 넘어가면 더 많이 쓰일 것이니 잘 기억해두도록 하자.





파일을 실행한 사용자에게 원하는 값을 입력하도록 할 때 gets 를 사용한다.

gets 뒤에 붙는 .chomp는, 사용자가 값을 입력한 후 엔터를 입력할 때, 이 ‘엔터’에 해당하는 부분을 제거하는 기능을 한다. .chomp를 포함시켜주지 않으면 input 변수를 출력할 때 의도치 않은 엔터가 같이 출력되어 원하지 않는 결과가 나올 가능성이 있다. 그러므로 gets 뒤에는 습관적으로 .chomp를 붙여 주는 것이 좋다. 

.to_i는 앞서 gets.chomp로 수집한 값을 정수(integer)로 변환해주는 기능을 수행한다


input = gets.chomp.to_i

수집한 값을 정수(integer) 대신 소수점 아래 자리까지 표시되는 수(floating number; float)로 변환하고 싶은 경우, .to_i 대신 .to_f를 사용하면 된다.

0.upto(3) do |i|
  puts "Grrrr #{i}"
end

.to_i와 반대되는 기능을 하는 것으로 .to_s가 있는데, 이는 숫자를 문자열(string)로 변환해주는 기능을 수행한다. 





프로그래밍 언어에서 핵심적으로 사용되는 것 중 하나가 반복문이다.



루비의 대표적인 반복문으로 uptodownto가 있다. upto 혹은 downto를 사용할 때는 맨 먼저 매 실행 횟수마다 값이 변화하는 변수를 하나 지정하면서 시작한다. 그 바로 하단에 이 변수의 값이 점차적으로 증가하거나 혹은 감소하는 동안 반복 시행될 코드를 입력하는 형태이다.


루비의 또다른 반복문으로 while이 있다. uptodownto와 다르게 while문에서는 매 실행 횟수마다 값이 변화하는 변수의 조건을 명시적으로 입력할 수 있도록 되어 있다.





프로그래밍 과정에서 이렇게 반복적인 작업을 효과적으로 줄여 줄 수 있는 것이 바로 메서드(method)이다. 


메서드의 개념은 수학에서의 함수와 매우 유사하다. 수학에서 미리 정의된 함수에 어떤 입력값을 넣으면 새로운 출력값을 얻을 수 있는 것처럼, 루비에서 메서드를 미리 정의해 놓은 뒤 단순히 메서드의 이름과 입력값을 넣으면 위와 같은 계산을 빠르고 쉽게 반복적으로 수행할 수 있다. 다음과 같이 하면 된다.


def sum(a,b)
sum = 0
a.upto(b) do |x|
  sum = sum + x 
end
puts sum
end

sum(1,10)
sum(11,20)
sum(21,30)

인자는 하나일 수도 있고, 여러 개일 수도 있다. 또, 변수의 이름을 마음대로 정할 수 있듯이 인자의 이름도 마음대로 정할 수 있다.


메서드를 정의할 때 puts 대신 return 을 이용하면 연산 결과를 화면에 출력하지 않고 다른 변수에 저장할 수 있다

value = subtract(8,3)를 실행하는 과정에서 화면에 5가 표시되나, value 변수에는 아무런 값도 저장되지 않는다. 이에 따라  puts value로 value 변수에 저장된 값을 출력하려고 해도, value에는 아무런 값이 저장되어 있지 않기 때문에 화면에는 공백만 표시된다.




러 개의 데이터를 그룹지어 하나의 묶음으로 구성할 수 있는데, 이를 배열(array)이라고 한다.


배열에 새로운 성분을 추가하고자 할 때는 2행의 lion_name << "Charles"와 같이 

<< + (추가할 성분 데이터)를 입력한다

*루비에서는 배열의 성분을 불러올 때 성분 번호에 음의 정수가 들어갈 수 있다. 배열의 가장 마지막 성분의 번호가 -1이고, 마지막에서 두 번째, 세 번째, 네 번째 순으로 각각 -2,-3,-4,(…)의 성분 번호가 붙는다.



.size
배열의 크기를 출력해 주는 메서드이다.

.reverse
배열 내 데이터의 순서를 뒤집어 주는 메서드이다.
.sort
배열 내 데이터의 순서를 오름차순으로 정렬해 주는 메서드이다.
.uniq
배열 내에 서로 중복되는 데이터가 존재하는 경우, 이들을 제거하고 서로 중복되지 않는 값들로만 재구성해 주는 메서드이다.
.each
배열에 대하여 유용하게 사용되는 반복문으로 .each가 있다. .each는 배열 내의 각 데이터 성분에 대하여 동일한 작업을 반복적으로 수행할 때 사용하는 메서드이다.
things = ["rabbit","mouse","snake","lizard"]
things.each do |thing|
  puts "I want to eat some " + thing
end
things라는 배열의 각 성분을 thing이라고 할 때, 각각의 thing에 대하여 다음의 코드를 실행하라’는 의미이다.
완료: Linux 콘솔 > irb 실행 결과

작은 따옴표(') 혹은 %q[]로 묶어 입력한 문자열의 경우, #{}를 사용하여 다른 문자열을 삽입하는 것이 불가능한 것을 확인할 수 있다.
완료: Linux 콘솔 > irb 실행 결과
위의 irb에서 세 결과는 모두 동일하다. 성분이 모두 문자열인 배열에 한해서%w[] 혹은 %W[]로 묶어 위와 같이 입력해도 동일한 배열을 만들 수 있다. (다만, 엄밀히 구분하자면 %w[]의 경우 각 성분들을 작은 따옴표(')로, %W[]의 경우 각 성분들을 큰 따옴표(")로 묶어 입력한 결과가 배열에 저장된다.)


.split('')을 적용하면 문자열 내의 문자 하나하나를 성분으로 하는 배열을 만들 수 있다
.join을 적용하면 배열 내의 성분들을 모두 모아 하나의 문자열로 합칠 수 있다.




루비에서 여러 개의 데이터를 그룹지어 하나의 묶음으로 구성하는 또다른 형태로 해쉬(hash)가 있다.


앞서 설명한 배열에는 단순히 성분이 되는 데이터만 대입되었다면, 해쉬에는 성분의 이름에 해당하는 ‘키(key)’와 그 키에 대응하는 데이터 값(value)이 동시에 대입된다는 점에서 차이가 있다.

이러한 배열과 해쉬의 차이는 성분을 불러오는 과정에서 확연하게 드러난다. 배열의 경우 성분의 번호를 입력해야만 원하는 데이터 값을 불러올 수 있다는 번거로움이 있는 반면, 해쉬의 경우 처음에 설정했던 성분의 키를 입력하기만 하면 원하는 데이터 값을 쉽게 불러올 수 있다. (다시 말해, 해쉬 내 성분의 순서를 알 필요가 전혀 없다.)
처음에 빈 해쉬를 먼저 만든 뒤 여기에 (키,데이터 값)을 하나하나 성분으로 추가하는 형태로 해쉬를 완성해 나갈 수도 있다.
lion_resume = Hash.new

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

하둡 설치 오류 정리

[exploit writing] 1_스택 기반 오버플로우 (1) First