IMCAT.DEV
로그인 가입
Ruby 중급 자료구조

Ruby 제네릭과 타입

Ruby 제네릭과 타입 — 중급

제네릭과 타입

1. 도입 (왜 배워야 하는가)

프로그래밍에서 데이터의 타입은 매우 중요합니다. 특히 실무에서는 다양한 종류의 데이터가 서로 얽히고 섥히기 때문에, 올바른 타입을 사용하지 않으면 예기치 못한 오류가 발생할 수 있습니다. 제네릭은 이러한 문제를 해결하는 데 매우 유용한 도구입니다.

예를 들어, 쇼핑몰에서 다양한 상품을 관리할 때, 상품의 타입(의류, 전자기기 등)에 따라 다른 속성을 가질 수 있습니다. 만약 타입을 명확히 하지 않으면, 코드의 가독성이 떨어지고, 나중에 다른 개발자가 코드를 읽거나 수정할 때 큰 혼란을 겪게 됩니다.

제네릭을 사용하지 않으면, 타입 안전성을 잃게 되며, 프로그램의 안정성과 유지보수가 어려워지게 됩니다.

2. 핵심 개념 설명

제네릭 (Generics)

제네릭은 타입을 매개변수로 받을 수 있는 기능으로, 코드의 재사용성과 타입 안전성을 높여줍니다. 쉽게 말해, 다양한 타입의 데이터를 처리할 수 있는 '틀'을 만드는 것입니다.

예를 들어

제네릭을 사용하는 것은 마치 여러 크기의 상자를 만들어 놓고, 필요할 때마다 그에 맞는 크기의 물건을 넣는 것과 같습니다. 상자의 크기에 상관없이 물건을 넣을 수 있으며, 나중에 어떤 크기의 물건이 들어있더라도 상자는 무사하죠.

용어설명
제네릭타입을 매개변수로 받아 다양한 타입을 사용할 수 있게 해줌
타입 안전성잘못된 타입으로 인한 오류를 컴파일 타임에 예방해줌

3. 기본 코드 예제

제네릭을 사용하는 간단한 예제를 살펴보겠습니다.

class Box
  def initialize(value)
    @value = value
  end

  def get_value
    @value
  end
end

# Box 클래스를 사용해 문자열과 정수를 담아보겠습니다.
string_box = Box.new("Hello")
integer_box = Box.new(123)

puts string_box.get_value  # 출력: Hello
puts integer_box.get_value  # 출력: 123

실행 결과

Hello
123

코드 한 줄씩 동작 설명

  • class Box: Box라는 클래스를 정의합니다.
  • def initialize(value): 초기화 메서드를 통해 값을 받습니다.
  • @value = value: 받은 값을 인스턴스 변수 @value에 저장합니다.
  • def get_value: 값을 반환하는 메서드를 정의합니다.
  • string_box = Box.new("Hello"): 문자열 "Hello"를 담는 Box 객체를 생성합니다.
  • integer_box = Box.new(123): 숫자 123을 담는 Box 객체를 생성합니다.
  • puts string_box.get_value: string_box에서 값을 가져와 출력합니다.
  • puts integer_box.get_value: integer_box에서 값을 가져와 출력합니다.
  • 4. 실전 활용 예제

    예제 1: 쇼핑몰 장바구니

    장바구니에서 다양한 타입의 상품을 저장할 때 제네릭을 사용할 수 있습니다.

    class ShoppingCart
      def initialize
        @items = []
      end
    
      def add_item(item)
        @items << item
      end
    
      def show_items
        @items.each { |item| puts item }
      end
    end
    
    cart = ShoppingCart.new
    cart.add_item("티셔츠")
    cart.add_item(200) # 가격
    cart.show_items

    예제 2: 데이터베이스 레코드

    데이터베이스의 다양한 타입의 레코드를 다룰 때 제네릭을 사용할 수 있습니다.

    class Record
      def initialize(data)
        @data = data
      end
    
      def display
        puts @data.inspect
      end
    end
    
    user_record = Record.new({ name: "홍길동", age: 30 })
    user_record.display

    5. 흔한 실수와 주의사항

    실수 1: 잘못된 타입 사용

  • 잘못된 코드
  • cart.add_item(["티셔츠", "바지"]) # 배열을 추가
  • 올바른 코드
  • cart.add_item("티셔츠") # 문자열을 추가

    실수 2: 타입 변환 미비

  • 잘못된 코드
  • price = "200"
    cart.add_item(price.to_i) # 문자열을 숫자로 변환하지 않음
  • 올바른 코드
  • price = "200"
    cart.add_item(price.to_i) # 문자열을 숫자로 변환 후 추가

    6. 정리

  • 제네릭은 타입을 매개변수로 받아 다양한 타입을 처리할 수 있게 해줍니다.
  • 타입 안전성을 제공하여 코드의 안정성을 높입니다.
  • 실무에서 장바구니, 데이터베이스 등의 다양한 패턴에서 유용하게 사용됩니다.
  • 다음에 학습하면 좋은 주제로는 '모듈과 믹스인'을 추천합니다.