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. 도전차차차
    2019.10.29
  2. 가재준
    완료
  3. 20190821 완료
  4. 허니비
    190807
  5. 김민수
    루비는 매개변수의 수정과 참조가 외부에서 제한되는 반면
    파이썬은 매개변수의 수정과 참조를 할때 메소드를 통하지 않아도 직접 접근이 가능하다
    이는 파이썬이 객체를 다루는 사용자가 이 객체를 올바르게 사용할 것이라는 믿음을 전제로 하기 때문인데 이런 접근을 제한하는 방법으로는 __를 붙여 제한이 가능하다
    루비와 같은 경우는 기본적으로 접근이 제한되지만 attr_ 을 사용해서 매개변수에 대한 접근이 가능해진다
  6. 김민수
    Set 메소드와 get 메소드를 사용하는 이유는 객체의 수정과 확인의 용이함 때문.
    파이썬의 경우는 set메소드와 get메소드 없이도 변수의 변경 또는 참조가 가능하지만 매개변수의 변화에 대한 보장을 할수 없다. 즉 누군가가 객체를 올바르게 사용할 것 이라는 믿음을 전제로 하기에 오류에 취약해진다는 것이다.
  7. 김민수
    객체 = 좋은부품이다
    캡슐화 하는것은 객체의 오동작을 방지하고 데이터의 오류(불필요한 변화) 를 방지한다
    함수 또는 객체역시 케이스의 역할을 한다고 볼 수있다.

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

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

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

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

        instance바깥쪽에서 접근할 수 없는 변수가 된다 가 맞는 말입니다. (또한 객체지향 프로그래밍 강좌 초반 부분에서 인스턴스와 객체는 같은(정확히 같진 않겠지만) 것이라고 말씀하셨습니다.)
        대화보기
        • Heonjin Ha
          마지막 영상 13:00초에서 'instance 바깥쪽에서는 접근할 수 없는 변수가 됩니다.'가 잘못된 말 아닌가요?
          'method 바깥쪽에서 접근할 수 없는 변수가 됩니다.'가 맞지 않나요?
          15:23초에도 instance바깥이라고 언급하셨네요.
          instance라고 해야 맞는지 method라고 해야 맞는지..
        • 다람쥐
          감사합니다.
        • ddogagi
          Class내를 내부, 밖을 외부로 나누신 것 같아요
          Class외부에서 Class 내부의 변수에 접근하려고 하는거니까 외부에서의 접근:)
          대화보기
          • Gwanghyeon Harry Gim
            너무나 어렵지만 같은 메소드라도 인스턴스에 따라 값이 바뀌는 인스턴스의 특성이 정말로 매력적입니다. 내용이 어렵다가도 왜 이런 복잡도가 생겼는지 이해하는 순간 머릿속을 괴롭히는 복잡도를 더 잘 이해하고 싶은 욕구가 드나 봅니다.
          • Jongmin Han
            속성
          • 성현아빠
            완료
          • 뚜답답
            외부에서의 접근이라고 하시는데 외부와 내부를 나누는 기준이 무엇인가요???
          • GoldPenguin
            완료했습니다.
          • 강의를 계속 들으면서 더욱더 루비와 파이썬 강의를 분리하는게 좋겠다는 생각이 점점 더 강해지네요 ㅠㅠ
          • 김태윤
            get, set 부터 뭔 말인지 이해를 못하고 있네요..--;
          • 김현우
            조유빈님 늦긴했지만 혹시 다시 보실까 싶어 남깁니다

            c1.__value = 20 하신건 새로운 변수에 20 값을 입력하신거지

            c1의 클래스에 대한 값이 변한건 아닙니다.

            초기 지정한 c1.__value는
            애초에 수정도 다시 불러오는 것도 불가능한 값입니다.

            불러오려면 애초에 클래스에서 show()라는 함수를 통해 보여주는 수밖에 없죠

            다시말해, 떠나 버린 변수인겁니다. 미국갔어요. 연락하려면 함수라는 전화를 쓰거나 화상통화라는 매개체를 써야 그 변수를 다시 맞이 할 수 있을겁니다.
            대화보기
            • 명진
              끊는 게 미드급이시네요!
            • J.Y.Oh
              어려운 내용을 최대한 쉽게 설명해주셔서 이해가 잘 되었습니다. 감사합니다.
            • 미림_likelion
              수강 완료했습니다. 감사합니다.
            • 조유빈
              python에서 self.__value를 이용하여 인스턴스 변수로의 접근을 막는 것은 이해했는데요,

              c1.__value = 20
              즉 쓰기를 한 후에
              print(c1.__value)
              를 실행시키면 20으로 덮어쓰기가 되는 것으로 보입니다...

              제가 혹시 틀렸다면 답글 부탁드려요.
            • 첨지
              어렵습니다..ㅠㅠ

              웹에플리케이션 만들기에서는 몇번이고 다시보면 이해가 되었는데

              언어는 그게 잘 안되니 답답하네요..
              무엇보다 이번에 언어를 배우고 이해한 다음은 어떻게 해야하나에 대한 막연함과 함께 공부하니 더 답답합니다ㅎㅎ

              여하튼 또 다시 도전해보렵니다!
            • 심화평
              17.07.04 어렵네요.. 주력 언어가 아니신데 이렇게 설명해주신다는게 신기할 나름입니다..
            • 모지?!
              위의 속성강의 코드에서 궁금한게 있는데요

              속성강의에 있는 코드 그대로 인용하자면,

              class C(object):
              def __init__(self,v):
              self.__value = v

              def show(self):
              print(self.__value)

              c1 = C(10)

              c1.value = 20
              print(c1.value)

              하면 20이라고 프린트 되는데요

              위의 클래스에선 아무런 정의가 없는데
              동적으로 멤버변수를 만들었다가 프린트하고 동적으로 멤버변수는 지워지는 건가요?
            버전 관리
            egoing
            현재 버전
            선택 버전
            graphittie 자세히 보기