Pytyon & Ruby & Atom

객체와 변수

인캡슐레이션(캡슐화)

 인스턴스 변수의 특성

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

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

    self.__value = 로 지정해줌
  42. 정병찬
    2018년 06월 26일
    수강완료
  43. Jaeduk Jang
    완료했습니다. 감사합니다.
  44. 박홍욱
    180404 set, get 메소드까지
  45. Heonjin Ha
    무슨말인지 완벽하게 이해하였습니다.
    댓글 정말 감사드립니다.
    대화보기
    • 코딩잘하고싶어요 ㅎ
      저 같은 경우에는 둘 다 모두 공부하겠다는 생각으로 억지로 강의를 다 곱씹었더니 부작용이 굉장히 컸습니다.

      그래서 요즘은.... 아 요즘도 둘 다 듣고 있군요 ㅋㅋ!
      대화보기
      • 코딩잘하고싶어요 ㅎ
        해당 변수가 속해있는 객체 외부에서는 접근할 수 없는 변수가 된다는 느낌으로 받아들이시면 될 것 같습니다.

        메소드 바깥쪽에서 접근할 수 없는 변수가 된다는 말은, 해당 변수가 속해 있는 객체 내의 다른 모든 메소드에서 조차도 변수에 접근할 수가 없다는 얘기가 됩니다.

        instance바깥쪽에서 접근할 수 없는 변수가 된다 가 맞는 말입니다. (또한 객체지향 프로그래밍 강좌 초반 부분에서 인스턴스와 객체는 같은(정확히 같진 않겠지만) 것이라고 말씀하셨습니다.)
        대화보기
        • Heonjin Ha
          마지막 영상 13:00초에서 'instance 바깥쪽에서는 접근할 수 없는 변수가 됩니다.'가 잘못된 말 아닌가요?
          'method 바깥쪽에서 접근할 수 없는 변수가 됩니다.'가 맞지 않나요?
          15:23초에도 instance바깥이라고 언급하셨네요.
          instance라고 해야 맞는지 method라고 해야 맞는지..
        • 다람쥐
          감사합니다.
        • ddogagi
          Class내를 내부, 밖을 외부로 나누신 것 같아요
          Class외부에서 Class 내부의 변수에 접근하려고 하는거니까 외부에서의 접근:)
          대화보기
          버전 관리
          egoing
          현재 버전
          선택 버전
          graphittie 자세히 보기