"가비지 컬렉터 없이도 안전하다."
철학: 프로그래머의 실수를 런타임이 아닌 컴파일 타임에 잡는다.
구현: 소유권(Ownership)과 빌림(Borrowing) 규칙.
의미:
C/C++처럼 빠르지만, C/C++에서 발생하는 메모리 버그(Null 포인터, 이중 해제, 메모리 누수)를 원천 차단합니다.
Java/Go/Python처럼 안전하지만, 가비지 컬렉터(GC)가 없어서 예측 가능한 성능을 냅니다.
Drop과 RAII 패턴이 바로 이 철학의 핵심 구현체입니다.
"네가 쓰지 않는 것에 대해서는 비용을 지불하지 않는다. 네가 쓰는 것은 손으로 짠 것보다 낫거나 같다."
철학: 코드를 인간 친화적(고수준)으로 짜더라도, 기계어(저수준) 번역 결과는 최적화되어야 한다.
구현: 제네릭(Generics), 트레이트(Trait), 이터레이터(Iterator).
의미:
for 루프 대신 iter().map().filter()를 써도 성능 저하가 없습니다.
mpl Fn vs fn 포인터도 이 철학에 해당합니다. impl Fn(제네릭)을 쓰면 컴파일러가 해당 타입에 맞춰 코드를 따로 생성(Monomorphization)하여 최적화합니다.
"데이터 레이스(Data Race)는 컴파일 에러다."
철학: 멀티스레딩 버그는 잡기 너무 힘드니, 아예 컴파일이 안 되게 막아버리자.
구현: Send와 Sync 트레이트.
의미:
어떤 데이터가 스레드 간에 공유되어도 안전한지 컴파일러가 검사합니다.
MutexGuard가 스코프를 벗어나면 자동으로 락을 푸는 것도, 실수로 락을 안 푸는 상황을 막기 위함입니다.
"마법(Magic)은 없다. 숨겨진 동작보다 명확한 코드가 낫다."
철학: 코드를 읽을 때 예상치 못한 동작이 발생하면 안 된다.
구현:
타입 변환: 암묵적 캐스팅을 금지하고 as나 From/Into를 강제함.
에러 처리: 예외(Exception) 대신 Result<T, E>를 리턴하여, 에러 처리를 강제함.
가변성: 기본은 불변(let), 바꿀 거면 명시적으로 mut 선언.
의미: 코드를 짜는 건 조금 귀찮아도, 읽고 유지보수할 때의 명확함을 최우선 가치로 둡니다.