블로그 이미지
초딩입맛제주아재
하고 싶은 것만 하며 살고 싶다

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
2006. 5. 15. 01:23 Programing/Smalltalk

Smalltalk 카페에 했던 질문과 달룟님께서 달아주신 답변이다.
내머리가 돌인건 인정하지만
너무 어렵고 이해가 안됐었는데
달룟님 답변을 보고 나니 금새 이해가 되는게...


>오늘 안드레아님이 올려주신 변수에 대한 강의를 들으면서
>연습했던 코드입니다.

apple := 400.
pear := 400.
price := 0 asValue.

>mb := MessageBox new.

price when: #valueChanged send: #notify: to: mb with: 'change!!'.
(apple = pear) ifTrue: [price value: (apple + pear)].

price trigger: #valueChanged.

>달룟님께서 올려주신 강좌중 '이벤트' 부분도 적용을 해봤습니다.

>그런데 다음과 같이 코드를 작성해도 될것 같아서 해봤는데 안되더군요...

>(변경전)

price when: #valueChanged send: #notify: to: mb with: 'change!!'.
(apple = pear) ifTrue: [price value: (apple + pear)].
price trigger: #valueChanged.

>(변경후)

price when: #valueChanged send: #notify: to: mb with: 'change!!'.
(apple = pear) ifTrue: [price := (apple + pear). price trigger: #valueChanged].

>메세지 박스는 안뜨지만
>price. 를 보면 800 이라고 나오네요...
>왜 중간에 메세지 박스는 안보이는건가요??
>그 이유가 궁굼합니다...^^

(달룟님 답변)
price := 0 asValue. 하고 Ctrl+D 해보면,  ValueHolder 객체임을 알 수 있습니다.

price value: (apple + pear).  는 price에 value:라는 메세지를 보냈을 뿐
price라는 변수가 ValueHolder를 가리키고 있는 것에는 변화가 없습니다.

하지만,  price := (apple + pear). 라고 하게 되면
price는 가리키던 ValueHolder 객체를 버리고 숫자의 덧셈의 결과인 정수 객체를 새로이 가리키게 됩니다.  청소부 아저씨가 ValueHolder 객체를 싹싹 쓸어가시겠죠, 
물결님이 애써 달아준 트리거 이벤트 장치도 함께 말입니다. 
따라서, (변경후)처럼 실행하면 price가 아무 반응도 안하는 것은 당연합니다. 
트리거 장치를 달아준 ValueHolder객체는 없어졌고, price가 새로 가리키는 정수 객체에는
다시 장치해주지 않았으니까요.  price trigger: #valueChanged라고 해주면,
"응, 뭔소리지 난 그런 얘기 들은적 없는데..."라고 멀뚱멀뚱 눈만 깜빡이겠죠.

물결님이 의도하신 것이 안드레아님의 강의 내용중에서 apple + pear = price가 항상 성립하도록 마치 엑셀의 수식셀값이 자동 갱신되는 것처럼 해주고 싶으셨던 거라면 아래와 같은 코드를 생각해보세요.

apple := ValueHolder new.
apple value: 400.
pear := ValueHolder new.
pear value: 400.
price := ValueHolder new.
updator := [ price value: apple value + pear value ].
apple when: #valueChanged send: #value to: updator.
pear when: #valueChanged send: #value to: updator.

이렇게 하시면 세팅완료입니다.

apple이나 pear의 값을 바꾸면, price는 자동적으로 재계산하게 됩니다.

apple value: 1000.  "오!! 사과값 폭등".
price value "얼마일까요?"

pear value: 100. "오!! 꿈이냐 생시냐!"
price value "얼마일까요?"

하지만, price에 직접 어떤 값을 넣는 것은 반칙입니다.  엑셀이라면 수식셀에 상수입력을 해버리는 것과 같겠죠?  이런 짓은 하면, 안되지만,  수동으로 갱신해주면됩니다.

price value: 1000000.  "오욱, 파산이냐?"
price value.
updator value.
price value "휴~ 놀랬자나."


결론:
변수는 값이 바뀐다...그 형태까지도...
이거 알고 있었잖아~ 안그래?
제발 긴장좀 허자~

'Programing > Smalltalk' 카테고리의 다른 글

가계부 만들기 - 04  (0) 2006.10.08
가계부 만들기 - 03  (0) 2006.10.08
가계부 만들기 - 02  (0) 2006.10.08
가계부 만들기 - 01  (0) 2006.10.08
변수와 메세지 그리고 이벤트...  (0) 2006.05.15
재밌다...  (0) 2006.05.07
posted by 초딩입맛제주아재

댓글을 달아 주세요