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

### 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. 라이찡뀨
10/11
2. 라이찡뀨
set/get 메소드를 사용하는이유 4분21초까지 함(기록해놓는거임 나중에 하려고)
3. 맥반장
2020-03-21 완료!
4. 2020/03/31 완료
5. liero1p
Ruby에서 attr_reader 혹은 attr_writer 를 쓸때 :value를 띄어쓰기하면 에러가 나네요. 참고하세요 :)
6. 도전차차차
2019.10.29
7. 가재준
완료
8. 20190821 완료
9. 허니비
190807
10. 김민수
루비는 매개변수의 수정과 참조가 외부에서 제한되는 반면
파이썬은 매개변수의 수정과 참조를 할때 메소드를 통하지 않아도 직접 접근이 가능하다
이는 파이썬이 객체를 다루는 사용자가 이 객체를 올바르게 사용할 것이라는 믿음을 전제로 하기 때문인데 이런 접근을 제한하는 방법으로는 __를 붙여 제한이 가능하다
루비와 같은 경우는 기본적으로 접근이 제한되지만 attr_ 을 사용해서 매개변수에 대한 접근이 가능해진다
11. 김민수
Set 메소드와 get 메소드를 사용하는 이유는 객체의 수정과 확인의 용이함 때문.
파이썬의 경우는 set메소드와 get메소드 없이도 변수의 변경 또는 참조가 가능하지만 매개변수의 변화에 대한 보장을 할수 없다. 즉 누군가가 객체를 올바르게 사용할 것 이라는 믿음을 전제로 하기에 오류에 취약해진다는 것이다.
12. 김민수
객체 = 좋은부품이다
캡슐화 하는것은 객체의 오동작을 방지하고 데이터의 오류(불필요한 변화) 를 방지한다
함수 또는 객체역시 케이스의 역할을 한다고 볼 수있다.

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

self.__value = 로 지정해줌
32. 정병찬
2018년 06월 26일
수강완료
33. Jaeduk Jang
완료했습니다. 감사합니다.
34. 박홍욱
180404 set, get 메소드까지
35. 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
어려운 내용을 최대한 쉽게 설명해주셔서 이해가 잘 되었습니다. 감사합니다.
버전 관리
 2015-08-22 01:51:05 egoing
현재 버전 2015-08-22 01:51:05
graphittie 자세히 보기
• 토픽 0
• 모듈 0
• 코스 0
• 봤어요 0
• 댓글 0
• 명예의 전당 0