Mixin

Posted 2006. 9. 20. 03:42
믹스인(mixin)은 일반적으로 스크립트 언어에서 다중 상속을 대신하는 방법으로 자주 쓰인다. 일반적으로 다중 상속을 사용하는 이유가 코드를 상속받기 위해서인데, Mixin은 클래스 계층을 변경하지 않고 코드만 포함시키는 방법을 제공하기 때문이다. 믹스인을 제공하는 대표적인 스크립트 언어가 루비인데, 다음 루비 프로그램을 살펴보자.


module Debug

  def whoAmI?

    "#{self.type.name} (\##{self.id}): #{self.to_s}"

  end

end

class Phonograph

  include Debug

  # ...

end

class EightTrack

  include Debug

  # ...

end

ph = Phonograph.new("West End Blues")

et = EightTrack.new("Surrealistic Pillow")

ph.whoAmI?       »       "Phonograph (#537766170): West End Blues"

et.whoAmI?       »       "EightTrack (#537765860): Surrealistic Pillow"

[http://www.rubycentral.com/book/tut_modules.html에서 발췌]


위에서 Phonograph와 EightTrack라는 두 가지 클래스를 정의했는데, 각각은 Debug 모듈을 임포트하고 있다. 루비언어는 클래스 내에서 모듈을 임포트할 경우 모듈 내의 함수가 자동으로 클래스의 메쏘드로 변환된다. 따라서 includeDebug라고 써주는 것만으로 두 클래스는 ph.whoAmI라는 메쏘드가 정의되게 된다. 즉 클래스 계층을 변화시키지 않고 코드만 재활용할 수 있는 것이다.

Job Interview

Posted 2006. 9. 18. 02:27
최근에 일본의 모회사와 면접을 봤는데, 기술 면접으로 다음과 같은 문제가 나왔습니다.

"링크 리스트에서 중간에 있는 엘리먼트를 찾는 효과적인 방법은 무엇인가?"

별로 어려운 문제는 아닌데, 러시아 특유의 영어 발음 때문에 문제를 알아 듣는데 조금 고생을 했습니다.

정답은 두 개의 포인터로 링크 리스트의 헤더를 가르킨 후에 한 포인터의 원소를 2개씩 증가시키고, 다른 한 포인터를 1개씩 증가시킵니다. 2개씩 증가시킨 포인터가 원소의 끝에 다다르면, 그 때 1개씩 증가시킨 포인터는 링크 리스트의 중간 원소를 가리키고 있는거죠.

Algebraic Simplification

Posted 2006. 9. 18. 01:49
algebraic simpification은 직관적인 컴파일러 최적화 기법이다. 예를 들어, 더하기 연산자(+ operator)의 항등원이 0 이라는 사실을 이용해 x + 0 이라는 expression을 x로 치환하는 것을 말한다.

원래 코드

main(int x, int y)
{
x = (y*1 + 0)/1;
}

변환 후에는

main(int x, int y)
{
x = y;
}
« PREV : 1 : ··· : 72 : 73 : 74 : 75 : 76 : 77 : 78 : ··· : 82 : NEXT »