Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby super 키워드 완벽 정리: 사용법과 동작 원리

Ruby에서 super 키워드는 정확히 어떤 역할을 할까요?

super현재 메서드와 같은 이름을 가진 메서드를 부모 클래스에서 호출하는 키워드입니다.

예를 들어, i_like_chocolate라는 메서드 안에서 super를 호출하면, Ruby는 해당 메서드가 속한 클래스의 부모 클래스에서 같은 이름의 메서드를 찾아 실행합니다.

이 과정은 일반 메서드 호출처럼 클래스 상속 체인(ancestry chain)을 따라 계속 위로 거슬러 올라갑니다.

만약 해당 메서드가 존재하지 않으면 NoMethodError 예외가 발생하고, method_missing이 정의되어 있다면 그 메서드가 대신 호출됩니다.

그럼 지금부터 실제 코드 예제를 통해 자세히 살펴보겠습니다!

인자 없이 super 사용하기

다음 예제에서는 Animal 클래스를 상속받는 Cat 클래스를 살펴봅니다.

Cat 클래스에는 name 메서드가 있으며, 이 메서드는 super를 사용해 부모 클래스(Animal)의 같은 메서드를 호출합니다.

class Animal
  def name
    puts "Animal"
  end
end

class Cat < Animal
  def name
    super
  end
end

cat = Cat.new
cat.name

# "Animal"

Ruby의 super 키워드는 인자를 넘기느냐 아니냐에 따라 다르게 동작한다는 점이 중요합니다.

인자 없이 사용할 경우:

원래 메서드 호출에 사용된 인자들이 그대로 부모 메서드에 전달됩니다. 키워드 인자(keyword arguments)나 블록(block)도 마찬가지로 함께 전달됩니다.

다음 예제를 보세요:

def puts(*)
  super
end

puts 1, 2, 3

클래스 밖에서 정의된 이 메서드는 Object 클래스에 속하게 됩니다. 따라서 이 메서드는 원래의 puts 메서드보다 먼저 호출됩니다.

즉, puts를 호출하면 우리가 새로 만든 이 메서드가 실행되고, 그 안에서 super가 원래의 puts를 호출하는 구조입니다.

super vs super(), 언제 무엇을 쓸까?

지금까지 부모 클래스의 메서드를 호출하기 위해 super를 사용하는 방법을 알아봤습니다.

그런데 부모 메서드가 받는 인자의 개수가 다르다면 어떻게 해야 할까요?

이럴 때는 다음과 같이 사용할 수 있습니다:

  • super() — 인자 없이 호출할 때
  • super(arg1, arg2, ...) — 전달할 인자를 직접 선택할 때

예제:

def puts
  super()
end

여기서 주목할 점은 괄호가 특별한 의미를 가진다는 것입니다. 일반적인 메서드 호출과 달리, super에서 괄호의 유무는 인자 전달 여부를 결정짓는 중요한 차이입니다.

super에 대해 추가로 알아두면 좋은 점

  • super는 반드시 메서드 내부에서만 사용할 수 있습니다
  • 부모 메서드의 반환값을 그대로 반환합니다
  • 여러 번 호출하는 것도 가능합니다

위에서 굵게 표시한 내용(super는 결과를 반환한다)은 실무 코드에서 super의 다양한 활용 사례를 이해하는 핵심 포인트입니다.

예를 들어 super를 활용하면 데코레이터 패턴(decorator pattern)을 구현할 수 있고, initialize 메서드 안에서 호출하면 부모 클래스의 인스턴스 변수 초기화에도 활용할 수 있습니다.

마무리

지금까지 Ruby의 super 키워드가 무엇인지, 그리고 다양한 상황에서 어떻게 동작하는지 배웠습니다!

인자 전달 방식의 차이, super()와의 비교, 반환값 활용법까지 제대로 익혀두면 상속 구조의 코드를 훨씬 자유롭게 다룰 수 있습니다.