자료형 - 벡터

Kurt·2023년 9월 14일
0

[Rust Language]

목록 보기
11/24

개요

자료형의 종류와 사용법 파헤쳐보기 - 벡터


종류

자료형이라 함은 어떤 종류가 있는지 확인해보기

  1. 벡터
  2. 배열
  3. 튜플
  4. 해시맵
  5. 문자열

벡터

벡터라고 하니 어렸을 적 보았던 벡터맨이 생각이 난다..
아무튼 벡터는 Rust에서 가장 널리 사용되는 자료형 중 하나이며, 여러 개의 값을 하나로 묶어서 사용한다.

왜 벡터를 사용하는가? 왜 해야하는가??

사실 벡터를 공부하면서 얘를 굳이 사용해야 하는 이유가 뭘까를 먼저 확인해봤는데.. 나는 아직까지는 좋다고 하니 사용하는 느낌이다.

사용해야 하는 이유!

  1. 동적 크기: 벡터는 가변 크기의 배열이므로 요소를 추가/제거가 가능하다.
  2. 메모리 관리: 벡터는 Rust의 소유권 시스템과 잘 통합되어 메모리 안전성을 보장한다고 한다. 즉 벡터가 범위를 벗어나면 데이터도 함께 소멸한다.

이외에도 다양한 이유가 존재하지만 이 두가지가 가장 큰 핵심이라고 한다.

벡터 선언

벡터 선언하는 방법 두가지
1. Vec 구조체의 from 메소드 사용하여 배열로부터 벡터 만들기
2. vec! 매크로를 사용하여 벡터 만들기

예시

fn main() {
	let vec1 = Vec::from([1, 2, 3]);
    let vec2 = vec![1,2,3];
}

위에서 보면 벡터를 선언할 때 타입을 지정하지 않는데 그 이유는 컴파일러가 원소의 값을 보고 추론하여 타입을 지정한다고 한다.

이러한 편리함 속 주의할 점은 반대로 원소가 존재하지 않을 경우 타입을 자동으로 지정해줄 수 없기 때문에 꼭 타입을 지정해주어야 한다는 것이다.

fn main() {
	let vec3: Vec<i32> = Vec::new();
    let vec4: Vec<i32> = vec![];

벡터 원소 접근

벡터의 원소는 인덱스를 사용해서 접근할 수 있다고 한다.

시나리오: 벡터에 1, 2, 3 데이터를 추가하고 2라는 데이터에 접근해보겠다.

fn main() {
	let vec1: Vec<i32> = vec![1, 2, 3];
    let num = vec1[1];
    println!("{}", num);
}

결과: 2

위에서 사용하는 이유에 벡터도 범위를 벗어나면 소멸한다고 한 내용에 대해서 테스트!

fn main() {
    {
        let vec1: Vec<i32> = vec![1, 2, 3];
        let num = vec1[1];
        println!("{}", num);
    }
    let num = vec1[1];
    println!("{}", num);
}

결과:

     let num = vec1[1];
               ^^^^ not found in this scope

벡터에 값 추가

아까 만든 벡터에 값을 추가로 입력해보자.
사실 여기서 호기심이 생겨서 1, 2, 3이 들어가있는 벡터에 문자열 데이터를 넣으면 어떻게 될까 했는데..
벡터에는 같은 데이터 유형만을 저장할 수 있다고 한다.

다른 타입을 저장하고 싶다면 벡터가 아닌 열거형을 사용할 것!

시나리오:
1. 4, 5, 6 추가
2. 확인

fn main() {
	let vec1: Vec<i32> = vec![1, 2, 3];
    
    vec1.push(4);
    vec1.push(5);
    vec1.push(6);
    
    println!("{:?}", vec1);
}

위처럼 작업하면 Rust의 불변 변수 특성으로 인한 에러가 발생할 것이다 그렇기 때문에 아래와 같이 변경을 해서 실행한다.

fn main() {
	let mut vec1: Vec<i32> = vec![1, 2, 3];
    
    vec1.push(4);
    vec1.push(5);
    vec1.push(6);
    
    println!("{:?}", vec1);
}

결과: [1, 2, 3, 4, 5, 6]

벡터에 값 삭제

시나리오:
1. 마지막 원소 3가지 삭제
2. 맨 앞 원소 삭제

삭제 방법 1. 맨 마지막을 삭제하면 되는 경우

pop 메소드를 사용하여 제거할 예정인데 다른 언어와 다르게 pop 메소드를 사용 시 인덱스를 넣지 못하고 무조건 마지막 원소가 제거된다.

fn main() {
    let mut vec1: Vec<i32> = vec![1, 2, 3];
    let num1 = vec1.pop().unwrap();
    println!("{}", num1);
    println!("{:?}", vec1);
}

결과:

3
[1, 2]

마찬가지로 mut를 선언해주어야 수정이 가능하다~

삭제 방법 2. 인덱스 값으로 제거하는 경우

마지막 원소가 아닌 다른 원소를 제거하려면 remove 메소드에 인덱스를 넣어서 제거한다.

fn main() {
    let mut vec1: Vec<i32> = vec![1, 2, 3];
    let num2 = vec1.remove(0);
    println!("{}", num2);
    println!("{:?}", vec1);
}

결과:

1
[2, 3]

현재 시리즈는 다음 링크를 공부한 내용을 기록하고 있습니다.
> 파이썬 프로그래머를 위한 러스트 입문 - 6.1 자료형 <


profile
내 인생이라는 프로젝트의 최고 버전을 만들기 위해

0개의 댓글