본문 바로가기
카테고리 없음

객체와 클래스4

by 경자꿈사 2024. 7. 19.

이전 글에서 우리는 클래스로부터 생성한 인스턴스(객체)가 아니라 클래스 자체에 대해서도 메서드를 호출할 수 있었는데 어떻게 그게 가능한걸까? 이유는 간단하다. 클래스도 하나의 객체이기 때문이다!

아래 그림을 보자. 우선 비어 있는 Person 클래스 하나를 만들고 그 Person 클래스의 객체를 하나 생성하여 변수 p 가 해당 객체를 참조하도록 하였다.

그리고 변수 p 를 사용하여 Person 객체의 class 메서드를 호출하니 결과로 Person 클래스를 돌려 주었다.

즉 class 메서드는 호출 대상 객체가 어느 클래스의 인스턴스(객체)인지를 알려주는 메서드이다.

그렇다면 클래스도 하나의 객체라고 했으니 Person 클래스에 대해 class 메서드를 호출하면 어떤 결과가 나올까?

그림에서 보이는 것처럼 Class 라는 이름의 클래스를 돌려 주었다. 어찌보면 당연한 결과이기도 하다. 우리는 '사람' 이라는 객체를 표현하기 위해 Person 클래스를 정의했다. 그리고 Person 클래스로 부터 생성된 객체라면 Person 클래스에 정의된 속성과 메서드를 갖는다는 공통의 특성이 있었다. 이와 유사하게 Person 같은 클래스들도 '클래스'라면 갖게 되는 공통의 특성 같은 게 있지 않을까 라는 생각을 해 본다면 클래스를 표현하는 상위 개념의 '뭔가'가 있을 수도 있겠다 라는 생각까지도 해볼 수 있을 것 같다. 실제 그 '뭔가' 라는 게 존재하는데 그게 바로 Class 클래스이고 그래서 결국 '사람' 객체를 표현하기 위해 우리가 직접 만든 Person 클래스나 문자열을 나타내는 String 클래스 그리고 배열을 나타내는 Array 클래스 또 해시를 나타내는 Hash 클래스 등 모든 클래스들이 다 Class 클래스의 인스턴스(객체)들이다.

?> class Person
>> end
=> nil
>> p = Person.new
=> #<Person:0x000002157a8735e8>
>> p.class
=> Person
>> Person.class
=> Class
>> "문자열".class
=> String
>> String.class
=> Class
>> [1,2,3].class
=> Array
>> Array.class
=> Class
>> { lang: "Ruby" }.class
=> Hash
>> Hash.class
=> Class

아래 코드와 같이 instance_of? 메서드로도 확인이 가능하다. Person 객체에 대해서는 Person 클래스의 인스터스인지 물었을 때 참임을 알려주고 Person 클래스에 대해서는 Class 클래스의 인스턴스인지 물었을 때 참이라고 대답해 준다.

?> class Person
>> end
=> nil
>> p = Person.new
=> #<Person:0x000002c6e44eec08>
>> p.instance_of? Person
=> true
>> Person.instance_of? Class
=> true
>> String.instance_of? Class
=> true
>> Array.instance_of? Class
=> true
>> Hash.instance_of? Class
=> true

Person 이나 String 같은 일반적인 클래스들과 Class 클래스와의 관계를 실생활에서 예를 찾아보면 이런 게 있을 수 있겠다. 우리가 시장에서 사 먹는 붕어빵이나 국화빵을 생각해 보면 모양과 맛이 다른데 (일단 모양에만 집중) 이것은 붕어빵과 국화빵을 만드는 틀의 모양이 서로 달라서이다. 여기서 붕어빵 틀과 국화빵 틀을 '클래스'라고 한다면 해당 틀에서 만들어져 나온 붕어빵과 국화빵이 '객체' 가 되는 것이다. 그리고 같은 틀을 사용하여 만든 붕어빵이라 해도 만들 때 속재료로 팥앙금을 쓰냐 슈크림을 쓰냐에 따라 맛이 달라지는데 여기서 속재료는 '속성' 에 비유할 수 있겠다.

<출처: 구글 이미지 검색>

그리고 생각해 보면 저 붕어빵 틀이나 국화빵 틀 역시 그냥 어디서 생겨나는 것이 아니라 붕어빵 모양의 금형을 먼저 만들고 그것을 사용해서 붕어빵 틀을 주조해야 만들어지는 것이다. 여기서 어떠한 모양의 틀이라도 만들어 낼 수 있는 금형이 있다고 한다면 그것이 바로 Class 클래스라고 할 수 있겠다.

다음 글에서는 클래스와 비슷하지만 다른 특성을 지닌 모듈에 대해 알아보도록 하자.

See you again~~