Ruby에서 self
의 동작 방식은 크게 세 가지 주요 맥락으로 나누어 설명할 수 있습니다.
1. 인스턴스 메서드 내에서의 self
- 역할: 인스턴스 메서드 내에서
self
는 해당 메서드를 호출한 객체의 인스턴스 자체를 참조합니다. - 예시:
class Dog
내의 인스턴스 메서드#says
에서self.name
을 호출할 경우, 이는Dog
클래스의 특정 인스턴스(예:dog1
)의name
속성에 접근하는 것을 의미합니다. - 핵심:
self
를 통해 인스턴스 변수나 다른 인스턴스 메서드에 접근할 수 있습니다.
2. 클래스 메서드 정의 및 내에서의 self
- 역할: 메서드 이름 앞에
self
를 붙여 정의하는 경우, 이는 클래스 메서드임을 나타내며, 이때의self
는 클래스 자체를 참조합니다. 클래스 메서드 내부에서도self
는 클래스를 지칭합니다. - 예시:
Dog
클래스에 정의된self.pack
메서드는 클래스 메서드입니다. 이 메서드는@@pack
과 같은 클래스 변수를 사용하여 모든Dog
인스턴스의 수를 추적하는 등 클래스 수준의 데이터를 관리할 수 있습니다. - 핵심: 인스턴스는 다른 인스턴스에 대해 알지 못하지만, 클래스는 모든 인스턴스를 추적하고 관리할 수 있습니다.
3. 다양한 맥락에서의 self
활용
- 인스턴스 메서드 내
self
: 여전히 인스턴스 자체를 참조합니다. (예:Dog
인스턴스의#what_am_i
메서드 내self
는 인스턴스를 반환) - 클래스 메서드 정의:
self.method_name
형태로 클래스 메서드를 생성할 때self
는 클래스를 지칭합니다. - 클래스 메서드 내
self
: 클래스 메서드 본문 내에서self
는 클래스 자체를 지칭합니다. - 클래스 자체 참조: 클래스 메서드가 아닌 곳에서 클래스 자체를 참조해야 할 경우,
self.class
를 사용하여 해당 객체의 클래스를 얻을 수 있습니다. (예: 인스턴스 메서드 내에서self.class
를 호출하면 해당 인스턴스의 클래스인Dog
가 반환됨) - 핵심:
self
는 코드의 특정 지점에서 현재 실행 컨텍스트에 따라 동적으로 인스턴스 또는 클래스를 가리키며, 이를 통해 유연한 객체 지향 설계를 가능하게 합니다.