3.4 조건문과 반복문 활용 예제 – 중첩 반복문, 다중 분기 활용한 간단한 알고리즘 구현 (하이로우 게임)
💡 조건문과 반복문만으로도 이렇게 재미있는 게임을 만들 수 있다고요? 간단한 제어문 몇 줄로 실습 가능한 ‘하이로우 게임’ 예제로, 알고리즘 사고력을 기를 수 있습니다!
안녕하세요, 자바 프로그래밍을 배우고 있는 예비 개발자 여러분! 오늘은 지금까지 배운 조건문과 반복문을 활용해서 직접 동작하는 미니 프로그램을 만들어보는 실전 예제를 다뤄볼 거예요. 바로 ‘하이로우(High-Low) 숫자 맞추기 게임’이라는 간단한 알고리즘 프로그램인데요. 이 게임을 통해 중첩 반복문과 다중 분기 구조를 어떻게 구현할 수 있는지 자연스럽게 익힐 수 있어요. 단순한 이론만으로는 이해하기 어려웠던 조건/반복 흐름 제어를 예제 중심으로 확실히 다지고 가봅시다!
목차
1. 하이로우 게임이란?
혹시 하이로우(High-Low) 게임을 들어본 적 있나요? 이 게임은 컴퓨터가 랜덤으로 선택한 숫자를 맞히는 간단한 숫자 추리 게임이에요. 사용자는 숫자를 입력하고, 컴퓨터는 그 숫자가 정답보다 높은지(HIGH), 낮은지(LOW), 혹은 정답인지(CORRECT)를 알려주는 구조예요. 이 과정을 반복하다 보면, 어느 순간 정답을 맞히게 되죠!
이 게임이 왜 자바 입문자에게 도움이 될까요? 바로 조건문과 반복문의 핵심 구조가 자연스럽게 녹아 있는 예제이기 때문이에요. 프로그램의 흐름 제어, 사용자 입력 처리, 반복 조건 설정, 종료 조건 판단 등 기본 로직을 모두 실습할 수 있죠.
🎮 하이로우 게임의 기본 규칙
- 컴퓨터는 1부터 100 사이의 정수를 무작위로 선택한다.
- 사용자는 숫자를 입력하며 정답을 추리한다.
- 입력한 숫자가 정답보다 크면 "HIGH", 작으면 "LOW", 같으면 "CORRECT"를 출력한다.
- 정답을 맞히면 게임은 종료된다.
📌 이 예제를 통해 배울 수 있는 핵심 개념
학습 개념 | 내용 |
---|---|
조건문 | 입력값이 정답보다 큰지/작은지를 판단하는 분기 처리 |
반복문 | 정답을 맞힐 때까지 반복 입력 받기 |
무작위 값 생성 | Random 클래스를 이용한 난수 생성 |
사용자 입력 | Scanner 클래스를 이용한 키보드 입력 처리 |
이렇게 보면 단순한 게임처럼 보이지만, 이 안에는 우리가 배운 거의 모든 제어문 개념이 다 들어있죠. 조건문, 반복문, 사용자 입력, 난수 처리까지... 이 하나의 예제로도 자바의 기본기를 꽉 잡을 수 있어요!
2. 게임 알고리즘 설계
하이로우 게임을 직접 구현하기 전에 먼저 어떤 알고리즘 흐름으로 만들지 설계해보는 것이 중요합니다. 설계 없이 코드를 작성하면 흐름이 꼬이기 쉽고, 디버깅도 어려워지거든요. 😰
🔄 전체 게임 흐름 요약
- 1부터 100 사이의 무작위 정수를 생성한다.
- 정답을 맞힐 때까지 반복문을 수행한다.
- 사용자에게 숫자를 입력받는다.
- 입력한 숫자와 정답을 비교한다.
- 비교 결과에 따라 HIGH / LOW / CORRECT 중 하나를 출력한다.
- 정답을 맞히면 반복문을 종료하고 축하 메시지를 출력한다.
🧠 알고리즘 구조 시각화
아래처럼 간단한 흐름도로 시각화해 보면 이해가 훨씬 쉬워져요!
[시작]
↓
무작위 숫자 생성(Random)
↓
반복문 시작 (정답 아닐 때까지)
↓
사용자 입력 받기
↓
숫자 비교하기
↓
[입력 > 정답] → "HIGH"
[입력 < 정답] → "LOW"
[입력 == 정답] → "CORRECT"
↓
정답이면 반복 종료
↓
[게임 종료]
💬 알고리즘 설계 시 체크 포인트
- 난수 생성은 단 한 번만! 반복문 안에서 생성하면 게임이 진행되지 않아요.
- 사용자가 입력한 값과 정답의 비교는 if ~ else if ~ else 구조로 처리하세요.
- 반복문 조건은
정답을 맞히지 않은 동안
을 기준으로 해야 무한 루프를 방지할 수 있어요.
지금까지 살펴본 알고리즘 설계를 기반으로, 다음 단계에서는 중첩 반복문을 활용해 게임 루프를 본격 구현해볼 거예요. 자, 이제 코딩의 세계로 들어가볼까요? 😎
3. 중첩 반복문으로 게임 루프 구성하기
게임에서는 사용자가 정답을 맞힐 때까지 계속해서 숫자를 입력하게 되죠. 이런 반복적인 과정을 반복문으로 구성하는 게 핵심이에요. 여기서 중첩 반복문은 필수는 아니지만, 게임 재시작 기능을 구현하려면 반복문을 한 번 더 감싸야 합니다!
♻️ 외부 루프: 게임 반복 여부 확인
게임이 끝난 후 "다시 하시겠습니까?"를 묻는 기능을 구현하려면 do-while
혹은 while
루프로 전체 게임 실행 구조를 한 번 감싸야 해요. 이렇게 하면 사용자가 'n'을 입력할 때까지 계속해서 새로운 게임이 시작됩니다.
🔁 내부 루프: 정답 맞힐 때까지 반복
while
문을 활용하여 사용자가 정답을 맞힐 때까지 반복적으로 숫자를 입력받는 구조로 작성합니다. 핵심은 사용자가 정답을 맞힐 때까지 반복 조건이 유지되어야 하며, 정답을 맞히면 break
를 사용하거나 조건을 변경해 반복을 종료해야 해요.
📌 반복문 구조 예시
Scanner scanner = new Scanner(System.in);
String restart;
do {
int answer = (int)(Math.random() * 100) + 1;
int guess = 0;
while (guess != answer) {
System.out.print("숫자를 입력하세요 (1~100): ");
guess = scanner.nextInt();
if (guess > answer) {
System.out.println("HIGH");
} else if (guess < answer) {
System.out.println("LOW");
} else {
System.out.println("CORRECT! 축하합니다 🎉");
}
}
System.out.print("다시 하시겠습니까? (y/n): ");
restart = scanner.next();
} while (restart.equalsIgnoreCase("y"));
위 코드처럼 반복문의 바깥에 do-while
루프를 두고, 내부에서는 while
로 정답을 맞히는 루프를 구성하면 전체 게임 재시작 기능까지 구현할 수 있어요. 코드를 실행하면서 구조를 직접 느껴보세요!
루프 종류 | 설명 |
---|---|
do-while | 게임을 최소 1회 실행 후, 사용자의 입력에 따라 다시 실행 여부 판단 |
while | 정답을 맞힐 때까지 입력 반복 |
중첩 반복문 구조에 익숙해지면 다양한 게임 로직이나 메뉴 기반 프로그램도 쉽게 만들 수 있어요. 다음 단계에서는 다중 조건문으로 정답 판단을 좀 더 세밀하게 구현해볼게요!
4. 다중 분기로 정답 판단하기
게임에서 입력한 숫자가 정답보다 큰지, 작은지, 아니면 같은지를 비교하는 건 필수적인 로직이죠. 이때 사용하는 조건문은 if ~ else if ~ else
또는 switch
문이 대표적입니다. 다만, 이번 예제처럼 비교가 필요한 경우엔 if 조건문이 더 유리합니다.
⚖️ 조건 판단 구조 구성하기
if (guess > answer) {
System.out.println("HIGH");
} else if (guess < answer) {
System.out.println("LOW");
} else {
System.out.println("CORRECT! 축하합니다!");
}
위 코드처럼 비교 구문을 세 단계로 나누면 사용자 입력에 대한 피드백을 정확하게 전달할 수 있어요. HIGH / LOW는 힌트 역할을 해주고, CORRECT는 게임 종료 신호입니다.
🎯 사용자 친화적인 메시지 설계
- 단순한 "HIGH" 대신 "입력한 숫자가 너무 큽니다." 같이 친절한 문구 사용
- CORRECT 시, 시도 횟수를 함께 출력해 성취감을 제공
💡 예제: 조건문 로직을 개선한 버전
int attempts = 0;
while (guess != answer) {
System.out.print("숫자를 입력하세요 (1~100): ");
guess = scanner.nextInt();
attempts++;
if (guess > answer) {
System.out.println("입력한 숫자가 너무 큽니다. ↓");
} else if (guess < answer) {
System.out.println("입력한 숫자가 너무 작습니다. ↑");
} else {
System.out.println("정답입니다! 시도 횟수: " + attempts + "번 🎉");
}
}
이처럼 조건문은 단순히 분기만 하는 게 아니라, 게임 UX의 핵심이 될 수 있어요. 사용자의 긴장을 높이거나, 피드백을 직관적으로 주기 위해 다양한 메시지를 넣어보세요!
조건문 유형 | 적합한 상황 |
---|---|
if ~ else if ~ else | 값의 범위에 따라 분기 처리할 때 |
switch | 정해진 값(case)에 따라 구분할 때 (비교 연산에는 부적합) |
정리하자면, 조건문은 단순한 흐름 제어를 넘어서서 게임의 핵심 로직을 완성하는 중심 축이에요. 다음 단계에서는 자바 전체 코드 예제를 완성하고 하나씩 뜯어보며 분석해볼 거예요. 기대되시죠? 😄
5. 자바로 구현한 예제 코드 분석
자, 이제 지금까지 배운 내용을 바탕으로 자바로 하이로우 게임을 완성해볼 차례입니다. 아래에 전체 코드를 정리했으니, 하나하나 살펴보며 어떤 구조로 동작하는지 분석해 봅시다!
🎮 전체 예제 코드
import java.util.Scanner;
public class HighLowGame {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String restart;
do {
int answer = (int)(Math.random() * 100) + 1;
int guess = 0;
int attempts = 0;
System.out.println("🎲 하이로우 게임에 오신 걸 환영합니다!");
System.out.println("1부터 100 사이의 숫자를 맞혀보세요!");
while (guess != answer) {
System.out.print("숫자 입력: ");
guess = scanner.nextInt();
attempts++;
if (guess > answer) {
System.out.println("입력한 숫자가 너무 큽니다. ↓");
} else if (guess < answer) {
System.out.println("입력한 숫자가 너무 작습니다. ↑");
} else {
System.out.println("🎉 정답입니다! 시도 횟수: " + attempts + "번");
}
}
System.out.print("다시 하시겠습니까? (y/n): ");
restart = scanner.next();
} while (restart.equalsIgnoreCase("y"));
System.out.println("게임을 종료합니다. 감사합니다!");
scanner.close();
}
}
🔍 주요 코드 분석 포인트
-
Math.random()
: 0 이상 1 미만의 실수를 반환. 정수로 바꾸기 위해(int)
형변환과 100 곱셈 후 1 더함. -
while (guess != answer)
: 정답을 맞히지 않은 동안 루프 반복. -
restart.equalsIgnoreCase("y")
: 대소문자 구분 없이 'y'일 경우 다시 실행.
📋 실행 결과 예시
🎲 하이로우 게임에 오신 걸 환영합니다!
1부터 100 사이의 숫자를 맞혀보세요!
숫자 입력: 50
입력한 숫자가 너무 작습니다. ↑
숫자 입력: 75
입력한 숫자가 너무 큽니다. ↓
숫자 입력: 63
🎉 정답입니다! 시도 횟수: 3번
다시 하시겠습니까? (y/n): n
게임을 종료합니다. 감사합니다!
이처럼 코드를 실행해보면 조건문, 반복문, 사용자 입력 처리 등 자바 기본기를 한 번에 복습할 수 있습니다. 특히 게임이라는 흥미로운 형식 덕분에 지루하지 않게 실습할 수 있다는 점이 정말 좋아요!
마지막 단계에서는 이 코드를 어떻게 더 확장하거나 응용할 수 있을지 함께 고민해봐요. 예를 들어 점수 시스템, 제한 시간, 힌트 기능 등으로 발전시킬 수도 있겠죠? 😊
6. 실전 연습 팁과 확장 아이디어
지금까지 하이로우 게임을 완성하고 구조까지 꼼꼼히 분석해보았어요. 그런데 여기서 끝내기엔 아쉽죠? 😉 이번엔 이 게임을 기반으로 실력을 더 확실히 다질 수 있도록 연습 팁과 응용 아이디어를 소개할게요!
🧪 실전 연습 Tip
- 입력값 유효성 검사 추가 – 1~100 이외의 숫자가 들어왔을 때 경고 출력하기
- 숫자 입력 시 예외 처리 – 문자열 입력으로 인한
InputMismatchException
방지 - 시도 횟수 제한 – 예: 최대 7번까지 입력 가능하도록 제한하고 실패 메시지 출력
🚀 확장 아이디어 (Level Up!)
아이디어 | 설명 |
---|---|
점수제 도입 | 시도 횟수에 따라 점수를 부여하고 최고 점수를 기록 |
난이도 설정 | Easy(1~50), Medium(1~100), Hard(1~200)처럼 난이도 선택 가능하게 구현 |
타이머 기능 | 시작부터 정답까지 걸린 시간을 출력하고, 제한 시간 초과 시 실패 처리 |
AI 힌트 제공 | 숫자 범위를 좁히는 힌트를 한두 번 제공하여 재미 요소 강화 |
🎯 실력 향상을 위한 추천 과제
- 하이로우 게임을 GUI로 만들어 보기 (JavaFX, Swing 등 활용)
- 난수를 숨기고 컴퓨터가 사용자 숫자를 맞추는 역하이로우 게임 구현
- 결과를 로그 파일로 저장하고 기록 분석 기능 추가
하이로우 게임은 그저 숫자를 맞히는 재미 이상의 가치가 있어요. 조건문, 반복문, 예외 처리, 사용자 인터페이스 등 자바의 핵심 문법을 종합적으로 활용하니까요. 이 작은 프로젝트 하나만으로도 여러분의 프로그래밍 실력은 눈에 띄게 향상될 거예요!
마무리하며: 단순한 예제에서 시작된 확실한 성장 📈
여러분, 여기까지 오시느라 정말 수고 많으셨어요! 😊 하이로우 게임이라는 단순한 프로젝트였지만, 그 안에는 조건문, 반복문, 사용자 입력 처리, 무작위 수 생성, 루프 종료 조건, 예외 처리 등 다양한 자바의 핵심 개념이 들어 있었죠. 이걸 직접 코드로 구현하고 실행해 보며 느끼는 학습 효과는 정말 강력하답니다.
중요한 건 이 예제가 끝이 아니라 시작이라는 점이에요. 여기에 기능을 더하거나 로직을 바꿔보는 연습을 하다 보면 어느새 더 복잡한 프로그램도 척척 만들 수 있게 되어 있을 거예요. 정답을 맞힐 때의 기쁨처럼, 여러분의 실력도 점점 더 정답에 가까워지고 있을 겁니다!
그럼 다음 장에서는 조건문과 반복문의 개념을 바탕으로 조금 더 복잡한 구조와 알고리즘 문제로 발전해볼게요. 여러분의 성장을 응원합니다! 💪🔥