목록ruby (12)
자본 엄.슴.
루비 언어를 공부한지 어언 3개월... 다른 할 일도 많아서 루비에만 집중하지는 못했지만 그래도 방학이 겹쳐서 열심히 공부한 결과 나름 루비 언어에 익숙해지게 되었다. 그래서 오늘부터 루비의 웹 프레임워크인 루비 온 레일즈를 공부해보려고 한다. Ruby on rails(이하 레일즈)는 루비의 웹 어플리케이션 프레임워크이다. 엄청난 생산성과 간결한 코드 자랑하지만 퍼포먼스가 떨어진다는 단점이 있다고 한다. 레일즈는 MVC모델을 적용하고 있어서 유지보수가 쉽다는 장점이 있다. 다음 명령어를 입력하면 레일즈가 설치된다. gem install rails 굉장히 간단한 명령어로 레일즈를 설치할 수 있다. gem은 루비의 라이브러리를 설치할 수 있는 패키지 시스템 정도로 생각하면 된다. 예전에는 루비와 별개로 설치..
배열 기본 배열은 여러 값들을 한 변수에 묶은 것이다. Array.new를 이용해서 선언할 수 있다. array = Array.new 3 p array 결과 [nil, nil, nil] 참고로 p 함수는 객체의 inspect를 출력한다. puts 함수는 to_s, 즉 객체를 문자열로 바꾸어서 출력하지만 inspect는 객체의 상태를 변환한다. new 뒤에는 숫자를 인자로 넣을 수 있는데 배열의 크기를 뜻한다. 그 크기만큼 nil로 채워지게 된다. 값을 넣은 상태로 배열을 선언하고 싶으면 대괄호를 사용하면 된다. array = [1, 2, 3] p array 결과 [1, 2, 3] 배열의 특정 원소에 접근하고 싶을 때는 변수이름[숫자] 형식으로 사용하면 된다. 참고로 배열의 원소는 1부터가 아니라 0부터 ..
심볼 심볼은 그냥 문자열이라고 생각하면 편하다. 단지 문자열처럼 이거저거 붙이거나 제거하는 식으로 건드릴 수 없을 뿐이다. 즉 변경이 불가능한 문자열이다. 그런데 왜 굳이 변경 불가능한 심볼이 필요할까 싶다. 그것은 문자열이 메모리에서 효율이 썩 좋지 않기 때문이다. 변경 가능한 객체인 문자열은 같은 값을 가지고 있더라도 계속 문자열을 생성한다. 그래서 문자열이 서로 다른 메모리 공간을 차지하게 된다. 이러면 문자열을 많이 사용하면 할 수록 메모리 공간을 많이 차지하게 되는데 이럴 때 심볼이 유용하다. 심볼은 문자열 앞에 :을 붙여서 만들 수 있다. puts "hello".object_id == "hello".object_id puts :hello.object_id == :hello.object_id 결..
String 루비에서 문자열을 만들기 위해서는 큰따옴표나 작은따옴표를 사용하면 된다. 큰따옴표를 사용하면 #{}이나 백슬래시 등으로 특정 문자열을 표시할 수 있지만 작은따옴표를 사용하면 전부 무시하고 따옴표 안에 있는 문자열을 그대로 출력한다. str = "abc" puts "#{str}def" puts '#{str}def' 결과 abcdef #{str}def String 메서드 루비의 String에는 유용한 메서드들이 존재한다. 그 중에서 몇 개만 예제로 살펴보자. str1 = "abcdefg!"; str2 = "defghij!" puts str1.length #문자열 길이 반환 puts str1.include? str2 #문자열이 인자를 포함하는지 반환 puts str1==str2 #두..
Object 이전에 클래스와 함께 간단히 객체에 대해 공부했었다. 그런데 루비에서는 모든 것이 객체이기 때문에 객체를 좀 더 다뤄볼 필요성이 있다. 루비에서는 심지어 클래스까지도 전부 다 객체다. 우리가 만든 객체는 기본적으로 주어진 몇몇 메서드들을 사용할 수 있다. class Human def initialize(name) @name = name end end kim = Human.new "Kim" puts kim.class puts kim.object_id puts kim.nil? 결과 Human 26665240 false class메서드는 해당 객체가 어떤 클래스의 인스턴스인지 알려주는 메서드이다. object_id메서드는 객체의 고유 id를 반환하고 nil?메서드는 해당 객체가 nil인지 아닌지를..
모듈 루비에는 클래스랑 비슷한 모듈이라는 것이 있다. 모듈은 클래스와 비슷하지만 인스턴스를 만들 수 없고 상속이 불가능하다는 점에서 차이가 있다. 그래서 네임스페이스를 만들거나 모듈의 메서드로 클래스 또는 인스턴스의 메서드를 정의할 때 사용한다. 모듈을 정의할 때는 module 키워드를 사용한다. module Trig PI = 3.141592654 def Trig.sin(x) # .. end def Trig.cos(x) # .. end end Trig.sin 5 모듈의 메서드는 모듈이름.메서드이름 형태로 호출할 수 있다. 모듈 상수는 모듈이름:상수이름 형태로 사용한다. 믹스인 (Mixin) 자바를 공부할 때도 느꼈던 것이지만 많은 객체 지향 언어들이 다중 상속을 지원하지 않는 것 같다. 이것은 루비도 마..
싱글톤 메서드 클래스에서 메서드를 정의하면 해당 클래스의 인스턴스는 모두 그 메서드를 사용할 수 있다. 그런데 싱글톤 메서드를 사용하면 객체가 객체 고유의 메서드를 가질 수 있게 된다. 싱글톤 메서드를 정의하려면 객체.메서드이름 형태로 메서드를 정의하면 된다. class Human def initialize(name) @name = name end end kim = Human.new "Kim" lee = Human.new "Lee" def kim.say_name puts @name end kim.say_name lee.say_name 이 예제를 실행시키면 Kim이라는 이름은 잘 출력되지만 Lee라는 이름을 출력하려하면 오류가 발생한다. 그 이유는 say_name 메서드는 kim 객체에만 있는 싱글톤 메서..
접근 제어자 객체 지향 언어에서 접근 제어자는 매우 중요한 역할을 맡고 있다. 객체 외부에서 객체 내부의 요소에 접근을 허락할 것인지 제어해야 캡슐화와 은닉화가 잘 이루어진다. 루비의 접근 제어자는 3가지가 있다. public, protected, private이다. 먼저 public은 어디에서든지 호출할 수 있다. 그리고 protected는 해당 객체와 그 클래스를 상속 받은 자식 클래스에서만 사용 가능하다. 상속은 조금 뒤에 다룰 예정이다. 마지막으로 private는 오직 해당 객체 내부에서만 사용이 가능하다. 루비의 메서드는 기본적으로 public이기 때문에 어떤 제어자도 쓰지 않으면 어디에서든지 접근할 수 있다. class Human def initialize(name, age) @name = n..