클래스 멤버(Class Member)




1
2
3
4
5
6
7
# ruby
require 'date'
d1 = Date.new(200011)
d2 = Date.new(201011)
p d1.year()
p d2.year()
p Date.today()
cs


지금까지 배운 변수와 메소드는 '인스턴스 멤버'였다.

이번에 배울 내용은 '클래스'에 소속 되어있는 변수와 메소드이다.

그렇다면 인스턴스의 멤버와 클래스멤버의 차이점과,

왜 이런 차이점을 가지고 있는지에 대해 생각해보자.


먼저 루비에서 날짜에 대한 기능을 가지고 있는 객체를 살펴보자

require 로 date객체를 불러온 후 d1이라는 변수에 Date 객체를 이용해서 인스턴스를 만든다.

똑같은 방법으로 d2 변수에도 인스턴스를 만든다.


현재 d1에는 2000년 1월 1일 이라는 데이터를 가지고 있으며, d2에는 2010년 1월 1일 이라는 데이터가 있다.

이 상태에서 d1 인스턴스에 속해 있는 year라고 하는 메소드를 실행시키면 

이 메소드는 자신이 속해있는 d1이라는 인스턴스의 내부에 저장되어있는 년도의 값을 리턴한다.

이처럼 year라는 메소드는 d1에 속해있기때문에 내부에 소속되어있는 2000이라는 값을 리턴하는 것이다.

반대로 밑에 있는 year는 d2에 소속이므로 d2의 내부값인 2010을 화면에 출력하게된다.


여기서 중요한점은 year라는 메소드들은, 하는일은 같지만 각각의 메소드들이 누구의 소속이느냐에 따라서

그 소속된 인스턴스의 내부값을 사용해서 결과를 리턴한다는 것이다.

바로 그런점에 각각의 메소드는 각각의 인스턴스의 소속되어있다 라고 할수 있다.


이번에는 Date라는 클래스를 직접 지정하고 today라고 하는 메소드를 호출해서 출력해보자.

결과는 현재, 오늘의 값이 나오게 된다.

위에 있는 2개의 메소드와 밑에 있는 메소드의 가장 큰 차이는 두 메소드는 각각 인스턴스의 소속이었으나,

아래의 메소드는 클래스 소속이라는 것이다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ruby
class Cs
  def Cs.class_method()
    p "Class method"
  end
  def instance_method()
    p "Instance method"
  end
end
= Cs.new()
Cs.class_method()
i.instance_method()
#Cs.instance_method() 오류발생
#i.class_method() 오류발생
cs


이번에는 우리가 직접 클래스에 소속되어있는 멤버를 활용해서 코드를 작성하는 방법을 알아보자

먼저 루비 코드이다.

Cs라는 클래스를 선언하고 안에 메소드를 만들어준다.

위의 코드에서 클래스안에 2개의 메소드가 있는데 두 메소드의 차이점을 찾아보자.

첫번째 메소드는 메소드 이름 앞에 소속되어있는 클래스 이름이 붙어 있다.

이렇게 메소드 이름앞에 클래스 이름이 붙어 있으면 클래스 멤버가 된다.


따라서 아래에 해당 메소드를 호출할때, Cs.class_mathod와 같이 클래스 이름으로 호출해야하며

인스턴스 멤버는 해당 인스턴스로부터 호출해야한다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
# python
class Cs:
    @staticmethod
    def static_method():
        print("Static method")
    @classmethod
    def class_method(cls):
        print("Class method")
    def instance_method(self):
        print("Instance method")
= Cs()
Cs.static_method()
Cs.class_method()
i.instance_method()
cs


다음은 파이썬의 클래스 멤버 생성 예제이다.

파이썬은 루비와 다르게 클래스 멤버로 해당하는 메소드가 2가지 종류가있다.

 static 메소드와 class 메소드가 그것이다.


우선 인스턴스 메소드에는 첫번째 인자로 self가 들어가게 된다.

그리고 static 메소드와 class메소드를 설정하기 위해서 해당 메소드 위에 @ 장식자를 붙여준다.

이렇게 @staticmethod, @classmethod로 구분하게 된다.

또한 classmethod는 첫번째 인자로 cls를 가져야한다. 이 cls는 클래스를 가리킨다.


이와 같은 형식으로 static과 class를 선언할 수 있다.

지금 단계에서는 static과 class를 동일 하다고 생각하자.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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()
cs


다음은 클래스 멤버 중에서 클래스 변수이다. 먼저 루비 코드이다.

위의 코드에서 바로 알수 있듯이 @@가 2개 붙어있으면 클래스 변수가 된다.

클래스 변수는 모든 인스턴스가 공유하는 변수이다.

따라서 인스턴스를 만들때마다 클래스 변수가 1씩 증가했으므로 최종적으로 3이 출력된다.


다시 말하자면 @가 1개 붙어있을때는 인스턴스변수이며, 인스턴스마다 생성되므로 모두 다른 값을 가질수 있으나

@@가 2개 붙어있는 것은 클래스에 소속된 클래스 변수이므로 모든 인스턴스에서 값을 공유하게 된다.





1
2
3
4
5
6
7
8
9
10
11
12
13
# python
class Cs:
    count = 0
    def __init__(self):
        Cs.count = Cs.count + 1
    @classmethod
    def getCount(cls):
        return Cs.count
i1 = Cs()
i2 = Cs()
i3 = Cs()
i4 = Cs()
print(Cs.getCount())
cs


이번에는 클래스 변수의 파이썬 버전이다.

클래스 변수를 만들기 위해서 Cs를 변수 앞에 붙여준다. 

이 때 주의할 점은 class 안, 메소드들의 밖에 있는 변수는 자동으로 클래스 변수로 선언되기때문에 

그 변수 앞에는 클래스 이름을 붙이면 안된다.

따라서 메소드 내부에서 클래스 변수에 접근할 때만 클래스 이름을 붙여준다.



출처 : 생활코딩, 파이썬&루비



저작자 표시
신고
  1. ruby_newbie 2017.06.29 15:26 신고

    본문의 Class Cs, ruby 변수에서 initialize가 4번 되었으니 4를 print하는 것이 맞지 않나요?

+ Recent posts

티스토리 툴바