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. Jongmin Han
    속성
  2. 성현아빠
    완료
  3. 뚜답답
    외부에서의 접근이라고 하시는데 외부와 내부를 나누는 기준이 무엇인가요???
  4. GoldPenguin
    완료했습니다.
  5. 강의를 계속 들으면서 더욱더 루비와 파이썬 강의를 분리하는게 좋겠다는 생각이 점점 더 강해지네요 ㅠㅠ
  6. 김태윤
    get, set 부터 뭔 말인지 이해를 못하고 있네요..--;
  7. 김현우
    조유빈님 늦긴했지만 혹시 다시 보실까 싶어 남깁니다

    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이라고 프린트 되는데요

      위의 클래스에선 아무런 정의가 없는데
      동적으로 멤버변수를 만들었다가 프린트하고 동적으로 멤버변수는 지워지는 건가요?
    • 나만의 부
      2017.04.21 감사합니다~
    • from San Mateo
      영상 만드시느라 수고 많이 하셨습니다. 설명 잘 듣고 갑니다. :)
    • seeong2
      omg.......
    • Philip Oh
      역시나 점점 어려워지네요~
      그치만 쉽게 설명해주셔서 감사합니다!!
    • 채문권
      인스턴스 변수를 지을때 __를 변수명 앞에 붙여 막는다고 나오네요?
      대화보기
      • 환글
        고맙습니다^^
      • onaccess1@gmail.com
        # 수정했는데.. 비밀번호가 틀려 다시 쓰네요...ㅜㅜ
        우선 set()를 쓰는 경우는 변수값을 다시 정할때 원치 않은 값의 입력을 막기 위해서죠.. 그래서
        set()를 써야 하는 상황이라면 거의 대부분 class variable이 self.__value 라는 형식으로 막혀있을겁니다.
        왜냐하면 기껏 set()를 써서 막아놨는데.. 직접 c1.v1 = 'one'으로 변경시키면 set()를 만든 의미가 없으니까요..
        그런데 '__'를 붙이면 클래스 밖에서는 읽어들이지 못하니 set()만을 사용하여 값을 걸러주면서 값을 정할수 있지요. 그러니 이때 우리는 get()를 써서 변수를 불러 와야 하는겁니다. 즉 파이썬에서 set()을 사용 하는 경우에는 get()는 당연하게 필요하게 되는거라 봅니다.
        대화보기
        • 김연규
          set은 이해가 가는데, get은 이해가 가지 않네요.
          어차피 get으로 하는것이나 c1.v1로 하는건 읽는 행동이기에 크게 문제가 될것도 없는거같고,, 영상에서도 제가 못들은것인지는 모르겠으나 질문드립니다.
          루비라면 읽기도 금지되니깐 이해가 갑니다만 파이썬은 정말 모르겠네요ㅕ...
          단순히 코드읽을때 편의성을 위해서라면 할말은 없지만요.
        • JustStudy
          고맙습니다
        • 김커피
          파이썬의 경우 get, set 메소드를 통하지 않고, 직접 인스턴스 변수에 접근하는 것을 막을 수 있는 방법은 없나요?
          질문하려고 쓰고 있는 도중에 강의에서 딱 그 내용이 나오네요. 막을 수 없다고 ㅜㅜ 정녕 막을 방법은 없는건가요??
          파일이 커지거나 여러 사람과 협업하는 경우라면, 그런 직접적인 접근을 원천 차단할 수 있다면 좋을텐데 말이죠...
          (수정이 안되서 새로 달았어요 ㅜㅜㅋ)
          ///
          아이고 5강에 바로 나오네요 ㅋㅋ 너무 성급하게 질문올렸군요 ㅎㅎ
          이고잉님 항상 강의 감사합니다!!
          대화보기
          • 김커피
            파이썬의 경우 get, set 메소드를 통하지 않고, 직접 인스턴스 변수에 접근하는 것을 막을 수 있는 방법은 없나요?
            질문하려고 쓰고 있는 도중에 강의에서 딱 그 내용이 나오네요. 막을 수 없다고 ㅜㅜ 정녕 막을 방법은 없는건가요??
          • 해앵인
            파이썬은 읽기,쓰기 허용범위 구분이 불가능한가요?
          • That Perfect
            다 좋은데...
            유튜브 버퍼링이 너무 심한데
            다음 tvpot 에도 같이 올려주시면 좋을거 같아요 ㅠ

            유튜브도 와 tvpot 같이 올려주시고
            오픈튜토리얼에는 tvpot 으로 동영상을..

            너무 버퍼링이 너무 심해요. ㅠ
          • user0123
            아니 이렇게 완벽한 강의를 다봣나;;
            돈주고 산 강의보다 더 좋으면 어떻게요 ㅠㅠ
            진짜 최고옵니다. 짱!
          • 이웃집토토로
            으.. 다시...
          • Hyeong
            python은 원래부터 c1.v1처럼 사용가능 한 것 아니었나요??
            대화보기
            • 박현재
              ㅎ ㅏ.... 슬슬 너무 어려워지긴하네요 ㅠ_ㅠ 설명을 참 잘해주시려고 노력하는데

              듣는이인 저는 머리가 나빠서그런지 객체쪽 시작되면서부터 집중력이 흐트러지는 부분도 있네요 ㅠㅠ

              저는 파이썬을 주로 공부하기 위해 수업을 듣고 있는데요, 루비랑 와따가따 하다보니.. 지금 이런 난이도에서는

              루비꺼랑 같이 설명을듣다보니 더욱 복잡해지는 부분이 있네요 ㅠ_ㅠ

              그래도 많이 도움 받고 있습니다~!!! 감사합니다!!
            • JunHo Kim
              python 2.6 부터
              getter 는 @property
              setter 는 @value.setter
              를 사용 합니다. 이걸 사용 하면 c1.getV1 이 아니고 c1.v1 처럼 사용 가능 합니다. c1.v1 = 'one' 무시 하는거도 @v1.setter 에서 로직을 넣어서 걸러 낼 수 있습니다.

              추가로 deleter 도 있습니다.

              자세한 건 문서 참고
              https://docs.python.org......tml
              https://docs.python.org......tml
            • protorenaissance
              propery >> property
            • Frank
              고맙습니다. ^^
            버전 관리
            egoing
            현재 버전
            선택 버전
            graphittie 자세히 보기