구조체로 실습하기

러스트 구조체(struct)를 바탕으로 사각형 면적 구하는 프로그램을 작성한 내용을 정리합니다.


이전 글에서 러스트 구조체에 대해서 간단하게 알아보았다. 이번 글에서는 구조체를 사용하여 간단한 프로그램을 작성해보려고 한다.

사각형 면적 구하기 step 1: 변수

지금까지 공부했던 내용을 바탕으로 사각형의 면적을 구하는 간단한 프로그램을 작성해보자. 프로젝트를 생성할 디렉토리에서 아래의 코드를 입력하자.

1
cargo new rectangles

그러면 해당 디렉토리에 rectangles라는 폴더가 생성되고, 내부에 src/main.rsCargo.toml이 생성될 것이다. 우리가 만들 코드들은 src/main.rs에 입력하면 된다.

사각형의 면적을 구하는 식은 대부분의 사람들이 알고 있다. 바로 '(밑변) x (높이)'이다. 구조체나 튜플 등 없이 가장 간단하게 코드를 작성한다면 아래와 같다.

1
2
3
4
5
6
7
8
9
fn main() {
let width = 30;
let height = 40;
println!("사각형의 면적은 {} 입니다.", area(width, height));
}

fn area(width:i32, height:i32) -> i32{
width * height
}

위 코드는 밑변과 높이를 모두 받아서 곱한다. 하지만 위 코드를 바탕으로 여러 개의 사각형 넓이를 도출하는 프로그램을 생성해보자.

1
2
3
4
5
6
7
8
9
10
11
12
fn main() {
let width1 = 30;
let height1 = 40;
let width2 = 50;
let height2 = 50;
println!("사각형의 면적은 {} 입니다.", area(width1, height1));
println!("사각형의 면적은 {} 입니다.", area(width2, height2));
}

fn area(width:i32, height:i32) -> i32{
width * height
}

밑변인 width와 높이인 height가 여러 개 사용되다보니 정신이 없다. 만약 100개의 면적을 구하는 프로그램을 작성해야 한다면 위 코드를 사용하는 프로그래머는 머리가 아플 것이다. 우리는 다행히 이런 상황에서 적절하게 사용할 수 있는 데이터 타입을 배웠다. 바로 튜플이다.

사각형 면적 구하기 step 2: 튜플

튜플을 이용하여 밑변인 width와 높이인 height을 묶을 수 있다면 이전 코드보다는 훨씬 편리하고 코드 길이도 줄어들 것이다. 아래 코드를 통해 살펴보자.

1
2
3
4
5
6
7
8
9
10
fn main() {
let rec1 = (30,40);
let rec2 = (50,50);
println!("사각형의 면적은 {} 입니다.", area(rec1));
println!("사각형의 면적은 {} 입니다.", area(rec2));
}

fn area(rec:(i32, i32)) -> i32{
rec.0 * rec.1
}

위 코드에서는 사각형의 개수 별로 변수가 생성되며, 이전 코드보다 훨씬 알아보기도 쉽다. 다만 튜플 인덱스 중에서 어떤 것이 밑변이고, 높이인지 여부는 코드에 나타나 있지 않다. 따라서 해당 코드를 작성하여 전달하는 프로그래머는 주석으로 인덱스들의 의미를 추가해야 한다.

1
// 튜플의 0은 밑변, 1은 높이

하지만 이런 주석도 개발 단계에서만 사용될 뿐 실제 프로그램에 사용할 소스 코드에서는 보안 상 전부 지우는게 좋다. 따라서 튜플보다는 좀 더 새로운 데이터 타입이 필요하다. 사용할 데이터 타입의 필수 요건은 아래와 같다.

  1. 밑변과 높이가 특정 사각형에 속한다는 점이 확실하게 보여야 한다.
  2. 특정 사각형의 밑변과 높이의 값이 정확히 무엇인지 파악할 수 있어야 한다.

위 조건들을 모두 만족할 수 있는 데이터 타입을 구조체로 직접 만들 수 있다면, 보다 가독성 있는 소스 코드를 작성할 수 있을 것이다.

사각형 면적 구하기 step 3: 구조체

드디어 구조체를 사용할 기회가 왔다. 위 조건을 모두 포함하는 데이터 타입을 만들어보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Rectangle {
width: i32,
height: i32
}

fn main() {
let rec1 = Rectangle {width: 30, height: 40};
let rec2 = Rectangle {width: 50, height: 50};
println!("사각형의 면적은 {} 입니다.", area(&rec1));
println!("사각형의 면적은 {} 입니다.", area(&rec2));
}

fn area(rec: &Rectangle) -> i32{
rec.width * rec.height
}

위 코드는 Rectangle이라는 구조체를 생성 및 사용하여 변수를 정의하고, area()에서는 밑변인 width와 높이인 height를 필드로 선택하여 구현하였다. 위와 같이 작성된 프로그램은 이후 다른 프로그래머가 소스 코드를 이해함에 있어 훨씬 명확한 의미를 전달해 줄 것이다.


구조체로 실습하기
https://dev-bearabbit.github.io/ko/Rust/rust-4/
Author
Jess
Posted on
2021년 10월 10일
Licensed under