개발_기록용

RUST 스터디[RUST vs C++] 10. User-Defined Types 본문

RUST 스터디

RUST 스터디[RUST vs C++] 10. User-Defined Types

나폴나폴 2024. 5. 13. 22:26
728x90

http://google.github.io/comprehensive-rust/user-defined-types/named-structs.html

 

Named Structs - Comprehensive Rust 🦀

Like C and C++, Rust has support for custom structs: struct Person { name: String, age: u8, } fn describe(person: &Person) { println!("{} is {} years old", person.name, person.age); } fn main() { let mut peter = Person { name: String::from("Peter"), age: 2

google.github.io


10.1 Named Structs (구조체)

C나 C++에서 하는 방식이랑 같음.

특징이 있다면, 구조체 안에 메서드 못 넣음. 넣는 방법은 따로 있음.

메서드가 아닌, 일반 함수를 하고자 한다면, 파라미터로 레퍼런스 형태를 받음.

 

구조체 인스턴스 만드는 방법

1) 피드명을 직접 넣어주는 것.

let mut peter = Person {name : String::from("Peter"),  age : 27};

 

2) 지역변수로 name, age 따로 만들고, name, age와 피드명, 변수명이 같으면 코드 생략 가능.

 

let name = String::from("Avery");

let age = 39;

let avery = Person(name, age);

describe(&avery);

 

3) 앞에서 만든 변수랑 똑같이 겹치는 부분이 있다면, 따로 정의할 부분만 적어주고, 뒤에 ..으로 적어주면 됨.

 

let jackie = Person {name : String::from("Jackie), ..avery};

describe(&jackie);

 


10.2 Tuple Structs

필드명 없이 쓰면 Tuple인데, Tuple과 다른 점은 얘네는 타입 이름이 있다. i32처럼.

struct Point(i32, i32);

 

접근은 튜플처럼 p.0, p.1로 접근하면 된다.

let p = Point(17, 32);

println!("({}, {})", p.0, p.1);

 

🎯 튜플은 어떨 때 쓰나요?

✔ 어떤 값을 정의해야 하는데, 단위를 정의해야 하는 경우 주로 쓴다.

struct PundsOfForce(f64);
struct Newtons(f64);


10.3 Enums(열거체)

Rust에서 Sensation한 부분.

 

열거체는 어떤 값들의 종류를 나타낼 때 많이 쓰임.

백준에서 방향을 나타내는 문제에서 쓸 때, dx, dy 쓰고 암튼 그런 형태로.

 

 

그런데 아래 형태는 새로운 혁명이다.

종류를 나타내는데, 안에 값을 넣을 수도 있고, 이 값을 튜플 형태, 구조체 형태로도 갈 수 있음.

아래에선, Run 안에 Direction::Left로 값을 넣어줌.

*{:?} 에서 ?는 Debug 출력을 위해 씀.

 

암튼 이렇게 enum안에 튜플, 구조체 등 값을 넣을 수 있는 열거체가 생기면서

Rust에서 여러가지 방식이 탄생하게 됨.


🎯 참고로, 이런 열거체의 크기는 메모리 측면에서 어떻게 잡힐까?

1) 가장 큰 형태를 미리 잡아서 할당
2) 컴파일 단계에서 쓰이는 크기를 측정하여 할당.

=> 2번은 어려우니 1번으로 한다.

#[derive(Debug)]
enum PlayerMove {
       Pass, // Simple variant
       Run(Direction), // Tuple variant Teleport
       { x: u32, y: u32 }, // Struct variant
}

=> 여기선, Teleport가 x, y 2개로 있으니 제일 큰 이 Telepory 기준으로 잡음.

 


10.4 static 정적변수

static은 프로젝트 전역에서 참조 가능. 한마디로 "영원히 산다."

프로그램 시작부터 끝까지 살아있다.

=> 그러니 이동도 안 하고 항상 그 자리에서 존재.

=> 그러니 전역변수 만들 때 많이 쓰임.

 

Rust에서 static 선언 시에는, 항상 타입을 명시적으로 지정해줘야 하고,

대문자로만 써야 하는 규칙이 있다.

 

보통은 별 이유 없으면 const 쓰는게 좋다. static은 값을 바꾸는 형태도 가능한데

그러면 Rust에서 이 static 쓰는 이유가 없다.

값을 바꿀 수도 있으므로, inline 보장이 안되어 사용 불가.

 

10.5 const

전역이고, 바꿀 수 없으므로 inline 가능. static과 비슷하지만, 얘는 값을 바꾸는 것을 허용하지 않고,

inline 가능하므로 최적화 측면에서는 좋음.

 

🎁 inline이라는 건, 최적화 과정에서 일어나는 것.

10.6 Type Aliases 별칭 붙이기

type Item 하고, 쭉 적어주면 됨. C++에서 using 쓰는 것과 비슷함.

 

반응형
Comments