객체 지향 프로그래밍(OOP)에서 동일한 인터페이스를 통해 서로 다른 데이터 타입이나 클래스들이 동일하게 동작할 수 있도록 하는 개념.
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
data Color = Red | Green | Blue
instance Eq Color where
Red == Red = True
Green == Green = True
Blue == Blue = True
_ == _ = False
x /= y = not (x == y)
-- 위 코드에서는 Color라는 타입이 Eq 타입클래스의 인스턴스가 되어, 색깔을 비교할 수 있음.
length :: [a] -> Int
length [] = 0
length (_:xs) = 1 + length xs
{-
재귀적으로 길이를 측정하는 함수 / [Int], [Char], [Bool] 등 어떤 타입의 리스트든 사용 가능
length [1, 2, 3]는 1 + length [2, 3]를 반환함.
length [2, 3]는 1 + length [3]를 반환함.
length [3]는 1 + length []를 반환함.
length []는 0을 반환함.
-}
min
함수는 Ord
트레이트를 구현한 데이터 타입만 받는다고 제한을 걸어둔 것임 /// Given two values, pick whichever one is less.
fn min<T: Ord>(value1: T, value2: T) -> T { if value1 <= value2 {
value1
} else { value2
} }
<aside> 💡 동적 디스패치 vs 정적 디스패치 → 러스트는 기본적으로 정적 디스패치를 사용
정적 디스패치 (Static Dispatch):
동적 디스패치 (Dynamic Dispatch)
dyn
키워드를 사용한 trait object에서 주로 사용됨.** 인라인화: 컴파일러 최적화 기법 중 하나로, 함수 호출을 제거하고 함수의 코드를 호출 지점에 직접 삽입하는 것을 의미
오버헤드는 코드가 실행될 때 발생하는 추가 비용을 말한다. 특히, 가상 함수 호출(virtual method call)은 런타임에 실제로 호출할 메서드를 결정해야 하므로, 성능에 영향을 줄 수 있다.