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```

### 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`

## 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
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.subtract())
c1.setV1('one')
c1.v2 = 30
print(c1.subtract())
```
```20
0
40
-20```

ideone.com

### Ruby

```class Cal
attr_writer :v1
def initialize(v1,v2)
@v1 = v1
@v2 = v2
end
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.subtract()
c1.setV1('one')
c1.v1 = 20
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_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

## 참고

### 댓글

댓글 본문
작성자
비밀번호
1. 닐반
2018. 10. 14.
2. 양디비
2018-08-19 수강완료!
3. 유닉스가이
감사합니다.
4. 해릭
180720 감사합니다.
5. Ji Yeoun Park
2018.07.01 감사합니다.
6. 유융
파이썬 - 외부에서 접근 불가능 하게 하기 위해선 메소드 내에서

self.__value = 로 지정해줌
7. 정병찬
2018년 06월 26일
수강완료
8. Jaeduk Jang
완료했습니다. 감사합니다.
9. 박홍욱
180404 set, get 메소드까지
10. 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이라고 프린트 되는데요

위의 클래스에선 아무런 정의가 없는데
동적으로 멤버변수를 만들었다가 프린트하고 동적으로 멤버변수는 지워지는 건가요?
• 나만의 부
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
고맙습니다. ^^
버전 관리
 2015-08-22 01:51:05 egoing
현재 버전 2015-08-22 01:51:05
graphittie 자세히 보기
• 토픽 0
• 모듈 0
• 코스 0
• 봤어요 0
• 댓글 0
• 명예의 전당 0