아이템에 대한 참조자가 있으면, 벡터 변경 불가
새로운 요소를 벡터의 끝에 추가하는 것은 새로 메모리를 할당하여 예전 요소를 새 공간에 복사하는 일을 필요로 할 수 있음
반복문과 가변 참조자를 사용한 벡터 내 아이템 변경
+= 연산자를 위해서는 역참조 연산자(*)를 사용해야 함
열거형을 사용하면 벡터 내에 다른 값을 담을 수 있음
러스트가 컴파일 타임에 벡터 내에 저장될 타입이 어떤 것인지 알아야할 필요가 있는 이유는 각 요소를 저장하기 위해 얼만큼의 힙 메모리가 필요한지 알기 위함
열거형과 match 표현식을 사용한다는 것은 러스트가 컴파일 타임에 모든 가능한 경우에 대해 처리한다는 것을 보장해준다는 의미
런타임에 벡터에 저장하게 될 타입의 모든 경우를 알지 못한다면, 트레잇 객체(trait object)를 이용할 수 있음
String
String 생성
String::new(), 리터럴.to_string(), String::from(리터럴)
String 변경
push_str / push - 인자로 참조자를 받음 (&str) / +연산자 / format
String 인덱싱
러스트 String은 인덱싱을 지원하지 않음 (=> 스트링 슬라이스 사용)
String의 바이트들 안의 인덱스는 유효한 유니코드 스칼라 값과 항상 대응되지는 않기 때문
[참고] 러스트 의 문자
러스트의 관점에서 문자열을 보는 세 가지의 의미있는 방식이 있음: 바이트, 스칼라 값, 문자소 클러스터
HashMap
K 타입의 키에 V 타입의 값을 매핑한 것을 저장
HashMap 생성
HashMap::new() + HashMap.insert()
튜플의 벡터에 대해 collect 메소드를 사용
HashMap 과 소유권
Copy 트레잇을 구현한 타입의 값은 HashMap 안으로 복사(clone)
그 외에 경우, HashMap 이 소유권을 가짐
HashMap 내 접근
get() - Option<&V>를 반환
HashMap 변경
10장
제네릭 (Generic)
러스트는 컴파일 타임에 제네릭을 사용하는 코드에 대해 단형성화(monomorphization) 를 수행함
단형성화란 제네릭 코드를 실제로 채워질 구체적인 타입으로 된 특정 코드로 바꾸는 과정
트레잇 (Trait)
impl [트레잇명] for [구조체명] {}
다른 언어들에서 '인터페이스(interface)'라고 부르는 기능과 유사하지만, 몇 가지 다른 점이 있음
트레잇의 정의는 어떠한 목적을 달성하기 위해 필요한 동작의 집합을 정의하기 위해 메소드 시그니처들을 함께 묶는 방법
트레잇 바운드
제네릭 타입이 특정한 트레잇을 구현하여 이 타입들이 가지고 있을 필요가 있는 동작을 갖고 있도록 제한함
라이프타임 (Lifetime)
러스트에서 모든 참조자는 라이프타임(lifetime) 을 가짐
해당 참조자가 유효한 스코프
Q&A
[8장] 다른 언어에서도 타입에 자유로운 벡터를 생성할 수 있는가? 실제로 이 방식이 잘 쓰일까?
범위 : 7장 ~ 12장 (12장 실습)