본문 바로가기

소프트웨어-이야기/프로그래밍 언어와 프레임워크

루비온레일즈에서 Class 메서드와 Instance 메서드 이해하기

루비온레일즈에서의 클래스 메서드와 인스턴스 메서드를 어떨 때 사용하는지 찾아봤다.

그런데 뭐... 루비라고 특별히 다른건 아닌거같고, 다 비슷하긴 해보인다.


참고한 포스팅

http://culttt.com/2015/06/10/understanding-class-methods-verses-instance-methods-in-ruby/


클래스 메서드란?


클래스 메서드는 클래스에 정의된 메서드를 말한다. 이어서 예제 코드를 보고 설명하고자 한다 ㅎㅎ 

class User
def self.find(id)
puts "finding user with the id of #{id}"
end
end


보통.. ㅎㅎ 저렇게 id를 넘기면 user 객체를 리턴시켜준다.

아무튼.. class 메서드는 앞에 self를 붙여준다.


class User
class << self
def find(id)
puts "finding user with the id of #{id}"
end
end
end

이렇게 class << self 라는 코드안에 함수를 넣어주면, 매번 앞에 self.함수명을 써줘야하는 걸 생략할 수 있다. 


basket = User.find('1abc')

이런식으로 클래스 함수를 사용할 수 있다.


클래스 메서드는 언제 사용하는게 좋을까?


인스턴스에 속해있는 기능이 아니면 클래스 메서드를 사용해야한다.

예를 들면.. 위의 find 함수는 User 클래스와 관련있어서, User 클래스 안에 있지만,

특정 인스턴스와는 관련이 없기 때문에 클래스 메서드로 선언되었어야 한다.


인스턴스 메서드란?


인스턴스 메서드는, 특정 인스턴스에서만 호출되는 메서드를 의미한다.

class User
def self.find(id)
puts "finding user with the id of #{id}"
end

def wish_list
[]
end
end

여기에 있는 wish_list라는 함수는 인스턴스 메서드이다.

여기서 wish_list는 개별 유저의 위시리스트를 리턴시켜주는 기능을 갖고 있다.

때문에 user 인스턴스에 의존적인 함수라고 볼 수 있다. 


user = User.new
=> #<User:0x007fd2e446c7b0>
user.wish_list
=> []

인스턴스 함수를 사용할 때는, 객체를 만든 후에, 해당 객체에서 함수를 부른다.


만약 인스턴스 객체에서 클래스 함수를 호출하려고 하면, NoMethodError가 발생할 것이다.

user.find('def')
NoMethodError: undefined method 'find' for #<User:0x007fd2e446c7b0>


인스턴스 메서드는 언제 사용하는게 좋을까?


특정 인스턴스에 의존적인 함수는 인스턴스 메서드로 만들어야한다.

보통 인스턴스 메서드는, get/set처럼 인스턴스의 attributes와 관련된 함수이거나, 객체의 아이덴티티를 고려한 기능(?)에서 종종 사용된다.

예를 들어 유저의 위시리스트를 불러오는 함수는, User 객체의 컨텍스트에서만 의미가 있다. User가 없는 상황에서, 위시리스트는 의미가 없기 때문이다.

구현중인 기능이 특정 객체의 id와 관련있으면, 인스턴스 메서드를 사용해야한다.

(잡담 : 번역체 돋는다... )


<끝>