class method
메소드란 오브젝트에 기능을 제공하는 역할을 합니다. 클래스 메소드 역시 기능을 제공하는 역할을 하며 클래스 그 자체에 대한 기능을 정의합니다.
예를 들어 봅시다.
User.find(1)
루비온레일즈를 써보셨다면 익숙한 코드이실겁니다. 액티브레코드의 기능을 통해 유저 테이블에 있는 데이터를 조회하는 코드죠.
저 User모델 역시 클래스입니다. 하지만 User.new를 통해 객체를 생성하지 않은채 클래스명으로 바로 메소드를 호출했죠. 저 때의 find가 바로 클래스 메소드입니다.
이렇듯 클래스 메소드는 객체 생성없이 호출이 가능하며, 각 객체별이 아닌 클래스 전체와 관련된 기능을 정의합니다. 다시 말해, 정의하고자 하는 기능이 각각의 객체에 속하는 것이 아니라면 클래스 메소드로 정의해야 한다는 뜻입니다.
또한 클래스 내에서 클래스의 인스턴스 변수를 정의할 수도 있는데요, 이때 이 변수는 클래스 메소드 내에서만 사용이 가능합니다.
코드 :
class MyClass
@instavar_of_class = 100
def initialize
@instance_var = 5000
end
def aMethod
p @instance_var
p @instavar_of_class
end
def MyClass.classMethod
p @instance_var
p @instavar_of_class
end
end
ob = MyClass.new
puts( '-------ob-------' )
ob.aMethod
puts "-------class-----"
MyClass.classMethod
실행결과:
-------ob-------
5000
nil
-------class-----
nil
100
보시다시피, ob라는 객체의 메소드 aMethod에서 @instance of class변수를 호출하면 nil값이 뜹니다. 클래스의 인스턴스 변수로 선언된 값은 이와같이 인스턴트 메소드에서 호출이 불가능한거죠. 마찬가지로 클래스 메소드 내에서도 객체의 인스턴스 변수를 호출할 수 없습니다.
참고로 클래스의 인스턴스 변수를 정의할 수 있다는 얘기는 클래스 역시 하나의 오브젝트라는 얘기가 됩니다. 루비는 오브젝트로 이루어진 언어라는 얘기가 와닿기 시작하네요.
보통은 위의 코드처럼 클래스 내에서 인스턴스 변수를 선언하여 사용하는 일은 극히 드물듯합니다.
** Udemy의 「Advanced Ruby Programming: 10 Steps To Mastery」를 보고 작성하였습니다.