|
|||
|
|
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
- 실행 결과 -- 위 코드에서 클래스변수는 @@classVar_plays = 0 으로 대입문을 통해 초기화를 했다.이 노래는 1 연주되었고, 전체 1 연주되었다. 이 노래는 1 연주되었고, 전체 2 연주되었다. 이 노래는 2 연주되었고, 전체 3 연주되었다. 이 노래는 3 연주되었고, 전체 4 연주되었다. 위 코드를 실행해 봄으로써 클래스변수에 대해 쉽게 이해할 수 있다. 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』 책의 내용을 바탕으로 정리한 것입니다. |
||
최근 댓글