생활코딩

Coding Everybody

클래스 맴버

토픽 생활코딩 > 언어 > Python & Ruby

클래스 맴버 소개

Ruby

require 'date'
d1 = Date.new(2000, 1, 1)
d2 = Date.new(2010, 1, 1)
p d1.year()
p d2.year()
p Date.today()

ideone.com 

클래스 메소드 (Ruby)

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() 오류발생

ideone.com 

클래스 메소드 (Python)

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")
i = Cs()
Cs.static_method()
Cs.class_method()
i.instance_method()

ideone.com

클래스 변수 (Ruby)

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()

ideone.com 

클래스 변수 (Python)

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())

ideone.com

클래스 맴버의 활용 (Ruby)

class Cal
  attr_reader :v1, :v2
  attr_writer :v1
  @@_history = []
  def initialize(v1,v2)
    @v1 = v1
    @v2 = v2
  end
  def add()
    result = @v1+@v2
    @@_history.push("add : #{@v1}+#{@v2}=#{result}")
    return result
  end
  def subtract()
    result = @v1-@v2
    @@_history.push("subtract : #{@v1}-#{@v2}=#{result}")
    return result
  end
  def setV1(v)
    if v.is_a?(Integer)
      @v1 = v
    end
  end
  def getV1()
    return @v1
  end
  def Cal.history()
    for item in @@_history
      p item
    end
  end
end
class CalMultiply < Cal
  def multiply()
    result = @v1*@v2
    @@_history.push("multipy : #{@v1}*#{@v2}=#{result}")
    return result
  end
end
class CalDivide < CalMultiply
  def divide()
    result = @v1/@v2
    @@_history.push("divide : #{@v1}/#{@v2}=#{result}")
    return result
  end
end
c1 = CalMultiply.new(10,10)
p c1.add()
p c1.multiply()
c2 = CalDivide.new(20, 10)
p c2, c2.add()
p c2, c2.multiply()
p c2, c2.divide()
Cal.history()

ideone.com 

클래스 맴버의 활용 (Python)

Python 

class Cal(object):
    _history = []
    def __init__(self, v1, v2):
        if isinstance(v1, int):
            self.v1 = v1
        if isinstance(v2, int):
            self.v2 = v2
    def add(self):
        result = self.v1+self.v2
        Cal._history.append("add : %d+%d=%d" % (self.v1, self.v2, result))
        return result
    def subtract(self):
        result = self.v1-self.v2
        Cal._history.append("subtract : %d-%d=%d" % (self.v1, self.v2, result))
        return result
    def setV1(self, v):
        if isinstance(v, int):
            self.v1 = v
    def getV1(self):
        return self.v1
    @classmethod
    def history(cls):
        for item in Cal._history:
            print(item)
class CalMultiply(Cal):
    def multiply(self):
        result = self.v1*self.v2
        Cal._history.append("multiply : %d*%d=%d" % (self.v1, self.v2, result))
        return result
class CalDivide(CalMultiply):
    def divide(self):
        result = self.v1/self.v2
        Cal._history.append("divide : %d/%d=%d" % (self.v1, self.v2, result))
        return result
c1 = CalMultiply(10,10)
print(c1.add())
print(c1.multiply())
c2 = CalDivide(20,10)
print(c2, c2.add())
print(c2, c2.multiply())
print(c2, c2.divide())
Cal.history()

ideone.com

댓글

댓글 본문
  1. 냥더쿠
    210807 잘 들었습니다
  2. 미뇨르
    210704 완료!!
  3. 정효빈
    잘들었습니다!
  4. 드림보이
    잘 들었습니다...
  5. 후니
    완료
  6. Hyunwoo Kim
    210207 감사히 잘 들었습니다 :)
  7. 홍주호
    20.12.13
  8. 윤유상
    클래스 멤버에는 클래스 메소드, 클래스 변수 등이 있다. 인스턴스 메소드는 인스턴스에서만, 클래스 메소드는 클래스에서만 작동한다. 인스턴스변수는 하나의 인스턴스 안에서만 유효한 반면, 클래스 변수는 클래스 전체에서 활용가능하다. 예를 들어 Cal.history는 클래스 변수라 Cal클래스와 상속받은 클래스를 복제한 모든 인스턴스에서 값을 push 받을 수 있다. 반면, self.v1으로 쓰인 변수는 인스턴스변수라 self.v1에 주어진 값이 하나의 인스턴스 내에서만 유효하고 다른 인스턴스에 영향을 주지 않는다. 루비는 변수 앞에 @@를 붙여서, 파이썬은 앞에 클래스 이름.을 붙여서 클래스 변수를 사용한다. 어려운 내용이라 다음에 다시 복습하러 오겠습니다 ㅎㅎ 감사합니다!
  9. 양민
    11/21
  10. cgoing
    cgoing / 2020.09.28
  11. 허우룩
    2020.09.24
  12. 캄바캄바
    #인스턴스에따라 다르게 존재해야하는 메소드들 메소드 소속으로
    만들어야하고 그와 상관없 동작하는 메소드들은 인스턴스 멤버 x 클래스로 만들면된다
    클래스의 장점 인스턴스 안만들어도 되니까 간편
  13. 캄바캄바
    2020-08-21
  14. PlayerSEAN
    쿠키앤크림님 따라잡기
    2020/08/06 완료
  15. 쿠키앤크림
    pupu님 따라잡기
    2020/07/04 완료
    어렵다
  16. oxugi
    2020-04-10 완료
  17. 맥반장
    2020-04-03 완료!
  18. 지나가던코딩쟁이
    클래스 안에 있는 변수 및 메소드는 호출의 개념이 아니라 정의의 개념으로 보셔야할 것 같습니다.
    해당 count 필드는 초기값이 0인 상태로 정의돼있는겁니다!
    대화보기
    • liero1p
      제 생각에는 우선 클래스 안에서 initialize보다 더 앞에 @@count = 0 이 있기 때문에 @@count 에 0이 설정되어 있는 상황이구요. initialize 인스턴스가 실행될때 그 안에 있는 코드대로 진행될텐데, 그 안의 코드에서 @@count에 1씩 추가하라고 했기에, 인스턴스가 매번 실행될때마다 initialize가 실행되면서 @@count 가 1씩 증가하는 것 같습니다.

      결론은, @@count는 클래스 안에 있지만 initialize와는 독립된 변수로 보심이 맞을 것 같네요
      대화보기
      • 박혜진
        클래스 변수에 대해 질문 하나 드려도 될까요?
        생성자 수업에서 말씀하시길, 클래스에서 인스턴스가 생성될때 initialize/__init__이 가장 먼저 실행된다고 하셨던 것 같은데 클래스 변수 값 설정하는 부분이 (즉, @@count =0 과 count=0) initialize/__init__보다 먼저 읽히는 건가요? 그리고 만약 그런거라면 그 다음 인스턴스 생성시에도 클래스 변수 값 0으로 설정하는 부분이 다시 읽히면서 +1 됐던 값이 다시 0이 되어야 하는 건 아닌가요?

        늘 정말 감사하게, 그리고 감탄하면서 듣고 있습니다. 정말 감사합니다!
      • 가재준
        완료
      • 홍주호
        20190825 완료
      • 허니비
        190808
      • 얼그레이
        190607 역대급으로 어려웠던 수업 같아요! 틈틈히 복습해야겠네요 ㅎㅎ 감사합니다~!
      • Hotak Choi
        19 05 06 !!
      • huyk
        190503완료 감사합니다
      • 떡이
        사랑합니다.
      • wiseman
        190421 1630 완료
      • 19.04.17 완료
      • 호두
        고마븝니다
      • 주니
        이해가 잘 되네요... 감사합니다.
      • 김정석
        조금은 복잡하네요 !
      • kmw8462
        감사합니다.
        다시 한번더 듣기.
      • yareuk
        2018-12-24
      • 루이보스라떼
        2018.12.09.
      • 규동부리
        181204 여기까지 왔습니다!
        하루 30분 ~ 1시간!! 꾸준히 따라가겠슴다
      • 닐반
        2018. 10. 14.
      • 유닉스가이
        감사합니다.
      • 해릭
        180722 감사합니다.
      • Ji Yeoun Park
        2018.07.03 감사합니다
      • 정병찬
        2018 06 28
        수강완료
      • 다람쥐
        감사합니다!
      • Jaeduk Jang
        완료했습니다. 감사합니다.
      • 고맙습니다
        제가 공부해본 경험상 클레스 메소드와 인스턴스 메소드 구분 못하면 순간 코드 해석이 잘 안되더라구요. 정말 책으로 공부를 할 이유가 없게 만들어버리시는 영상물입니다.
      • 코딩잘하고싶어요 ㅎ
        아니요 생략하시면 안 됩니다. 밑에서 Cal.history()로 적은 이유는 Cal 클래스에 있는 history라는 메소드를 호출하기 위해서입니다. history()와 _history는 둘 다 클래스 소속은 맞지만 각각 메소드와 어트리뷰트로 완벽히 다릅니다.

        아마 메소드 이름과 어트리뷰트 이름 간에 착오가 있으신 듯 합니다...
        대화보기
        • Heonjin Ha
          질문: 왜 Class method와 Instance method와 static method를 나누지?
          내가 생각하는 답변.
          class에서 받은 데이터와
          instance에서 받은 데이터가 다르게 동작할수 있음. 그걸 효율적으로 관리하기 위해서.
          Static method는 데이터와 관련 없는 method같음.(ㅠㅠㅠ몰라..)
          진짜 답변은 무엇인가요?
        • Heonjin Ha
          기억하기 위해 적어놉니다 :
          @한개는 instance에 들어간다.
          @@두개는 class에 들어간다.
          @가 없는것은 method안에 들어간다.
        • Heonjin Ha
          6일만에 이부분까지 왔어요.
          먼저 다른 언어를 많이 알고 있는 상태였어요.(matlab, C, R)
          새로이 알게된부분은 모듈, 객체지향밖에 없어서 빨리 들을수 있었어요.
          원동력이라 하면, 제가 python으로 하고자 하는게 있는데, 그걸 빨리 해보고싶어서 그런거같아요.
          제가 만들고자 하는건 '웹크롤링'이라는 것인데, 인터넷 찾아보시면 매우 흥미롭답니다.
          그리고, 다른 원동력으로는 친구들에게 언어를 배웠다고 자랑을 많이했어요.

          공부중님 작성자는 아니지만, 댓글 남겨봐요.
          대화보기
          • orez
            같지만 또 다른 얘기들이 반복되는 듯 하네요. 재밌어요 ^_^, 감사합니다.
          • 성현아빠
            완료