Ruby에서 initialize 메서드는 객체 생성 과정의 일부로, 객체의 초기값을 설정할 수 있게 해주는 특별한 메서드입니다.
다른 프로그래밍 언어에서는 이를 "생성자(constructor)"라고 부릅니다.
왜 initialize 메서드가 필요할까요?
예를 들어 좌표 x와 y 두 개의 값을 필요로 하는 Point 클래스가 있다고 가정해 보겠습니다.
그렇다면 이 값들을 어떻게 객체에 전달해야 할까요?
바로 이렇게 말입니다:
Point.new(10, 20)
new 메서드는 Point 클래스나 접근 가능한 다른 클래스로부터 새로운 객체를 생성하는 방법입니다.
new와 initialize의 관계
10과 20이라는 두 개의 인자를 눈여겨보세요. 여기서 바로 initialize 메서드가 등장합니다.
new에 인자를 전달하려고 하는데 initialize 메서드를 정의하지 않으면 다음과 같은 에러가 발생합니다:
ArgumentError: wrong number of arguments (2 for 0)
그 이유는 간단합니다. new를 호출하면 Ruby가 내부적으로 initialize를 호출하기 때문입니다!
따라서 다음과 같은 정의가 반드시 필요합니다:
class Point def initialize(x, y) end end
이제 두 개의 인자를 사용해 Point 객체를 생성할 수 있습니다.
결국 initialize의 핵심 목적은 인자를 전달하면서 객체를 생성할 수 있도록 해주는 것입니다.
전달받은 인자 저장하기
initialize에 전달된 인자는 자동으로 어딘가에 저장되지 않습니다.
인스턴스 변수(instance variable)를 사용해 직접 저장해야 합니다:
class Point
def initialize(x, y)
@x = x
@y = y
end
end
이렇게 하면 x와 y의 값이 인스턴스 변수(@x, @y)에 할당되어 나중에 접근할 수 있습니다.
initialize 메서드 사용 시 알아두면 좋은 점
- 선택적 인자와 기본값 인자를 정의할 수 있습니다
- 이 메서드 안에서
return을 사용하는 것은 의미가 없습니다. 특별한 메서드이기 때문에 항상 새로운 객체를 반환합니다 - 클래스가 인자를 필요로 하지 않는다면
initialize를 정의하는 것은 필수가 아닙니다
initialize 내부에서 다른 메서드를 호출하는 것도 가능하지만, 객체를 사용할 준비를 하는 데 필요한 작업 이상으로 무거운 로직을 넣는 것은 피하는 것이 좋습니다.
예를 들어, 클래스가 GitHub API와 관련된 작업을 한다면 가능한 모든 API 요청을 미리 불러오지 않아야 합니다.
API 키를 인스턴스 변수에 저장하는 것, 혹은 클래스에 필요한 데이터만 준비하면 충분합니다.
해시(Hash) 등 내장 객체 초기화하기
해시 같은 내장 객체들은 new를 호출하는 것 외에도 객체를 초기화하고 생성하는 특별한 방법들을 제공합니다.
해시를 생성하는 방법:
h = Hash.new
h = Hash['a', 1]
h = {}
문자열을 생성하는 방법:
s = String.new s = "" s = %Q()
배열을 생성하는 방법:
a = Array.new(5) a = %w(a b c) a = []
참고로 %w는 문자열 배열을 만들 때 사용하는 문법입니다.
마무리
이번 글에서는 Ruby의 initialize 메서드에 대해 살펴보았습니다. new 메서드와의 관계, 그리고 Ruby에서 객체가 생성되는 기본 원리까지 함께 이해하게 되었기를 바랍니다.
더 깊이 학습하고 싶다면 Ruby 객체 지향 프로그래밍(OOP) 입문 자료를 참고해 보세요.
읽어주셔서 감사합니다!