일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 재배치
- 다익스트라
- 심벌 해석
- Rust
- 대상파일
- eigenvalue
- rust 스터디
- CS정리
- 스레드전용리소스
- 코드포스
- 다이나믹 프로그래밍
- 스레드전용저장소
- 동적링크
- 컴파일러
- column space
- 링커
- 적재도구loader
- 컴퓨터밑바닥의비밀
- linear algebra
- 백준
- vector
- 정적링크
- 알고리즘
- 벡터
- matrix
- 행렬
- unity
- 구문트리
- c++
- 선형대수학
- Today
- Total
개발_기록용
RUST 스터디[RUST vs C++] 10. User-Defined Types 본문
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 쓰는 것과 비슷함.
'RUST 스터디' 카테고리의 다른 글
RUST 스터디[RUST vs C++] 13. Methods and Traits (1) | 2024.05.15 |
---|---|
RUST 스터디[RUST vs C++] 12. Pattern Matching (0) | 2024.05.13 |
[RUST vs C++] 17. Standard Library Traits (0) | 2024.05.13 |
[RUST vs C++] 16. 표준 라이브러리 (2) | 2024.05.12 |
[RUST vs C++] 15. Generic과 Template (0) | 2024.05.12 |