루비에서 상속 대신 데 delegation을 사용해야 하는 이유

Subclassing Array in Ruby - YouTube

3줄 요약

  • 루비에서 배열, 문자열, 해시와 같은 핵심 클래스를 상속하면 예상치 못한 문제에 직면할 수 있습니다.
  • 핵심 클래스의 메서드는 C로 구현되어 반환 값의 클래스가 하드 코딩되어 있어 상속 시 문제가 발생합니다.
  • 상속 대신 delegation을 사용하면 내부 배열을 활용하고 필요한 메서드만 재정의하여 문제를 해결할 수 있습니다.

루비 프로그래밍 시 배열과 유사하지만 약간 다른 동작을 하는 데이터 구조가 필요할 때가 있습니다. 이때 배열을 상속하여 원하는 기능을 추가하는 방법을 고려할 수 있지만, 이는 예상치 못한 문제로 이어질 수 있습니다. 따라서 이 영상에서는 루비에서 상속 대신 delegation을 사용하는 이유와 그 해결책을 제시합니다.

일반적으로 루비에서 배열을 상속하여 새로운 클래스를 만들면, 처음에는 잘 작동하는 것처럼 보입니다. 그러나 배열의 덧셈 연산과 같이 C로 구현된 핵심 메서드는 반환 값의 클래스가 하드 코딩되어 있어, 상속받은 클래스의 특성을 유지하지 못하고 일반 배열을 반환하는 문제가 발생합니다. 이러한 문제는 문자열, 해시와 같은 다른 핵심 클래스에서도 발생할 수 있으며, 프로그램의 동작을 예측하기 어렵게 만듭니다. 이러한 문제점을 해결하기 위해 상속 대신 delegation을 사용할 수 있습니다. Delegation은 내부적으로 배열을 가지고, 필요한 메서드만 재정의하여 원하는 동작을 구현하는 방식입니다. 예를 들어, tag_list 클래스를 만들 때 배열을 상속하는 대신, 내부적으로 배열을 가지고 + 연산자를 재정의하여 tag_list 객체를 반환하도록 할 수 있습니다. 또한 Enumerable 모듈을 포함시키고 each 메서드를 정의하면 map, select와 같은 다양한 Enumerable 메서드를 사용할 수 있게 됩니다.

결론적으로 루비에서 핵심 클래스와 유사하지만 약간 다른 동작을 하는 클래스를 만들 때는 상속 대신 delegation을 사용하는 것이 더 안전하고 효율적인 방법입니다. Delegation을 통해 핵심 클래스의 메서드 구현 방식에 영향을 받지 않고, 원하는 동작을 자유롭게 구현할 수 있습니다. 따라서 루비 프로그래밍 시 핵심 클래스를 확장해야 할 때는 delegation을 우선적으로 고려하는 것이 좋습니다.