1. 프로그래밍 기본 원리

  • 순차
  • 조건
  • 반복

순차

  • 개발자가 정한 규칙으로 실행한다.

    print("1")
    print("2")
    print("3")
    

조건(if)

  • 조건이 참이면 {}를 실행하고 거짓이면 아무 직업도 하지 않는다.

  • 참과 거짓을 판단할 수 있는 문장을 조건이라고 부르고, 조건을 콤마로 여러개 연결 가능하다(and연산자이다).

  • ⚠️ if문에서 ,(콤마)는 and 역할이다.

    if 참과 거짓을 판단할 수 있는 문장 {
      
    }
    

조건(switch)

  • if문보다 한정적인 상황에서 사용한다.
  • 각각의 case 에 break을 사용할 필요 없다.
  • 가능한 모든 경우의 수를 다루어야 한다.
  • 반드시 default문이 있어야 한다. (모든 케이스를 빠짐없이 봐야하기 때문)
  • default문에는 일을 안한다면 break문을 써야 한다.
  • fallthrough: 무조건 아래 문장 실행해라.
  • 범위 연산자/패턴 매칭 연산자를 사용해라.
  • ⚠️ switch문에서 ,(콤마)는 or 역할이다.
  • ⚠️ case에서 부등식을 사용할 수 없다 범위 연산자로 만들어진 범위 값으로 케이스를 정의해야 한다.
  • 기본 방식

    switch 변수 {
    case 값1:
        // code
    case 값2, 값3:
        // code
    case 값4:
        // code
    default:
      	break // 실행하려는 코드가 없으면 반드시 break 입력
    }
    
  • 패턴 매칭

    switch age {
    case 10...19:	// 10...19 ~= age
      	// code
    case 20...29:
      	// code
    case 30...39:
      	// code
    default:
      	break
    }
    
  • case를 조건에 따라 처리하는 경우

    switch num {
    case let x where x%2==0:		// num변수를 x 상수에 바인딩 후, where 조건절에서 케이스가 조건에 해당하는지 여부 확인
        print("짝수 숫자: \(x)")
    default:
        print("홀수 숫자: \(num)")
    }
    

범위 연산자

  • … 연산자

    0...50  // 0부터 50까지
    0..<5	  // 0, 1, 2, 3 ,4
    ..<0		  // 정수의 범위에서 가장 낮은 숫자부터 0까지
    

패턴 매칭 연산자

  • ~= 연산자

  • 오른쪽 변수가 왼쪽 범위에 포함되는지에 따라 참과 거짓을 알려주는 연산자

    0...50 ~= num // 0~50 범위내에 num이 속한다면 Bool 타입으로 알려주는 기호
    
if switch
조건 2개 사용가능 및 응용 범위가 넓다 if문보다 가독성이 좋다
실제 앱개발 시 분기처리에 많이 사용한다
   

2. 연습문제

연습문제1

/*
가위 / 바위 / 보 게임을 if문을 사용해서 구현해 봅니다. 컴퓨터는 가 위, 바위, 보 중에서 랜덤(무작위)으로 선택하게 되고, 당신은 한가지 를 고릅니다.
그리고 결과적으로

“무승부입니다.”, “당신은 졌습니다.”, “당신이 이겼습니다.” 이 셋 중에 한가지가 출력되도록 합니다.
가위: 0
바위: 1
보: 2
*/

// 컴퓨터가 무작위로 선택(0, 1, 2)
// 사용자: 0, 1, 2 중 입력

print("(가위: 0, 바위: 1, 보: 2)입력: ", terminator: "")
let comNum: Int = Int.random(in: 0...2)
let user: String = readLine()!

if let userNum = Int(user) {
    if 0...2~=userNum {
        if userNum == 0, comNum == 0 {
            print("무승부")
        } else if userNum == 0, comNum == 1 {
            print("패배")
        } else if userNum == 0, comNum == 2 {
            print("승리")
        }

        else if userNum == 1, comNum == 0 {
            print("승리")
        }
        else if userNum == 1, comNum == 1 {
            print("무승부")
        }
        else if userNum == 1, comNum == 2 {
            print("패배")
        }

        else if userNum == 2, comNum == 0 {
            print("패배")
        }
        else if userNum == 2, comNum == 1 {
            print("승리")
        }
        else if userNum == 2, comNum == 2 {
            print("무승부")
        }

    } else {
        print("0~2 사이의 값을 입력하세요")
    }
} else {
    print("숫자를 입력해주세요")
}

개선1

@main
struct Main {
    static func main() {
        let comNum: Int = Int.random(in: 0...2)

        print("(가위: 0, 바위: 1, 보: 2) 입력: ", terminator: "")
        
        // 안전한 입력 처리
        guard let userInput = readLine(), let userNum = Int(userInput), (0...2).contains(userNum) else {
            print("❌ 0~2 사이의 숫자를 입력하세요.")
            return
        }
        
        // 승패 판별 로직 (배열 활용)
        let resultMatrix = [
            ["무승부", "패배", "승리"],  // userNum == 0 (가위)
            ["승리", "무승부", "패배"],  // userNum == 1 (바위)
            ["패배", "승리", "무승부"]   // userNum == 2 (보)
        ]
        
        let result = resultMatrix[userNum][comNum]
        print("컴퓨터: \(comNum) → 결과: \(result)")
    }
}

개선2

@main
struct Main {
    static func main() {
        let comNum = Int.random(in: 0...2)  // 0: 가위, 1: 바위, 2: 보

        print("(가위: 0, 바위: 1, 보: 2) 입력: ", terminator: "")

        // 안전한 입력 처리
        guard let userInput = readLine(), let userNum = Int(userInput), (0...2).contains(userNum) else {
            print("❌ 0~2 사이의 숫자를 입력하세요.")
            return
        }

        print("컴퓨터: \(comNum), 사용자: \(userNum)")

        // 승패 판별 로직 (switch 문 활용)
        switch (userNum, comNum) {
        case let (u, c) where u == c:
            print("무승부")
        case (0, 1), (1, 2), (2, 0):  // 사용자가 졌을 경우
            print("패배")
        case (0, 2), (1, 0), (2, 1):  // 사용자가 이긴 경우
            print("승리")
        default:
            print("오류 발생")
        }
    }
}

연습문제2

/*
컴퓨터가 1부터 10사이의 정수에서 랜덤 값을 선택하고, 저장하 도록 합니다. 그리고 당신은 1부터 10사이의 정수를 선택합니다.
컴퓨터가 선택한 랜덤값과 당신의 값을 비교하고 당신의 숫자가 더 높은 경우는 “Down”, 당신의 숫자가 더 낮은 경우는 “Up”, 당신의 숫자와 동일한 경우 “Bingo”가 출력되도록 합니다.
*/

while true {
    print("1부터 10 사이 원하는 숫자를 입력하세요(힌트: \(comNum)): ", terminator: "")
    let userNum = readLine()!

    if let userNum = Int(userNum) {
        // if !(0...10).contains(userNum) {}

        /*
         switch userNum {
         case let x where !(0...10).contains(x):
         print("❌ 1부터 10 사이의 숫자를 입력하세요.")
         default:
         print("✅ 입력한 숫자: \(userNum)")
         }
         */

        /*
         switch userNum {
         case 0...10:
         // print("🎉 입력한 숫자: \(userNum), 컴퓨터 숫자: \(comNum)")
         default:
         print("❌ 1부터 10 사이의 숫자를 입력하세요.")
         }
         */

        switch userNum {
        case let x where x == comNum:
            print("Bingo")
            return
        case let x where x > comNum:
            print("Down")
        case let x where x < comNum:
            print("Up")
        default:
            print("❌ 1부터 10 사이의 숫자를 입력하세요.")
        }
    }
}

Leave a comment