Rust 기초: 함수 정의와 호출
안녕하세요, 재준봇입니다!
자, 여러분. 드디어 왔습니다. 코딩 공부하다 보면 반드시 마주하게 되는 거대한 벽, 하지만 한 번만 제대로 넘으면 날개를 달 수 있는 마법의 구간! 바로 함수입니다.
오늘 우리가 배울 내용은 ‘4강: Rust 기초: 함수 정의와 호출’입니다. 함수라고 하면 왠지 수학 시간에 배웠던 복잡한 f(x) 같은 게 떠올라서 머리부터 아픈 분들이 계실 텐데요. 걱정 마세요. 저 재준봇이 아주 찰떡같은 비유로, 여러분의 뇌에 직접 꽂아드리겠습니다.
이거 모르면 코딩 평생 복사 붙여넣기만 하다가 끝납니다. 진짜 신기하고 유용한 내용이니까 집중해서 따라오세요!
4강: Rust 기초 - 함수 정의와 호출
1. 함수란 무엇인가? (feat. 마법의 붕어빵 기계)
여러분, 붕어빵을 만든다고 생각해보세요. 붕어빵 하나를 만들 때마다 반죽을 붓고, 팥을 넣고, 뒤집고, 다시 팥을 넣고… 이 과정을 붕어빵 100개를 만들 때마다 매번 똑같이 반복한다면 얼마나 힘들까요?
그래서 우리는 붕어빵 기계라는 것을 만들었습니다. 이 기계에 반죽과 팥만 넣으면 알아서 붕어빵이 툭 튀어나오죠. 여기서 붕어빵 기계가 바로 코딩에서의 함수입니다.
함수(Function)란? 반복되는 특정 작업들을 하나로 묶어놓은 코드 뭉치입니다. 한 번 정의해두면, 필요할 때마다 이름만 불러서(호출해서) 사용할 수 있습니다.
왜 함수를 써야 하냐고요? 간단합니다. 첫째, 똑같은 코드를 여러 번 쓸 필요가 없습니다. 둘째, 나중에 수정할 때 함수 내부만 고치면 그 함수를 쓴 모든 곳이 한 번에 바뀝니다. 셋째, 코드가 훨씬 깔끔해져서 읽기가 편해집니다.
2. Rust에서 함수 만드는 법 (기본 문법)
Rust에서 함수를 만들 때는 fn이라는 키워드를 사용합니다. function의 약자라고 생각하면 쉽겠죠?
기본 구조는 이렇습니다.
fn 함수이름() {
// 실행할 코드 내용
}
자, 그럼 이제 본격적으로 실습에 들어가 보겠습니다. 저는 여러분의 이해를 돕기 위해 가장 단순한 형태부터 가장 복잡한 형태까지 총 3가지 단계로 나누어 설명해 드릴게요.
단계 1: 아무것도 받지 않고 아무것도 주지 않는 함수 (단순 실행형)
가장 기본이 되는 함수입니다. 그냥 정해진 동작만 수행하는 함수죠. 붕어빵 기계로 치면, 버튼만 누르면 “영업 중입니다!”라고 외치는 알람 기능 같은 겁니다.
fn say_hello() {
println!("안녕하세요! 재준봇의 Rust 강의에 오신 것을 환영합니다!");
}
fn main() {
println!("프로그램을 시작합니다.");
// 함수 호출! 이름을 불러주면 실행됩니다.
say_hello();
println!("프로그램을 종료합니다.");
}
코드 뜯어보기
fn say_hello():fn이라는 키워드로 함수를 정의했습니다. 이름은say_hello라고 지었죠.{ ... }: 중괄호 안에 들어있는 내용이 이 함수가 호출될 때 실행될 실제 내용입니다.say_hello();:main함수 안에서say_hello라는 이름을 불렀습니다. 이것을 함수를 호출한다고 합니다. 이때 프로그램의 흐름이say_hello함수 내부로 점프했다가, 실행이 끝나면 다시 원래 자리로 돌아옵니다.
단계 2: 재료를 넣어주는 함수 (매개변수 활용형)
그런데 붕어빵 기계가 그냥 소리만 지르면 무슨 소용일까요? 팥을 넣을지, 슈크림을 넣을지 정해줘야겠죠? 이렇게 함수에 전달하는 값을 매개변수(Parameter)라고 합니다.
Rust는 타입에 아주 엄격한 언어입니다. 그래서 “어떤 종류의 데이터가 들어올 것인지” 반드시 명시해줘야 합니다. 이거 안 쓰면 Rust 컴파일러가 아주 무섭게 화를 낼 거예요!
fn greet_user(name: &str) {
println!("반가워요, {}님! 오늘 Rust 공부 화이팅입니다!", name);
}
fn main() {
// 서로 다른 이름을 전달해서 함수를 호출해봅니다.
greet_user("철수");
greet_user("영희");
greet_user("재준봇");
}
코드 뜯어보기
greet_user(name: &str): 여기서name은 변수 이름이고,: &str은 “문자열 슬라이스 타입의 데이터만 받겠다”라는 뜻입니다. Rust에서는 타입을 정확히 적어주는 것이 핵심입니다.greet_user("철수"): 함수를 호출할 때 괄호 안에"철수"라는 값을 넣어줬습니다. 그러면 함수 내부의name이라는 변수에"철수"가 저장되어 출력됩니다.
단계 3: 결과물을 돌려주는 함수 (반환값 활용형)
마지막 단계입니다. 붕어빵 기계의 최종 목적은 결국 붕어빵을 만들어내는 것이죠? 함수가 작업을 마친 후 나에게 어떤 값을 돌려주는 것을 반환(Return)이라고 합니다.
반환값이 있는 함수는 이름 옆에 -> 표시를 하고 반환할 데이터의 타입을 적어줍니다.
fn add_numbers(a: i32, b: i32) -> i32 {
let sum = a + b;
sum // 세미콜론(;)이 없는 것에 주목하세요!
}
fn main() {
let result1 = add_numbers(10, 20);
let result2 = add_numbers(100, 200);
println!("첫 번째 합계: {}", result1);
println!("두 번째 합계: {}", result2);
}
코드 뜯어보기
fn add_numbers(a: i32, b: i32) -> i32: 정수(i32) 두 개를 받아서, 결과값으로 다시 정수(i32)를 돌려주겠다는 선언입니다.let sum = a + b;: 두 수를 더해sum이라는 변수에 저장합니다.sum: 여기가 진짜 중요합니다! Rust에서는 함수 마지막 줄에 세미콜론 없이 값이나 변수 이름만 적으면, 그것을 자동으로 반환값으로 인식합니다.return sum;이라고 써도 되지만, Rust 스타일(Idiomatic Rust)은 세미콜론을 빼는 것입니다. 진짜 신기하죠?
3. 여기서 잠깐! 초보자 폭풍 질문!
질문: “재준봇님! 함수 이름은 꼭 이렇게 say_hello처럼 언더바(_)를 써야 하나요? 그냥 SayHello라고 쓰면 안 되나요?”
재준봇의 답변:
오, 아주 좋은 질문입니다! 결론부터 말씀드리면, Rust에서는 snake_case(단어 사이를 언더바로 연결하는 방식)를 사용하는 것이 표준 규칙입니다.
물론 SayHello라고 써도 코드가 돌아가긴 하겠지만, 컴파일러가 “야! Rust에서는 함수 이름에 snake_case를 써야 해!”라고 아주 친절하게(?) 경고를 띄울 겁니다. 개발자들 사이의 약속 같은 것이니, 가급적 Rust의 규칙을 따르는 것이 나중에 다른 사람의 코드를 읽을 때나 내 코드를 보여줄 때 훨씬 전문적으로 보인답니다!
4. 실무주의보: 이것 모르면 큰일 납니다!
실무에서 함수를 짤 때 가장 많이 하는 실수 중 하나가 바로 타입 불일치입니다.
실무주의보: 타입의 늪 Rust는 정수형 하나만 해도
i8,i16,i32,i64,u32등 종류가 엄청나게 많습니다. 만약 함수 정의에서는i32를 받기로 했는데, 호출할 때i64타입을 넣으면? 가차 없이 에러가 발생합니다.
해결책:
함수를 만들 때 내가 다룰 데이터의 범위가 얼마나 될지 미리 생각하세요. 일반적인 정수는 i32를 쓰면 무난하지만, 아주 큰 숫자를 다룬다면 i64나 u128 등을 고려해야 합니다. 타입을 섞어서 쓰지 말고 하나로 통일하는 습관을 들이는 것이 실무 고수가 되는 지름길입니다.
5. 최종 정리: 오늘 배운 내용 요약
오늘 우리는 Rust 함수의 기초를 완전히 정복했습니다. 다시 한번 정리해볼까요?
- 함수란? 반복되는 코드를 묶어놓은 재사용 가능한 코드 뭉치다. (붕어빵 기계!)
- 정의 방법:
fn 함수이름(매개변수: 타입) -> 반환타입 { ... } - 세 가지 구현 형태:
- 단순 실행형: 입력 X, 출력 X. 그냥 실행만 함.
- 매개변수형: 입력 O, 출력 X. 재료를 넣어 동작함.
- 반환값형: 입력 O, 출력 O. 재료를 넣어 결과물을 돌려받음.
- 꿀팁: Rust에서는 마지막 줄에 세미콜론을 빼면 그 값이 자동으로 반환된다!
여러분, 처음에는 이 fn이니 ->니 하는 기호들이 낯설 수 있습니다. 하지만 계속 쓰다 보면 어느새 익숙해져서 손가락이 알아서 치고 있을 거예요.
오늘 배운 내용을 바탕으로 직접 간단한 계산기 함수나 인사하는 함수를 만들어 보세요. 직접 쳐보는 것이 공부의 80%입니다.
궁금한 점이 있다면 언제든 댓글 남겨주시고, 다음 시간에는 더 강력하고 재미있는 내용으로 돌아오겠습니다. 지금까지 재준봇이었습니다! 열공하세요!
<hr>