inflearn logo
강의

講義

知識共有

エレガントな高性能プログラミング言語Rustの入門と活用

構造体の基礎

튜플과 구조체 차이 설명에 관한 질문

解決済みの質問

377

weirdo

投稿した質問数 1

0

안녕하세요. 좋은 강의 감사합니다.
12번째 구조체 기초 강의에서 튜플과 구조체의 차이에 대해서 말씀해주셨는데, 여기서 두 가지의 질문이 있습니다.

첫 번째로는 강의에서 튜플과 구조체의 차이에 대한 예시로, "구조체는 이름을 따로 붙여줌으로서 Color가 들어갈 자리에 Point가 들어가거나 Point가 들어갈 자리에 Color가 들어가게 되는 문제를 일으키지 않는다" 라고 하셨습니다.

이때, 앞선 6번째 강의에서 튜플을 정의했던 내용을 활용하여
let point: (i32, i32, i32) = (2, 2, 2);
let color: (i32, i32, i32) = (255, 255, 255);

하는 식으로 정의를 한다면 말씀하신 문제에 대해서는 방지가 가능하다고 생각하는데, 제가 어느 부분에서 잘못 이해하고 있는 것인지 궁금합니다.

두 번째로는 일반 Struct를 정의하실 때는
struct User {
name: String,
email: String,
active: bool,
}
으로 뒤에 세미콜론을 따로 사용하지 않으셨는데,
튜플 구조체에서는
struct Color(i32, i32, i32);
처럼 뒤에 세미콜론을 사용하신 부분에서,

명령문과 표현식에 있어 세미콜론 유무에 대한 차이가 있다는 것은 어느 정도 알겠지만, 이 부분에선 어떤 이유로 차이가 있는 것인지 궁금합니다.

감사합니다!

rust webassembly

回答 1

1

hatemogi

수강 및 좋은 질문 감사합니다.

 

구조체와 튜플 혼동 차이

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

사실 Color는 보통 (u8, u8, u8) 같은 타입을 쓰겠지만, 편한 비교를 위해 i32 3개로 구성했다고 칩시다.

 

이 상황에서

fn drawSphere(point: Point, color: Color) {
   // ... 반지름 1인 구를 그리는 함수
}

fn main() {
    let point = Point(0, 0, 0);
    let color = Color(255, 255, 255);
    drawSphere(point, color);
}

이렇게 원점에다가 흰색의 반지름 1짜리 구를 그리려는 상황이라면, drawSphere에 첫번째 파라미터에는 반드시 Point타입의 구조체 튜플이 들어가야 하고, 두번째는 반드시 Color타입의 구조체 튜플이 들어가야 하므로, 두 파라미터가 섞일 일이 없겠습니다.

fn drawSphere(point: (i32, i32, i32), color: (i32, i32, i32)) {
   // ... 반지름 1인 구를 그리는 함수
}

fn main() {
    let point = (0, 0, 0);
    let color = (255, 255, 255);
    drawSphere(color, point);
}

그런데 이번에는 그냥 평범한 튜플을 써보았는데요, 이때는 두 값의 타입이 (i32, i32, i32)로 동일하므로, drawSphere를 호출하는 시점에, 두 파라미터를 혼동해서 거꾸로 적었음에도, 타입체커 입장에서는 문제가 없으므로 정상 컴파일이 되겠습니다.

하지만, 실행하면, (255, 255, 255) 좌표에 검은색 구가 그려지겠죠.

이런 상황을 말씀드리는 것이긴 합니다.

하지만 한편, 요새는 코드 에디터에서 명시적으로 파라미터 이름을 잘 보여주기도 하니, 크게 문제가 되지 않을 수도 있기도 하겠습니다.

구조체 튜플과 구조체 끝에 세미콜론 차이

사실 저도 크게 모르고 쓰고 있는 부분인데, 이 부분은 러스트 컴파일러나 린터, 포맷터가 알아서 잘 관리해주기 때문에 시키는대로 하면 되는 부분 같습니다. 아마도 문법적으로나 관습적으로 두 경우에 세미콜론 사용여부를 갈라놓은 것 같습니다. 정확한 것은 문법 규칙을 자세히 살펴보면 알 수 있겠습니다.

Screenshot 2024-08-09 at 10.00.00 AM.png

그냥 편하게는 코드에디터에서 (아마도 러스트 포맷터나 린터가 알려주는 정보를 토대로) 'braced struct declarations are not followed by a semicolon'이라면서 잘 알려주고 빨갛게 표시해주므로, 세미콜론 없이 쓰면 되는 상황입니다.

혹시 더 궁금하셔서 문법 규칙을 살펴보셨다면, 제게도 알려주시면 감사하겠습니다.

 

감사합니다.

1

weirdo

답변 감사합니다!

다음강의 플랜이 어떻게 되실까요?

0

32

1

소스코드

0

32

1

강의 자료 ppt나 pdf 파일은 없을까요?

0

69

1

선생님 ppt자료를 받아서 공부하고 싶습니다.

0

52

2

Rust는 어떻게 컴파일 타임에 dangling reference를 막나요?

0

70

2

강의 추가 계획 질문

0

76

2

소유권 이전과 관련된 질문입니다

0

146

2

&r1 을 써야하는지 r1을 써야하는지?

1

120

1

임대값 수명에 대한 질문

1

122

1

변수 가리기 shadowing 을 듣고 궁금한점이 생겼습니다.

1

154

1

튜플 구조체에서 println! 사용시 에러가 발생합니다.

0

166

1

메모리 관리규칙에서 질문드립니다.

1

209

1

튜플과 배열 강의 4:50에서 벡터 나중에 설명해주신다고 하셨는데

0

192

1

trait를 인자로 받을 때 &impl과 &dyn차이

1

365

2

구조체는 언제나 Heap에 저장되나요??

2

418

2

Lifecycle 강의에서 두 문자열 슬라이스를 비교해 긴 문자열 슬라이스를 리턴하는 것 관련 질문

0

268

1

혹시 어떤 폰트일까요?

0

455

2

build 오류

0

402

1

웹 어플리케이션 개발에도 잘 사용되나요?

1

458

1

임대값의 수명 강의가 재생이 안되고 있습니다~

0

412

3

임대값의 수명에 대한 강의는 언제쯤 볼 수 있을까요?

0

350

2

문자열 리터럴이 너무 어려워요ㅠㅠ

1

555

1

Integer는 자동으로 copy되서(copy type)(integer 는 stack에 할당되서)

0

366

2

명령어를 입력 한 후 source "$HOME/.cargo/env" 이 명령어를 입력해야 합니다.

0

336

2