2011년 6월 2일 목요일

Inheritance and Messages

Inheritance and Messages

상속을 통해, 어떤 클래스를 좀 더 세밀하게 만들거나 특수화할 수 있다. 쥬크박스용 노래에서 가사지원이 필요한 노래방용 노래를 만들어보자

class KaraokeSong < Song
 def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
 end
end

aSong = KaraokeSong.new("My Way", "Sinatra", 225, "And now, the...")  
puts aSong.to_s

>> Song: My Way--Sinatra (225)

"<Song"은 KaraokeSong이 Song의 하위 클래스임을 선언한 것이다. 즉 Song과 상속 관계를 정의한 것이다.
자식은 부모의 모든 속성을 상속 받기 때문에 to_s 메서드를 호출했을때 Song에서 정의한 to_s 메서드가 실행된다. 상속 관계가 있는 클래스에서 메서드를 실행하면 하위에서 상위로 올라가면서 해당 메서드를 검색하게 된다. 만일 KaraokeSong에서 to_s 메서드를 재정의한다면 Song의 to_s는 호출되지 않을 것이다.

class KaraokeSong < Song
 def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
 end
 
 def to_s  
"KS: #{@name}--#{@artist} (#{@duration}) [#{@lyrics}]"  
 end
end

aSong = KaraokeSong.new("My Way", "Sinatra", 225, "And now, the...")  
puts aSong.to_s

>> KS: My Way--Sinatra (225) [And now, the...]

위의 to_s 코드를 보면 하위에서 부모의 인스턴스 변수에 직접 접근 하였다. 이런 방식은 부모 클래스와 커플링이 발생하기 때문에 좋은 방식이 아니다.  부모의 내부 구조를 뒤지고, 명시적으로 부모의 인스턴스 변수에 접근 하는 거은 자식 클래스가 부모의 구현에 너무 매이게 되는 결과를 낳는다. 아래와 같이 작성하여야 한다.
class KaraokeSong < Song
 # Format ourselves as a string by appending
 # our lyrics to our parent's #to_s value.
 def to_s
   super + " [#{@lyrics}]"
 end
end



Song 클래스를 생성할 때 부모 클래스를 정의하지 않았지만 기본적으로 Object 클래스를 상속 받게 되어 있다. Object 클래스에는 to_s 메서드를 비롯 35개가 넘는 메서드가 정의되어 있다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...