IT’s Portfolio

[Rust] Start Rust (Day 6) - Common Programming Concepts [2] λ³Έλ¬Έ

Development Study/Rust

[Rust] Start Rust (Day 6) - Common Programming Concepts [2]

f1r3_r41n 2023. 1. 3. 23:25
728x90
λ°˜μ‘ν˜•

πŸ¦€ Rust Day 6

🏳️ Common Programming Concepts

3️⃣ ν•¨μˆ˜ (functions)

  • ν”„λ‘œκ·Έλž¨μ˜ μ§„μž…μ  : main function
  • μƒˆλ‘œμš΄ function μ„ μ–Έ : fn keyword
  • λŸ¬μŠ€νŠΈλŠ” ν•¨μˆ˜μ™€ λ³€μˆ˜ 이름에 snake case μ‚¬μš©
  • λŸ¬μŠ€νŠΈμ—μ„œ ν•¨μˆ˜μ˜ μ„ μ–Έ μˆœμ„œλŠ” μ€‘μš”ν•˜μ§€ μ•ŠμœΌλ©° 어디에 μ„ μ–Έν–ˆλŠ”μ§€κ°€ μ€‘μš”

πŸ€” ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜

  • λ§€κ°œλ³€μˆ˜(parameter) : ν•¨μˆ˜μ˜ signature에 ν¬ν•¨λ˜λŠ” νŠΉλ³„ν•œ λ³€μˆ˜
    • 이 λ§€κ°œλ³€μˆ˜μ— ꡬ체적인 κ°’ 을 전달할 수 있음
    • ꡬ체적인 κ°’ : 인수(argument)
  • ν•¨μˆ˜ signatureμ—λŠ” 각 λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ λͺ…μ‹œν•΄μ•Ό 함

πŸ€” ν•¨μˆ˜ 본문의 ꡬ문과 ν‘œν˜„μ‹

  • ν•¨μˆ˜ 본문은 μ—¬λŸ¬ 개의 ꡬ문(statements)으둜 κ΅¬μ„±λ˜λ©°, μ„ νƒμ μœΌλ‘œ ν‘œν˜„μ‹(expression)으둜 λλ‚˜κΈ°λ„ 함
  • λŸ¬μŠ€νŠΈλŠ” ν‘œν˜„μ‹ μ–Έμ–΄ 기반
    • ꡬ문과 ν‘œν˜„μ‹μ„ κ΅¬λΆ„ν•˜λŠ” 것은 맀우 μ€‘μš”ν•¨
  • ☝️ ꡬ문
    • μ–΄λ–€ λ™μž‘μ„ μ‹€ν–‰ν•˜μ§€λ§Œ 값을 λ¦¬ν„΄ν•˜μ§€ μ•ŠλŠ” λͺ…λ Ή
      • let keyword μ΄μš©ν•΄ λ³€μˆ˜ 생성 ν›„ κ°’ λŒ€μž…
      • ν•¨μˆ˜ μ„ μ–Έ
    • 즉, let ꡬ문은 λ‹€λ₯Έ λ³€μˆ˜μ— λŒ€μž… λΆˆκ°€λŠ₯
    • λŒ€μž…λ¬Έμ΄ λŒ€μž…λœ 값을 λ¦¬ν„΄ν•˜λŠ” Cλ‚˜ 루비 같은 언어와 λ‹€λ₯Έ 점
      • Cλ‚˜ 루비 같은 μ–Έμ–΄μ—μ„œλŠ” x = y = 6 κ³Ό 같은 ꡬ문을 μž‘μ„±ν•˜λ©΄ x와 y λ³€μˆ˜μ˜ 값이 λͺ¨λ‘ 6μž„
      • ν•˜μ§€λ§Œ λŸ¬μŠ€νŠΈμ—μ„œ ꡬ문은 값을 λ¦¬ν„΄ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 같은 κ²°κ³Όλ₯Ό 얻을 수 μ—†μŒ
  • ☝️ ν‘œν˜„μ‹
    • μ΅œμ’… κ²°κ΄κ°’μœΌλ‘œ 평가(evaluate)됨
      • 5+6 사칙연산은 11 μ΄λΌλŠ” 값이 평가됨
      • ν•¨μˆ˜μ˜ 호좜
      • 맀크둜의 호좜
      • μƒˆλ‘œμš΄ λ²”μœ„ μ„ μ–Έ μ‹œ μ‚¬μš©ν•˜λŠ” μ½”λ“œ 블둝
    • 즉, ν‘œν˜„μ‹μ€ ꡬ문의 일뢀가 될 수 있음
    • ν‘œν˜„μ‹μ€ λ§ˆμ§€λ§‰μ— μ„Έλ―Έμ½œλ‘ μ„ ν¬ν•¨ν•˜μ§€ μ•ŠμŒ
      fn main() {
          let x = 5;
          let y = {
              let x = 3;
              x + 1
          };
          println!("y의 κ°’: {}", y);
      }
      // Result 
      // y의 κ°’: 4
      • λ§Œμ•½ μ„Έλ―Έμ½œλ‘ μ„ μΆ”κ°€ν•˜λ©΄ ν‘œν˜„μ‹μ΄ ꡬ문으둜 λ°”λ€Œμ–΄ 값을 λ¦¬ν„΄ν•˜μ§€ μ•ŠμŒ

πŸ€” 값을 λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜

  • 리턴할 κ°’μ˜ νƒ€μž…μ„ -> 둜 지정해야 함
  • λŸ¬μŠ€νŠΈμ—μ„œ ν•¨μˆ˜μ˜ 리턴값은 ν•¨μˆ˜ 본문의 λ§ˆμ§€λ§‰ ν‘œν˜„μ‹ κ°’
  • return keyword둜 λ°˜ν™˜κ°’ 지정이 κ°€λŠ₯ν•˜μ§€λ§Œ λŒ€λΆ€λΆ„μ˜ ν•¨μˆ˜λŠ” λ§ˆμ§€λ§‰ ν‘œν˜„μ‹μ˜ κ²°κ³Όλ₯Ό 리턴함

4️⃣ 주석

  • 두 개의 μŠ¬λž˜μ‹œ μ‚¬μš© => //
  • μ½”λ“œμ˜ 끝에 μž‘μ„±ν•΄λ„ 됨
  • ν•˜μ§€λ§Œ λŒ€λΆ€λΆ„ 주석은 κ΄€λ ¨λœ μ½”λ“œμ˜ μœ—μ€„μ— μž‘μ„±ν•˜λŠ” 것이 일반적
  • λŸ¬μŠ€νŠΈλŠ” λ¬Έμ„œν™” 주석(document comments)μ΄λΌλŠ” νŠΉλ³„ν•œ ν˜•μ‹μ˜ 주석도 지원

5️⃣ 흐름 μ œμ–΄

  • ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 흐름을 μ œμ–΄ν•  수 μžˆλŠ” κ°€μž₯ 일반적인 ꡬ쑰
    • if ν‘œν˜„μ‹
    • loop

πŸ€” if ν‘œν˜„μ‹

  • if keyword λ‹€μŒ 쑰건식 λΆ€μ—¬
  • if 문의 쑰건은 λ°˜λ“œμ‹œ boolean νƒ€μž… 쀑 ν•˜λ‚˜λ₯Ό 리턴해야 함
  • λ£¨λΉ„λ‚˜ JS 같은 언어와 달리 λŸ¬μŠ€νŠΈλŠ” boolean 이 μ•„λ‹Œ 값을 boolean 으둜 μžλ™ λ³€ν™˜ λΆˆκ°€λŠ₯
  • else if ν‘œν˜„μ‹μ„ λ„ˆλ¬΄ 많이 μ‚¬μš©ν•˜λ©΄ μ½”λ“œκ°€ μ§€μ €λΆ„ν•΄λ³΄μž„
    • μ½”λ“œ λ¦¬νŒ©ν† λ§(refactoring) ν•„μš” => match ν‘œν˜„μ‹ μ‚¬μš©
  • if 문은 ν‘œν˜„μ‹μ΄λ―€λ‘œ let ꡬ문에 적용 κ°€λŠ₯
      fn main() {
          let condition = true;
          let num = if condition{
              1
          } else {
              0
          };
          println!("num의 κ°’: {}", num);
      }
      // Result
      // num의 κ°’: 1
  • if ꡬ문의 각 가지가 λ¦¬ν„΄ν•˜λŠ” κ²°κ³Όκ°€ λͺ¨λ‘ 같은 νƒ€μž…μ΄μ–΄μ•Ό 함
      fn main() {
          let condition = true;
          let num = if condition{
              1
          } else {
              "zero"
          };
          println!("num의 κ°’: {}", num);
      }
      // Result
      // error[E0308]: `if` and `else` have incompatible types
  • Why?
    • μ½”λ“œ λΈ”λ‘μ˜ κ²°κ³ΌλŠ” λ§ˆμ§€λ§‰ ν‘œν˜„μ‹μ˜ 값을 ν‰κ°€ν•˜λ©° 숫자 μžμ²΄λ„ ν•˜λ‚˜μ˜ ν‘œν˜„μ‹. if ν‘œν˜„μ‹ μ „μ²΄μ˜ κ²°κ³ΌλŠ” μ–΄λ–€ μ½”λ“œ 블둝이 μ‹€ν–‰λ˜λŠ”κ°€μ— 따라 달라지기 λ•Œλ¬Έμ— if ꡬ문의 각 가지가 λ¦¬ν„΄ν•˜λŠ” κ²°κ³ΌλŠ” λͺ¨λ‘ 같은 νƒ€μž…μ΄μ–΄μ•Ό 함
    • λŸ¬μŠ€νŠΈλŠ” λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λͺ¨λ“  μ½”λ“œμ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜κΈ° μœ„ν•΄ 컴파일 μ‹œμ μ— λ³€μˆ˜μ˜ νƒ€μž…μ΄ 무엇인지 μ•Œμ•„μ•Ό 함. λ³€μˆ˜μ˜ νƒ€μž…μ΄ λŸ°νƒ€μž„μ— κ²°μ •λœλ‹€λ©΄ λŸ¬μŠ€νŠΈλŠ” 이런 μœ νš¨μ„± 검사 μˆ˜ν–‰ λΆˆκ°€λŠ₯. 그러면 컴파일러의 ꡬ쑰가 더 λ³΅μž‘ν•΄μ§ˆλΏλ”λŸ¬ λ³€μˆ˜μ˜ νƒ€μž… 변경을 좔적해야 ν•œλ‹€λ©΄ μ»΄νŒŒμΌλŸ¬λŠ” μ§€κΈˆλ§ŒνΌ μ½”λ“œμ˜ 싀행을 보μž₯ν•  수 μ—†μŒ

πŸ€” loop

  • loop, while, for λ“± μ„Έ 가지 μ’…λ₯˜μ˜ 루프 제곡
  • ☝️ loop keyword
    • 루프λ₯Ό μ€‘μ§€ν•˜λΌκ³  λͺ…μ‹œν•˜μ§€ μ•ŠλŠ” ν•œ λ¬΄ν•œ 반볡
    • break keyword μ‚¬μš© κ°€λŠ₯
  • ☝️ loop μ—μ„œ κ°’ λ¦¬ν„΄ν•˜κΈ°
    • μŠ€λ ˆλ“œκ°€ μž‘μ—…μ„ μ™„λ£Œν–ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” λ“± μ‹€νŒ¨ν•  κ°€λŠ₯성이 μžˆλŠ” μž‘μ—…μ„ μž¬μ‹œλ„ν•˜λŠ” 경우 loop μ‚¬μš©
    • μž‘μ—…μ˜ κ²°κ³Όλ₯Ό λ‹€λ₯Έ μ½”λ“œμ— 전달해야 ν•  μˆ˜λ„ 있음
    • break keyword λ‹€μŒμ— 리턴값 μΆ”κ°€
  • ☝️ while
    • 쑰건식이 μΌμΉ˜ν•˜λŠ” λ™μ•ˆμ—λŠ” μ½”λ“œκ°€ μ‹€ν–‰λ˜λ©°, 그렇지 μ•ŠμœΌλ©΄ 루프 νƒˆμΆœ
  • ☝️ for 을 μ΄μš©ν•΄ μ»¬λ ‰μ…˜μ„ 반볡 처리
    • iterator μ‚¬μš©
      fn main() {
          let a = [1, 2, 3, 4, 5];
          for i in a.iter(){
              println!("Element value: {}", i);
          }
      }
      // Result
      // Element value: 1
      // Element value: 2
      // Element value: 3
      // Element value: 4
      // Element value: 5
    • ν‘œμ€€ lib의 Range νƒ€μž… 이용
      fn main() {
          for i in 1..6{
              println!("Element value: {}", i);
          }
      }
      // Result
      // Element value: 1
      // Element value: 2
      // Element value: 3
      // Element value: 4
      // Element value: 5
    • λ²”μœ„λ₯Ό λ’€μ§‘μ–΄μ„œ μƒμ„±ν•˜λŠ” rev λ©”μ„œλ“œμ™€ 같이 μ‘μš©
      fn main() {
          for i in (1..4).rev(){
              println!("{}...", i);
          }
          println!("λ°œμ‚¬!");
      }
      // Result
      // 3...
      // 2...
      // 1...
      // λ°œμ‚¬!
728x90
λ°˜μ‘ν˜•
Comments