삼각형이 _equilateral_인지, _isosceles_인지, _scalene_인지 판별해요.
equilateral 삼각형은 세 변의 길이가 모두 같아요.
isosceles 삼각형은 적어도 두 변의 길이가 같아요. (정확히 두 변의 길이가 같다고 정의하기도 하지만, 이 연습 문제에서는 적어도 두 변이라고 할게요.)
scalene 삼각형은 모든 변의 길이가 서로 달라요.
어떤 도형이 삼각형이 되려면 모든 변의 길이가 0보다 커야 하고, 임의의 두 변의 길이의 합이 나머지 한 변의 길이보다 크거나 같아야 해요.
_퇴화 삼각형_은 두 변의 길이의 합이 세 번째 변의 길이와 같은 삼각형이에요. 예를 들어 1, 1, 2가 그래요.
이 연습 문제에서는 퇴화 삼각형에 대한 테스트를 넣지 않기로 했어요.
이런 상황을 직접 처리하고 싶다면 처리해도 되고, 그냥 무시해도 괜찮아요.
식을 나타내면 다음과 같아요.
a, b, c를 삼각형의 변이라고 해요.
그러면 다음 세 식이 모두 참이어야 해요.
a + b ≥ c
b + c ≥ a
a + c ≥ b
삼각 부등식을 참고해요.
이것을 구현하는 방법은 다양할 수 있어요. 어떤 접근 방식을 택하느냐에 따라 도움이 될 만한 주제들을 아래에 정리했어요.
어쩌면 이런 것들을 전혀 쓰지 않는 방법을 떠올릴 수도 있어요!
기본 연습 문제에서는 세 변의 길이가 모두 정수인 삼각형을 판별하는지 테스트해요. 하지만 어떤 삼각형은 순수한 정수만으로는 나타낼 수 없어요. 간단한 예로, 길이가 1인 두 변 사이의 각이 90도인 삼각형을 들 수 있어요. 이 삼각형의 나머지 한 변의 길이는 2의 제곱근이고, 이는 무리수예요 (정수나 분수로 나타낼 수 없다는 뜻이에요).
정수와 부동소수점 경우를 모두 처리하도록 분석 함수를 다시 작성하는 것은 번거로운 일이에요. 게다가 가능한 모든 정수 및 부동소수점 타입을 처리하려면 훨씬 더 번거롭죠. 비트 폭 8, 16, 32, 64, 128의 부호 있는 타입과 부호 없는 타입을 생각하면, 부동소수점은 고려하기도 전에 근본적으로 같은 코드를 열 번이나 다시 구현해야 하는 셈이에요!
더 나은 방법이 있어요. 바로 제네릭이에요. Triangle을 Triangle<T>로 다시 작성하면 코드를 한 번만 작성하고, 그 모든 특수화를 만들어 내는 일은 컴파일러에 맡길 수 있어요. 수학 연산을 사용하려면 트레이트를 이용해 제네릭 타입을 그런 연산을 지원하는 타입으로 제한해야 한다는 점을 기억해 두세요.
부동소수점 수에 대한 구현을 테스트하는 보너스 테스트도 있어요. 이 테스트를 실행하려면 다음과 같이 generic 피처 플래그를 붙여서 테스트를 실행해요:
cargo test --features generic