[루비 사용자 가이드] 객체 초기화

루비/레일스 프로그래밍/루비 사용자 가이드 2009.02.06 10:45

예전에 살펴봤던 Fruit 클래스는 두개의 인스턴스 변수가 있습니다. 하나는 과일의 종류를 저장하며, 다른 하나는 과일의 상태를 저장합니다. 이 두개의 특성이 과일에서 빠져서는 안된다는 것(즉 둘 다 Fruit클래스의 인스턴스 객체에서 반드시 초기화 되어야만 한다는 것)을, 우리는 우리 자신만의 inspect 메소드를 작성해 보고 난 후에 알 수 있었습니다. 운좋게도, 루비는 인스턴스 변수가 항상 초기화될 수 있도록 할 수 있는 방법을 제공합니다.

initialize 메소드

루비가 새로운 객체를 생성할 때마다, initialize라는 이름의 메소드를 찾아서 실행하게 됩니다. 따라서, 우리는 간단히 initialize를 사용해 인스턴스 변수에 디폴트 값을 저장하도록 해서, inspect 메소드가 인스턴스 변수의 값을 제대로 볼 수 있도록 해 줄 수 있습니다.

ruby> class Fruit
    |   def initialize
    |     @kind = "apple"
    |     @condition = "ripe"
    |   end
    | end
   nil
ruby> f4 = Fruit.new
   "a ripe apple"

가정을 요구사항으로 바꾸기

디폴트 값이 그리 적절한 의미를 담지 못하는 경우가 있습니다. 예를 들어 과일의 디폴트 종류는 무엇일까요? 각각의 과일이 생성시 자신이 어떤 종류인지를 명시하도록 요구하는게 바람직할 것입니다. 이를 위해 우리는 initialize 메소드에 형식 인자(formal argument)를 추가할 수 있습니다. 여기서는 자세히 살펴보지 않겠지만, 어떤 이유로 인해서, 여러분이 new를 할 때 지정하는 인자들이 실제로는 initialize로 전달됩니다.

ruby> class Fruit
    |   def initialize( k )
    |     @kind = k
    |     @condition = "ripe"
    |   end
    | end
   nil
ruby> f5 = Fruit.new "mango"
   "a ripe mango"
ruby> f6 = Fruit.new
ERR: (eval):1:in `initialize': wrong # of arguments(0 for 1)

유연성있는 초기화

위에서 initialize 메소드에 한 번에 하나의 인자만 연관된 경우를 살펴보았습니다. 이 인자를 빼먹게 되면 에러가 발생합니다. 좀 더 사용자에게 사려깊게 코딩하려면, 인자가 주어진 경우에는 그 값을 사용하고, 그렇지 않은 경우에는 디폴트 값을 사용할 수 있습니다.

ruby> class Fruit
    |   def initialize( k="apple" )
    |     @kind = k
    |     @condition = "ripe"
    |   end
    | end
   nil
ruby> f5 = Fruit.new "mango"
   "a ripe mango"
ruby> f6 = Fruit.new
   "a ripe apple"

initialize 뿐 아니라, 아무 메소드에서나 디폴트 인자값을 지정할 수 있습니다. 이때 디폴트 값이 지정되는 인자가 인자 목록의 맨 끝 쪽으로 오도록 배치해야만 합니다.

때때로 객체를 초기화 하는 여러 방법을 제공하는 것이 유용할 때가 있습니다. 이 가이드에서 설명할 범위는 아니지만, 루비는 객체 리플렉션(reflection,역주:동적으로 객체 구조를 다루고, 객체/클래스를 생성하며, 메소드를 호출할 수 있도록 하는 기능)을 지원하고, 가변 길이 인자 목록을 지원합니다. 이 두 가지를 함께 활용하면 메소드 오버로딩의 효과를 낼 수 있습니다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

티스토리 툴바