본문 바로가기
[Python & Ruby]

[Python & Ruby] 클래스 멤버

by Hevton 2020. 12. 31.
반응형

 

인스턴스에 소속되어있는 인스턴스 멤버가 아닌

클래스에 소속되어있는 클래스 멤버에 대해 알아보자.

 

 

[ 클래스 메소드 ]

 

Python :

class Cs:
    @staticmethod
    def static_method():
        print("Static method")
    @classmethod
    def class_method(cls): # 인스턴스메소드에 self가 필요하듯이 인자 하나를 넣어줘야한다.
        print("Class method")
    def instance_method(self):
        print("Instance method")
i = Cs()
Cs.static_method()
Cs.class_method()
i.instance_method()

파이썬에서는 클래스 소속 메소드로 '클래스 메소드'와 '스태틱 메소드'가 있다.

 

 

Ruby :

class Cs
  def Cs.class_method()
    p "Class method"
  end
  def instance_method()
    p "Instance method"
  end
end
i = Cs.new()
Cs.class_method()
i.instance_method()
#Cs.instance_method() 오류발생.
#i.class_method() 오류발생

루비에서 클래스 멤버는 클래스적인 접근으로만 가능하고, 인스턴스 멤버는 인스턴스적인 접근으로만 가능한 것을 알 수 있다.

 

 

[ 클래스 변수 ]

class Cs:
    count = 0 # 이제알았다.. 이게 인스턴스 변수가 아니라 클래스 변수였다.
    def __init__(self):
        Cs.count = Cs.count + 1 # 메소드에서 접근할 때엔 Cs.을 찍어준다.
    @classmethod
    def getCount(cls): # classmethod 메소드에는 첫번째 인자로 cls값을 받는데, 이건 클래스를 가리킨다. (staticmethod도 클래스 소속이지만, 이렇게 인자를 받진 않는다)
        return Cs.count # 즉, Cs.count = cls.count 둘은 동일하다. (self=자바의this의 '의도'랑 동일한데, 객체가 아닌 클래스 단위라는것)
        
i1 = Cs()
i2 = Cs()
i3 = Cs()
i4 = Cs()
print(Cs.getCount())

 

파이썬에서 클래스 내부 && 메소드 외부 위치에 정의하는 변수는 '클래스 변수'다

클래스 변수는 클래스명을 붙이지 않고 그냥 작성하며, 메소드에서 접근할 때엔 클래스명.변수 로 접근해줘야한다.

 

 

Ruby :

class Cs
  @@count = 0 # 루비에서의 클래스변수 @@
  def initialize()
    @@count = @@count + 1
  end
  def Cs.getCount()
    return @@count
  end
end
i1 = Cs.new()
i2 = Cs.new()
i3 = Cs.new()
i4 = Cs.new()
p Cs.getCount()

루비에서 인스턴스 변수는 @변수명 이고 클래스 변수는 @@변수명 이다.

그리고 파이썬에서는 클래스메소드나 스태틱메소드에 @classmethod @staticmethod를 붙여줘서 소속을 명시해주는데 비해

루비에서는 이렇게 클래스명.메소드명 으로 정의해준다.

 

 

+ 클래스변수 이해를 위한 그림참고

 

출처 - opentutorials.org/

반응형