as
데이터를 늘리거나 잘라서 변환
대상
- 숫자 간 변환
- 원시 타입 -> 정수
- 데이터 필드가 없는 C 스타일 열거형 -> 정수
- 포인터와 레퍼런스 간
- 포인터 -> 정수
Into/From
트레이트 구현을 통해 고수준의 형변환을 수행한다
대상: Into나 From 구현을 한 모든 타입(From만 구현하면 Into는 자동으로 구현됨)
용도
- From: 생성자. 내가 아는 타입으로 부터 내가 만든 타입으로 변환할 때.
- Into: 함수 인자 타입. 내가 모르는 타입이라도 내 타입으로 변환할 수 있으면 됨
예를들어 fn asdf(num: impl Into<f64>) 라고 하면 f64가 될수있는 모든타입을 인자로 받을 수 있는 유연성을 갖는다.
강제 변환
개발자가 코드를 작성하지 않아도 컴파일러가 문맥상 안전하다고 판단하면 몰래 타입을 바꿔주는 경우이다.
- 가변성 제거: 가변 참조 -> 불변 참조(&mut T -> &T, *mut T -> *const T)
- unsize화: 배열 -> 슬라이스(&[T;N] -> &[T]), 구조체 -> 슬라이스 객체(&MyStruct -> &dyn MyTrait)
- 원시 포인터화: 참조 -> 원시 포인터(&T -> *const T, &mut T -> *mut T)
- 네버타입 변환: 네버타입(!)을 Any타입으로 해석, 예를 들어 match문의 모든 갈래는 같은타 입을 반환해야 하는데 한 갈래에서 네버타입을 반환하면 이 네버타입을 다른 갈래들의 타입으로 간주함
- Deref 트레이트: 스마트 포인터를 직접적인 참조로 변환(&String -> &str, &Vec<T> -> &[T], &Box<T> -> &T)
- 메서드 호출 연산자(.): 메서드를 호출할 때 참조를 붙이거나 Deref로 참조를 벗겨가며 타입을 일치시킴