루비 기초 문법(4)
루비는 객체 지향 언어입니다.
1. 클래스, 객체, 생성자
루비에서 다루는 모든 것들은 전부 객체입니다.
루비에서는 클래스의 이름은 대문자로 시작해야하며, 메서드의 이름은 소문자로 시작해야 합니다.
가볍게 객체 지향 언어답게 클래스를 다루는 예시를 보도록 하겠습니다.
a_car = Car.new b_car = Car.new
이렇게 코드를 작성하게 되면 서로 다른 Car 객체가 생성되게 됩니다.
하지만 두 객체를 담는 변수의 이름이 다르다는 것 빼고는 다른 점이 없기 때문에 두 객체를 구분할 수는 없습니다.
생성자 메서드를 만들면 새로운 객체를 정의하는 시점에 객체의 속성들을 변경해줄 수 있습니다.
각 객체는 인스턴스 변수를 가지고 있습니다(인스턴스 변수는 @로 시작합니다).
간단한 코드를 하나 보겠습니다.
class Car def initialize(name, price) @name = name @price = price end end
루비에서 initialize 라는 이름의 메서드는 생성자 메서드를 의미하는 특별한 메서드입니다.
new 키워드를 이용해서 새로운 객체를 생성할 때 생성자 메서드인 initialize 메서드를 사용해서 각 객체마다의 속성값들을 각 객체에 맞게끔 설정해줄 수 있습니다.
a_car = Car.new('A_Car', 100000) b_car = Car.new('B_Car', 120000)
Car 클래스의 생성자 메서드에는 두 개의 매개 변수가 필요합니다.
이 매개 변수들은 메서드 안에서 지역 변수로 사용되기 때문에 지역 변수의 명명규칙에 따릅니다.
매개 변수는 지역 변수와 같은 스코프(Scope)를 갖기 때문에 생성자 메서드가 끝나면 사라집니다.
때문에 @로 시작하는 인스턴스 변수에 값을 넣어줘야 사용이 가능합니다.
이렇게 생성자 메서드를 이용해서 초기화 하는 방식이 가장 일반적인 초기화 방식입니다.
그리고 클래스 내부에서 값을 변경할 경우가 생길 경우에는 attr_accessor, attr_reader를 사용하면 됩니다.
class Car attr_reader :name attr_accessor :price def initialize(name, price) @name = name @price = price end end
attr_reader 메서드는 외부에서 값을 읽어들일 수 있게만 하고 변경을 불가하게 하는것입니다.
attr_accessor 메서드는 외부에서 값에 접근을 가능하게 해주는 메서드입니다.
attr_writer라는 메서드가 하나 더 있습니다. 이 메서드는 값을 대입할 수 있게만 해줍니다.
2. 속성, 메서드, 인스턴스 변수
속성이란 단순히 메서드일 뿐입니다.
그렇다면 어디까지가 속성이라 불리는 것이고, 어디까지가 일반 메서드로 불리는 것일까요?
외부에 보이는 상태는 속성이라 불리는 메서드를 이용해서 하고, 그 밖에는 일반 메서드로 처리합니다.
아주 중요한 부분은 아니지만 알아두셨으면 합니다!
루비에서는 객체 상태를 변경할 때 메서드를 호출해야만 합니다. 메서드에 대한 접근 설정을 한다면 객체에 대한 접근을 제어할 수 있다는 소리입니다.
객체의 상태를 망치는 메서드는 노출해서는 안됩니다.
- public: public 메서드는 누구나 호출할 수 있습니다. 아무런 제약, 제어를 하지 않습니다.(루비에선 모든 메서드(initialize 제외)가 기본적으로 public입니다)
- protected: protected 메서드는 그 객체를 정의한 클래스와 하위 클래스에서만 호출이 가능합니다.
- private: private 메서드는 수신자를 지정해서 호출할 수 없습니다. private 메서드는 항상 객체 내부(다른 객체일 경우 불가)에서만 호출할 수 있습니다.
protected 메서드와 private 메서드의 차이는 protected는 정의한 클래스나 그 클래스의 하위 클래스에서도 호출할 수 있습니다.
하지만 private는 오직 그 객체 자체에서만 호출이 가능합니다.
가령 a_car의 클래스는 b_car의 클래스와 같다. 하지만 a_car에 private 메서드는 b_car에서 호출할 수 없다.
접근 제어를 설정하는 방법은 간단합니다.
class Mine def method1 # default는 public . . . . . . end private # 이제부터 선언하는 메서드는 모두 private def method2 . . . . . . end protected # 이제부터 선언하는 메서드는 모두 protected def method3 . . . . . . end public # 이제부터 선언하는 메서드는 모두 public def method4 . . . . . . end end
이렇게 설정해줘도 되지만 아래와 같이도 설정해줄 수 있습니다.
class Mine def method1 . . . . . . end def method2 . . . . . . end def method3 . . . . . . end public :method1 protected :method2 private :method3 end
위와 같이 아래에서 한꺼번에 설정해줄 수도 있습니다.
읽어주셔서 감사합니다 :)
'Ruby > Study' 카테고리의 다른 글
루비 기초 문법(3) (0) | 2016.04.21 |
---|---|
루비 기초 문법(2) (0) | 2016.04.18 |
루비 기초 문법(1) (0) | 2016.03.28 |
루비 기본 상식! (0) | 2016.03.24 |
Nokogiri, open-uri 사용하기 (0) | 2016.03.24 |