SqueakByExample:8.2

From 흡혈양파의 번역工房
Revision as of 04:17, 30 August 2012 by Onionmixer (talk | contribs)
Jump to navigation Jump to search

숫자들(Numbers)

놀랍게도, 스몰토크에서의 숫자들은 프리미티브 데이터 값들이지만 진짜 오브젝트는 아닙니다. 물론 숫자들은 가상 머신에서 효과적으로 실행되었습니다. 그러나 숫자 계층도(the Number hierarchy)는 스몰토크 클래스 계층도의 모든 다른 부분들과 같이 완벽하게 접근가능하고 확장 가능합니다.

숫자들은 kernel-number 카테고리에서 발견됩니다. 이 계층도의 추상 루트는 매그니튜드(Magnitude)이며, 이것은 비교 연산자들을(comparision operatiors) 지원하는 모든 종류의 클래스들을 나타냅니다. 숫자들은 다양한 산술(arithmetic)을 추가하며 대부분의 추상 메소드들과 같은 다른 연산자들을 추가합니다.플로트(Float)와 분수(Fraction)는 각각 부동 소수점수 (floating point number)와 분수값(fractional value)을 나타냅니다. 정수 (Integer)또한 추상적입니다. 그러므로, 서브클래스 SmallInteger, LagePositiveInteger와 LargeNegativeInteger 사이에 구별되는 특색들이 있습니다. 대부분의 부분들에 있어서, 값들이 필요한 만큼 자동으로 변환되므로, 유저들은 3 개의 정수 클래스들 사이의 차이점들에 대해 신경을 써야 할 필요가 없습니다.


그럼 8.1: 숫자구조도(class구조)


메그니티튜드(Magnitude)

메그니티튜드는 숫자 클래스들 뿐만 아니라, 문자(Character), 지속시간(Duration), 그리고 지속기간(timespan)과 같은 대비 연산(comparison operations)를 지원하는 다른 클래스들의 부모입니다.

메그니티튜드(Magnititude)는 메소드 < 과 = 은 추상 메소드 입니다. 남아있는 연산자(operatiors)들은 총칭적으로(generically) 정의됩니다. 예를 들면:


메소드 8.12: 추상 비교 메소드( Abstract comparison methods)

Magnitude» < aMagnitude
  "Answer whether the receiver is less than the argument."
  self subclassResponsibility

Magnitude» > aMagnitude
  "Answer whether the receiver is greater than the argument."
  aMagnitude < self


숫자(Number)

비슷하게, 숫자(Number)는 추상적이 될 +, -, * 그리고 /를 정의하지만, 모든 다른 산술 연산자들(arithmetic operators)는 총칭적으로 정의됩니다.

모든 숫자 오브젝트들은 asFloat와 asInteger와 다양한 변환 연산자들을(converting operators) 지원합니다. 이 연산자들은 i와 같은 여러 개의 바로가기 메뉴 컨스트럭터(shortcut constructor methods)들이 있으며, 이러한 것들은 숫자(Number)를 제로 실제 구성요소(zero real component)와 함께 복합적인 인스턴스로 변환하고, 다른 것들은 hour, day 그리고 week과 같은 지속시간(duration)을 가동시킵니다.

숫자들은 직접 sin, log, raiseTo:, 제곱(squared), sqrt 등과 같은 일반 수학 기능(common math functions)을 직접 지원합니다.

Number»printOn:은 추상 메소드 Number»printOn:base:의 측면에서 실행됩니다. [디폴트 베이스(base)는 10]

Testing 메소드는 짝수(even), 홀수 (odd), 양수(positive) 그리고 음수(negative)를 포함합니다. 당연히, 숫자는 isNumber를 재지정(override)합니다. 좀더 흥미로운 것은 isInfinite가 false를 리턴하기 위해 정의되는 것입니다.

끊기 메소드(Truncation methods)는 floor, ceiling, intergerPart, fractionPart등을 포함합니다.

1 + 2.5 ⇒ 3.5 "Addition of two numbers"
3.4 * 5 ⇒ 17.0 "Multiplication of two numbers"
8/2 ⇒ 4 "Division of two numbers"
10 -- 8.3 ⇒ 1.7 "Subtraction of two numbers"
12 = 11 ⇒ false "Equality between two numbers"
12 ∼= 11 ⇒ true "Test if two numbers are different"
12 > 9 ⇒ true "Greater than"
12 >= 10 ⇒ true "Greater or equal than"
12 < 10 ⇒ false "Smaller than"
100@10 ⇒ 100@10 "Point creation"


다음 예시는 스몰토크에서 놀랍게 잘 작동합니다:

1000 factorial / 999 factorial        1000


1000 계승(factorial)이 실제로 많은 다른 언어들로 연산하기가 꽤 어려울 수 있는 위치에서 실제로 계산되었습니다. 이것은 숫자의 자동 강제와(automatic coercion) 정확한 핸들링의 훌륭한 예입니다.


Squeak comment.png1000 계승(factorial)의 결과 디스플레이를 시도해 보십시오. 이 작업은 계산하는 것 보다 디스플레이에 더 많은 시간이 걸립니다.


플로트(Float)3

플로트(Float)는 부동 소수점 수(floating point numbers)를 위한 추상 숫자 메소드(the abstract Number methods)를 실행합니다.

좀더 흥미로운 것은 플로트(Float) 클래스(예컨데 Float의 class-side)는 다음 항수: e, infinity, nan 그리고 pi를 리턴합니다.

Float pi ⇒ 3.141592653589793
Float infinity ⇒ Infinity
Float infinity isInfinite ⇒ true


분수(Fraction)

분수(Fractons)는 분자(numerator)와 분모(denominator)에 쓰이는 인스턴스 변수들에 의해 표시되며, 반드시 정수이어야 합니다. 분수(fractions)는 보통 정수 나눗셈(Integer division)에 의해 만들어 집니다. (constructor 메소드 Fraction» numerator:denominator:을 사용하기 보다는...)

6/8 ⇒ (3/4)
(6/8) class ⇒ Fraction


정수 또는 다른 분수로 분수(Fraction)을 곱하기 하면, 답이 정수가 될 수 있습니다.

6/8 * 4 ⇒ 3


정수(Integer)

Integer(정수) 는 3 개의 실체적인 정수 실행(concrete integer implementations)의 추상 부모(the abstract parent)입니다. 정수는 많은 추상 숫자 메소드(abstract Number methods)의 실체적 실행을 제공할 뿐만 아니라, factorial(계승), atRandom, isPrime, gcd와 많은 다른 것들과 같이 정수에 약간의 메소드 들을 추가합니다.

SmallInteger는 그 자체의 인스턴스들이 압축되어 표시된다는 면에서 특별합니다-SmallInteger는 참조로서 저장되는 대신에, 참조(reference)를 붙잡기 위해 사용될 수 있을 조각들을(bits) 사용하여 직접 표시됩니다.오브젝트 참조(object reference)의 첫 번째 작은 부분은 오브젝트가 SmallInteger인지 아닌지를 가리킵니다.

클래스 메소드 minVal과 maxVal은 SmallInteger의 범위를 말해드립니다.

SmallInteger maxVal = ((2 raisedTo: 30) -- 1) ⇒ true
SmallInteger minVal = (2 raisedTo: 30) negated ⇒ true


SmallInteger가 이 범위를 벗어나면, LargePositiveInteger로 자동으로 변환되거나 또한 필요한 만큼 LargeNegetiveInteger로 자동으로 변환됩니다:

(SmallInteger maxVal + 1) class ⇒ LargePositiveInteger
(SmallInteger minVal -- 1) class ⇒ LargeNegativeInteger


적합할 때, 큰 정수들은 유사하게 작은 정수들로 다시 변환될 수 있습니다.

대부분의 프로그래밍 언어에서 처럼, 정수들은 상호작용 동작(interactive behaviour)을 지정하는 작업에 유용할 수 있습니다. 블록을 반복적으로 평가하는 작업에 사용되는 전용 메소드 timesRepeat이 있습니다. 우리는 3장에서 비슷한 예시를 이미 보았습니다.

n := 2.
3 timesRepeat: [ n := n*n ].
n    256


Notes