일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 스터디
- CS정리
- column space
- 벡터
- 구문트리
- 코드포스
- 백준
- 스레드전용리소스
- Rust
- 정적링크
- 알고리즘
- 다익스트라
- matrix
- 선형대수학
- 다이나믹 프로그래밍
- c++
- 행렬
- 동적링크
- 재배치
- 컴파일러
- linear algebra
- eigenvalue
- 컴퓨터밑바닥의비밀
- 대상파일
- 적재도구loader
- unity
- 링커
- 심벌 해석
- 스레드전용저장소
- vector
- Today
- Total
개발_기록용
RUST 스터디[RUST vs C++] 13. Methods and Traits 본문
https://google.github.io/comprehensive-rust/methods-and-traits.html
Methods and Traits - Comprehensive Rust 🦀
This segment should take about 50 minutes. It contains: SlideDuration Methods10 minutes Traits15 minutes Deriving3 minutes Exercise: Generic Logger20 minutes
google.github.io
13.1 Methods
구조체 안에 메서드를 구현하려면, "impl"로 선언. Rust는 길게 쓰는거 싫어함.
위의 Race를 보면, 네 개의 함수가 있는데, 받는 타입이 다 다름. (위에서부터 첫번째, 두번째, 세번째, 네번째 함수라 하자.)
1) 첫번째를 보면, Self는 파이썬의 self와 같다. 자기 인스턴스의 멤버 필드를 쓸 때 사용.
특정 인스턴스에 의존하지 않는 mutable한 static한 함수가 보통 여기서 쓰임. new가 보통 이런 식.
2) 두번째는 &로 레퍼런스니까 값을 빌리는 건데, mut를 써서 변경 가능하게 빌리는 것.
3) 세번째는 빌릴 수 없게 빌림. 출력하니까 값을 바꿀 일이 없어서.
4) 네번째는 왜 self만 있을까?
Rust의 3개의 산 봉우리. 그 중 첫 봉우리 Memory를 여기서 살짝 설명해보겠다.
fn add(a:String){
print!("{a}");
}
fn main(){
let S = String::from("Hello");
add(S);
}
이런식으로 함수가 있다 하자. 문제될 것 없죠?
그럼 함수에서 값을 복사해서 넘기면, 우리는 값을 복사해서 넘긴다. 이 방식을 pass by value라고 함.
근데 어떤 언어에선 복사 대신, 레퍼런스로 넘기는 형태의 언어들이 있다. 이를 pass by reference라고 함.
Rust는 기본이 "move"임.
우리가 add(S);로 함수를 쓰면, 그 밑에서 S는 사용 불가하고, 그 함수 안으로 S가 이동함.
*C++에서 move semantics와 같은 것임. C++ 11에서 나옴.
rvalue reference를 먼저 이해하자.
암튼 네번째에선 self만 있으니, main함수에서 인스턴스가 있었을 거고,
이 함수로 넘어와서 main에선 쓸 수 없음.
=> 그러니, 이렇게 레퍼런스가 없는 함수는, 보통 마지막으로 쓸 때 사용.
소멸되기 직전 finalize 하는 부분이라고 생각하면 됨.
*Rust에선 메모리 할당 해제를 Drop한다고 한다.
13.2 Traits
Rust는 구조체 상속이 없다. 근데, 필요할 때가 있음.
그래서 나온게 Trait. 다른 언어에서 interface라고 보면 됨.
그래서, 실제 구현은 안 해놓고 명시만 해 놓음.
위처럼 Pet에선 명시만 하고, 이 Pet을 받는 애들에서 구체적으로 구현.
13.2.1 Implementing Traits
trait에서 메서드를 구현하면, 이게 어떤 타입일지 모르니까 아래와 같은 talk, greet의 형태로만 구현이 가능.
(같은 trait에 있는 다른 함수를 호출하는 것은 가능하겠지만)
여기서 impl Pet for Dog 부분은 특정 type을 (Dog) 위한 trait의 구현.
*overriding도 되고, base 호출도 된다.
다만, function overloading은 안 됨.
13.2.2 Supertraits
trait의 상속. 구조체의 상속은 안되지만.. trat의 상속은 가능.
*참고로, 그렇기 때문에 구조체에서 overriding이 당연히 안 됨.
overriding은 상속이 안되면 의미가 없음.
🎯 객체 지향의 꽃이 상속인 이유?
=> 🎁 상속이 되어야 다양성도 되고 오버라이딩도 되니까.
중간에 trait Pet : Animal => Animal을 상속받은 trait Pet.
13.2.3 Associated Types
연관 타입.
아래의 Multiply trait에서 Output의 Type을 우리가 따로 지정해주고 싶을 때,
아래와 같은 연관 타입을 써준다.
trait Multiply를 보면, type Output; 이라 쓰여있다.
이것이 연관 타입. 여기선 type이라고만 적어주고, 구체적 내용은 impl 에서 씀.
그래서 밑에 impl Multiply for Metes를 보면
type Output = MetersSquared; 이라 쓰여있다.
연관 타입의 내용을 작성한 것으로, 여기선 MetersSquared로 한다는 뜻.
13.3. Deriving
Derive를 쓰면, 자동으로 만들어 준다.
구조체의 내용들이 trait의 내용들을 구현하고 있으면 가능.
Debug, Clone, Default는 Rust에서 기본적으로 제공해주는 trait들.
그래서 Derive를 쓰면, 알아서 이게 제공됨.
*참고로 Copy는 기본 타입 말고는 구현이 안 되어 있음.
이런거를 Vector에 대해 Derive해서 불러오면, Vector에 이게 구현이 안되어 있어서 불러올 수 없음.
'RUST 스터디' 카테고리의 다른 글
RUST 스터디[RUST vs C++] 20. Smart Pointers (1) | 2024.06.18 |
---|---|
RUST 스터디[RUST vs C++] 19. Memory Management (1) | 2024.06.18 |
RUST 스터디[RUST vs C++] 12. Pattern Matching (0) | 2024.05.13 |
RUST 스터디[RUST vs C++] 10. User-Defined Types (0) | 2024.05.13 |
[RUST vs C++] 17. Standard Library Traits (0) | 2024.05.13 |