인프런 커뮤니티 질문&답변

이상님의 프로필 이미지
이상

작성한 질문수

우아한 고성능 프로그래밍 언어 Rust 입문 및 활용

구조체 기초

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

해결된 질문

작성

·

124

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);
처럼 뒤에 세미콜론을 사용하신 부분에서,

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

감사합니다!

답변 1

1

김대현님의 프로필 이미지
김대현
지식공유자

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

 

구조체와 튜플 혼동 차이

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'이라면서 잘 알려주고 빨갛게 표시해주므로, 세미콜론 없이 쓰면 되는 상황입니다.

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

 

감사합니다.

이상님의 프로필 이미지
이상
질문자

답변 감사합니다!

이상님의 프로필 이미지
이상

작성한 질문수

질문하기