Python & Ruby

객체와 변수

인캡슐레이션(캡슐화)

 인스턴스 변수의 특성

Python

class C(object):
    def __init__(self, v):
        self.value = v
    def show(self):
        print(self.value)

c1 = C(10)
print(c1.value)
c1.value = 20
print(c1.value)
c1.show()
10
20
20

ideone.com 

Ruby

class C
  def initialize(v)
    @value = v
  end
  def show()
    p @value
  end
end
c1 = C.new(10)
# p c1.value
# c1.value = 20
c1.show()
10

ideone.com 

 set / get 메소드

Python

class C(object):
    def __init__(self, v):
        self.value = v
    def show(self):
        print(self.value)
    def getValue(self):
        return self.value
    def setValue(self, v):
        self.value = v
c1 = C(10)
print(c1.getValue())
c1.setValue(20)
print(c1.getValue())
10
20

ideone.com

class C
  def initialize(v)
    @value = v
  end
  def show()
    p @value
  end
  def getValue()
    return @value
  end
  def setValue(v)
    @value = v
  end
end
c1 = C.new(10)
# p c1.value
p c1.getValue()
# c1.value = 20
c1.setValue(20)
p c1.getValue()
10
20

ideone.com

set/get 메소드를 사용하는 이유

Python 

class Cal(object):
    def __init__(self, v1, v2):
        if isinstance(v1, int):
            self.v1 = v1
        if isinstance(v2, int):
            self.v2 = v2
    def add(self):
        return self.v1+self.v2
    def subtract(self):
        return self.v1-self.v2
    def setV1(self, v):
        if isinstance(v, int):
            self.v1 = v
    def getV1(self):
        return self.v1
c1 = Cal(10,10)
print(c1.add())
print(c1.subtract())
c1.setV1('one')
c1.v2 = 30
print(c1.add())
print(c1.subtract())
20
0
40
-20

ideone.com

 Ruby

class Cal
  attr_reader :v1, :v2
  attr_writer :v1
  def initialize(v1,v2)
    @v1 = v1
    @v2 = v2
  end
  def add()
    return @v1+@v2
  end
  def subtract()
    return @v1-@v2
  end
  def setV1(v)
    if v.is_a?(Integer)
      @v1 = v
    end
  end
  def getV1()
    return @v1
  end
end
c1 = Cal.new(10,10)
p c1.add()
p c1.subtract()
c1.setV1('one')
c1.v1 = 20
p c1.add()
c1.getV1()
20
0
30

ideone.com

속성

수업에서는 구분하지 않았습니다만 외부에서 접근 가능한 변수를 파이썬은 property 루비는 attribute라고 합니다. 

 Python

class C(object):
    def __init__(self, v):
        self.__value = v
    def show(self):
        print(self.__value)
c1 = C(10)
#print(c1.__value)
c1.show()
10

ideone.com

Ruby

class C
  #attr_reader :value
  #attr_writer :value
  attr_accessor :value
  def initialize(v)
    @value = v
  end
  def show()
    p @value
  end
end
c1 = C.new(10)
p c1.value
c1.value = 20
p c1.value
10
20

ideone.com

참고

github 

댓글

댓글 본문
  1. Byunghawk Lee
    감사합니다.
  2. Victorim
    완료!
  3. 냥더쿠
    210806
  4. 미뇨르
    210703 완료!!
  5. 정효빈
    완료했습니다!
  6. 드림보이
    잘 들었습니다...
  7. 후니
    완료
  8. Hyunwoo Kim
    210206 감사히 잘 들었습니다. :)
  9. 홍주호
    20.12.13 완료
  10. 윤유상
    루비에서 인스턴트객체에 직접 접근할 수 없는 이유는, 루비는 파이썬과 다르게 클래스 내 함수를 괄호없이 사용할 수 있어서, 인스턴트변수를 직접 사용할 수 있게하면 변수와 함수 둘 다 괄호없이 사용할 수 있으니까 함수와 변수가 구분이 안되서 접근을 못하게 막아놓은 건 줄 알았는데 아니었네요! 감사합니다!
  11. cgoing
    cgoing / 2020.09.28
  12. 허우룩
    2020.09.24
  13. Sungjin Yoo
    파이썬에서 만약 __value로 외부 접근을 막아 놓은 상태에서 getValue나 setValue 매소드로 접근이 가능한가요? 만들어서 해보긴 했는데 setValue는 되는데 getValue는 되지 않네요. 왜그럴까요.. 코드를 잘못짠건지.... 궁금합니다. 혹시 답변 달아주실 수 있으면 답변 부탁드려요 아무나ㅏ...
  14. acs0209
    어렵다 어려워 ㅠ
  15. 캄바캄바
    get 정해진거로쓰는거 set 밖에서 지정해서 변경가능
  16. 캄바캄바
    2020-08-20
  17. PlayerSEAN
    쿠키앤크림님 따라잡기
    2020/08/06 완료
  18. 쿠키앤크림
    pupu님 따라잡기
    2020/07/03 완료
    좀 어렵다
  19. 허클베리핀
    <북마크>6.7_속성 들을 차례
  20. 김광현
    6/4완료
  21. 라이찡뀨
    10/11
  22. 라이찡뀨
    set/get 메소드를 사용하는이유 4분21초까지 함(기록해놓는거임 나중에 하려고)
  23. 맥반장
    2020-03-21 완료!
  24. oxugi
    2020/03/31 완료
  25. liero1p
    Ruby에서 attr_reader 혹은 attr_writer 를 쓸때 :value를 띄어쓰기하면 에러가 나네요. 참고하세요 :)
  26. 도전차차차
    2019.10.29
  27. 가재준
    완료
  28. FIRE
    20190821 완료
  29. 허니비
    190807
  30. 김민수
    루비는 매개변수의 수정과 참조가 외부에서 제한되는 반면
    파이썬은 매개변수의 수정과 참조를 할때 메소드를 통하지 않아도 직접 접근이 가능하다
    이는 파이썬이 객체를 다루는 사용자가 이 객체를 올바르게 사용할 것이라는 믿음을 전제로 하기 때문인데 이런 접근을 제한하는 방법으로는 __를 붙여 제한이 가능하다
    루비와 같은 경우는 기본적으로 접근이 제한되지만 attr_ 을 사용해서 매개변수에 대한 접근이 가능해진다
  31. 김민수
    Set 메소드와 get 메소드를 사용하는 이유는 객체의 수정과 확인의 용이함 때문.
    파이썬의 경우는 set메소드와 get메소드 없이도 변수의 변경 또는 참조가 가능하지만 매개변수의 변화에 대한 보장을 할수 없다. 즉 누군가가 객체를 올바르게 사용할 것 이라는 믿음을 전제로 하기에 오류에 취약해진다는 것이다.
  32. 김민수
    객체 = 좋은부품이다
    캡슐화 하는것은 객체의 오동작을 방지하고 데이터의 오류(불필요한 변화) 를 방지한다
    함수 또는 객체역시 케이스의 역할을 한다고 볼 수있다.

    파이썬의 경우 객체를 사용할때 메소드 내의 인스턴스 변수를 메소드 밖에서도 접근 가능한 반면
    루비의 경우 메소드 내에서만 인스턴스 변수의 참조가 가능하다. 단, show 를 이용할 경우 메소드 외부에서도 참조가 가능함.
  33. 얼그레이
    인스턴스 변수에 대한 강의를 어제부터 오늘 계속 들었는데 이해가 안 돼서 한번 다시 복습했어요!
    그래도 두번째로 들어보니 조금은 알 것 같은 느낌이네요 ㅎㅎ
    감사합니다! 190605
  34. Hotak Choi
    190421 !! 점점 어려워지네요 ㅜㅜ
  35. wiseman
    0420 1800
  36. gogo
    190417 1851
    완료입니다. 감사합니다.
  37. 19.04.15 완료
    감사합니다
  38. 호두
    고맙습니다
  39. 호두
    고맙습니다
  40. 정돌
    좋아요! ^^*!
  41. 주니
    감사합니다.
  42. kmw8462
    감사합니다.
  43. yareuk
    2018-12-22
  44. 포인드
    3번째 강의에서 파이썬에서 setvalue 의 입력값 v 와 init 의 입력값 v가 같아야하나요? 코드결과상 setvalue 입력값이 v가 아니라 임의의 문자를 넣어도 똑같은데 v 라는 입력값이 같아야 하는게 아니라면 중복이니까 다른 문자로 바꿔줘야 되는게 아닌지 궁금합니다 ㅠ
  45. 루이보스라떼
    2018.12.03.
  46. 닐반
    2018. 10. 14.
  47. 양디비
    2018-08-19 수강완료!
  48. 유닉스가이
    감사합니다.
  49. 해릭
    180720 감사합니다.
  50. Ji Yeoun Park
    2018.07.01 감사합니다.
버전 관리
egoing
현재 버전
선택 버전
graphittie 자세히 보기