1. 클래스 생성, 인스턴스변수 셋팅하기

클래스 만들기
class Song
  def initialize(name, artist, duration)
    @name = name
    @artist = artist
    @duration = duration
  end
end

song = Song.new("Foo", "Fleck", 300)
puts song.inspect
- 실행결과 -----
#<Song:0x2bb67a8 @duration=300, @artist="Fleck", @name="Foo">

새로운 Song 객체를 만들기 위해 song = Song.new("Foo", "Fleck", 300)를 호출하면 initialize메서드를 호출한다. 객체 상태를 초기화하는데 initialize 메소드가 적절하다. Song.new(...)을 호출하면 Song클래스의 initialize(...) 메소드에 인자가 매핑되어 호출됨을 알 수 있다. 인스턴스변수@변수명 형식으로 변수명 앞에 @만 붙여주면 된다.

inspect메소드는 객체의 ID와 인스턴스 변수를 출력한다.

2. to_s 메소드 재정의 하기

재정의 실행
puts song.to_s
- 실행결과 -----
#<Song:0x2e3a538>

재정의 실행
메소드 재정의 하기
class Song
  def to_s
    "Song: #@name -- #@artist (#@duration)"
  end
end

puts song.to_s
- 실행결과 -----
Song: Foo -- Fleck (300)

"Song: #@name -- #@artist (#@duration)" 에서 처럼 문자열 안에서 #@인스턴스변수명 을 써주면 인스턴스변수의 값을 가져온다.

3. 클래스 상속하기

Song 클래스를 상속
class KaraokeSong < Song
 def initialize(name, artist, duration, lyrics)
   super(name, artist, duration)
   @lyrics = lyrics
 end
 
 def to_s
   super + "[#@lyrics]"
 end
end

karaokeSong = KaraokeSong.new("Foo", "Fleck", 300, "가사가 들어갑니다.")
puts karaokeSong.to_s
- 실행결과 -----
Song: Foo -- Fleck (300)[가사가 들어갑니다.]

- 상속은 클래스 선언부에 하위(구현)클래스 < 상위클래스명 형식으로 < 표시로 상속을 표현한다.면 된다.
- initialize 메소드 안의 super(name, artist, duration) 는 상위 클래스 Song객체의 initialize 메소드를 호출한다.
- to_s 메소드의 super는 상위 클래스인 Song 클래스의 to_s 메소드의 결과값을 가져온다.


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