// 예제 01: Hello, World! + println! 포맷 완전 가이드
// 실행: cargo run --example 01_hello_world
fn main() {
// ── 기본 출력 ──────────────────────────────────────────────
println!("Hello, World!");
println!("안녕, 러스트!");
// ── 변수 삽입 ──────────────────────────────────────────────
let name = "Rust";
let version: f64 = 1.95; //: f64: 변수의 데이터 타입을 명시하는 부분입니다. f64는 64비트 부동소수점 실수(Floating-point number) 타입을 뜻하며, 소수점이 있는 숫자를 정밀하게 표현할 때 사용합니다. (Java나 C 언어의 double 타입과 같습니다.)
println!("언어: {}, 버전: {}", name, version);
// 이름 있는 파라미터 (가독성 향상)
println!("지금 {lang}은 {ver} 버전입니다", lang = name, ver = version);
// 인덱스로 재사용
println!("{0}은 구립니다! {0}를 배우지 마세요!", name);
println!("\n=== 숫자 포맷 ===");
let n: i32 = 42; //데이터 타입을 지정하는 부분입니다. i32는 32비트 부호 있는 정수(Signed Integer)를 의미합니다. 음수와 양수를 모두 포함하며, 약 -21억부터 +21억까지의 정수를 표현할 수 있습니다. (C나 Java의 일반적인 int 타입과 같습니다.)
let f: f64 = 3.14159265358979;
// 정수 진법 변환
println!("10진수: {}", n); // 아래 주석들은 출력 값 입니다.
println!(" 2진수: {:b}", n); // 101010
println!(" 8진수: {:o}", n); // 52
println!("16진수: {:x}", n); // 2a (소문자)
println!("16진수: {:X}", n); // 2A (대문자)
println!("16진수: {:#x}", n); // 0x2a (접두사 포함)
println!(" 2진수: {:#b}", n); // 0b101010
// 폭과 정렬 // 아래는 출력 값 입니다.
println!("|{:10}|", n); // | 42| (우측 정렬, 기본)
println!("|{:<10}|", n); // |42 | (좌측 정렬)
println!("|{:^10}|", n); // | 42 | (가운데 정렬)
println!("|{:0>10}|", n); // |0000000042| (0으로 우측 패딩)
println!("|{:*<10}|", n); // |42********| (*로 좌측 패딩)
// 부동소수점
println!("{}", f); // 3.14159265358979
println!("{:.2}", f); // 3.14
println!("{:.4}", f); // 3.1416
println!("{:10.3}", f); // " 3.142"
println!("{:e}", f); // 3.14159265358979e0 (과학 표기)
println!("{:E}", f); // 3.14159265358979E0 (대문자)
println!("\n=== 디버그 출력 ===");
let tuple = (1, "hello", 3.14); //튜플 (Tuple): 서로 다른 타입의 데이터를 하나로 묶을 때 사용합니다. 정수(1), 문자열("hello"), 실수(3.14)가 한 곳에 담겼습니다. 한 번 크기가 정해지면 늘리거나 줄일 수 없습니다.
let array = [10, 20, 30, 40, 50]; //배열 (Array): 같은 타입의 데이터를 정해진 개수만큼 묶을 때 사용합니다.모두 정수형 데이터이며, 고정된 크기(여기서는 5개)를 가집니다.
let vec = vec!["a", "b", "c"]; //벡터 (Vector): 배열처럼 같은 타입의 데이터를 묶지만, 크기가 고정되지 않고 런타임에 요소를 추가하거나 삭제할 수 있는 동적 배열입니다.vec!는 벡터를 쉽고 빠르게 만들기 위해 제공되는 Rust의 매크로입니다.
println!("{:?}", tuple); // (1, "hello", 3.14)
println!("{:?}", array); // [10, 20, 30, 40, 50]
println!("{:?}", vec); // ["a", "b", "c"]
//일반적인 {} 포맷터는 출력 형식이 지정된 기본 타입(정수, 문자열 등)만 출력할 수 있습니다.
//튜플, 배열, 벡터처럼 복잡한 구조는 일반 출력이 불가능하므로, 개발자가 구조를 쉽게 확인할 수 있게 돕는 디버그 포맷터 {:?}를 사용해야 합니다.
// Pretty-print (구조 들여쓰기)
println!("{:#?}", vec);
//{:#?}를 사용하면 데이터를 한 줄로 표현하지 않고, 구조별로 줄바꿈과 들여쓰기를 적용해 사람이 보기 편한 형태로 출력해 줍니다.
/* 출력물은 아래와 같습니다.
[
"a",
"b",
"c",
]
*/
println!("\n=== 특수 출력 ===");
// 이스케이프
println!("탭:\t끝");
println!("새줄:\n끝");
println!("역슬래시: \\");
println!("따옴표: \"안녕\"");
println!("중괄호: {{리터럴}}"); // {} 자체 출력
// Unicode
println!("유니코드: \u{1F600} \u{1F980}"); // 😀 🦀
println!("러스트 마스코트: 🦀");
println!("\n=== format! 과 다른 매크로 ===");
// format! — String 반환
let greeting = format!("안녕, {}! 버전 {:.1}", name, version);
println!("포맷 문자열: {}", greeting);
// print! — 개행 없음
print!("이 줄 끝에 개행 없음");
print!(" — 계속됨");
println!(); // 개행만
// eprint!, eprintln! — 표준 에러로 출력
eprintln!("이것은 표준 에러(stderr)로 출력됩니다");
}
Rust
복사
안녕하세요
•
관련 기술 문의와 R&D 공동 연구 사업 관련 문의는 “glory@keti.re.kr”로 연락 부탁드립니다.
Hello 
•
For technical and business inquiries, please contact me at “glory@keti.re.kr”
