1. 클래스 변수

클래스 변수는 그 클래스의 모든 객체가 공유하며 @@클래스변수명 의 형태를 가진다. 클래스변수는 @@두개를 붙이며 반드시 초기화를 해야 한다. 초기화는 간단한 대입문을 사용하면 된다.
※ 클래스메소드, 변수는 자바의 static과 유사하다.
클래스변수
class Song
  @@classVar_plays = 0
  def initialize(name, artist, duration)
    @name = name
    @artist = artist
    @duration = duration
    @plays = 0
  end
  
  def play
    @plays += 1
    @@classVar_plays += 1
    "이 노래는 #@plays 연주되었고, 전체 #@@classVar_plays 연주되었다."
  end
end

song1 = Song.new("Song1", "innerman", 200)
song2 = Song.new("Song2", "innergirl", 500)
puts song1.play
puts song2.play
puts song1.play
puts song1.play
- 실행 결과 --
이 노래는 1 연주되었고, 전체 1 연주되었다.
이 노래는 1 연주되었고, 전체 2 연주되었다.
이 노래는 2 연주되었고, 전체 3 연주되었다.
이 노래는 3 연주되었고, 전체 4 연주되었다.
위 코드에서 클래스변수는 @@classVar_plays = 0 으로 대입문을 통해 초기화를 했다.
위 코드를 실행해 봄으로써 클래스변수에 대해 쉽게 이해할 수 있다.

2. 클래스메소드

클래스메소드는 클래스가 특정한 객체에 얽매이지 않은 독립적인 기능을 제공한다. 위에서 사용하는 new 메소드는가 그 예이다.
song1 = Song.new("Song1", "innerman", 200)

클래스메소드를 선언할 때는 크래스이름 .메소드명 으로 한다.
클래스메소드 만들기
class SongList
  #상수
  MAX_TIME = 5 * 60 #60분
  
  #클래스메소드
  def SongList.is_too_long(song)
    return song.duration > MAX_TIME
  end
end

song1 = Song.new("Bicylops", "Fleck", 260)
song2 = Song.new("The Calling", "Santana", 490)
puts SongList.is_too_long(song1)
puts SongList.is_too_long(song2)
- 실행 결과 --
false
true

3. 클래스메소드를 이용하여 싱클톤으로 객체 생성하기

class Singleton
end

class MyLogger
  private_class_method :new
  @@logger = nil
  def MyLogger.create
    @@logger = new unless @@logger
    @@logger
  end
end

myLogger1 = MyLogger.new
puts myLogger1.inspect
- 실행 결과 --
singleton.rb:13: private method `new' called for MyLogger:Class (NoMethodError)

myLogger2 = MyLogger.create
myLogger3 = MyLogger.create
puts myLogger2.inspect
puts myLogger3.inspect
- 실행 결과 --
#<MyLogger:0x2bb5074>
#<MyLogger:0x2bb5074>

- myLogger1 에서는 에러가 발생했다. 루비에서는 런타임시에 접근자를 체크함을 알 수 있다.
- myLogger2와 myLogger3는 같은 객체(#<MyLogger:0x2bb5074>)를 참고하고 있음을 알 수 있다.


※ 위 내용은 데이브토머스 차드파울러 앤디헌트 지음, 강문식, 박지인, 양석호 옮김 『Programming Ruby』 책의 내용을 바탕으로 정리한 것입니다.