Java 제어 흐름과 사용자 입력 처리

Scanner를 통한 사용자 입력 처리

Java에서 사용자로부터 입력을 받기 위해 java.util.Scanner 클래스를 활용할 수 있다. 주로 콘솔 환경에서 값을 읽어오는 데 사용되며, 다음 메서드들이 대표적이다.

  • next(): 공백을 기준으로 하나의 토큰만 인식한다. 즉, 공백 포함 문자열은 전부 수신하지 못한다.
  • nextLine(): 현재 줄의 남은 모든 내용을 읽으며, 개행 문자(Enter)를 종료 조건으로 본다. 공백을 포함한 전체 문장을 받을 때 적합하다.

입력 여부를 사전에 확인하고 싶을 경우, 아래 조건 검사 메서드를 사용하는 것이 좋다.

  • hasNext(): 다음 토큰 존재 여부 확인 (공백 기준)
  • hasNextLine(): 다음 줄 존재 여부 확인

이러한 검사는 특히 반복적인 입력 처리나 파일 스트림에서 유용하며, 예외를 방지하는 데 도움이 된다.

Scanner inputReader = new Scanner(System.in);

while (inputReader.hasNext()) {
    String data = inputReader.next();
    System.out.println("입력된 값: " + data);
}

inputReader.close(); // 리소스 누수 방지를 위해 반드시 닫기

순차 구조

기본적인 실행 흐름으로, 코드가 위에서 아래로 한 줄씩 순서대로 실행되는 방식이다. 특별한 제어문 없이 작성된 프로그램은 모두 이 순차 구조를 따른다.

조건 제어 - 선택 구조

실행 흐름을 조건에 따라 분기시키는 방법으로, 다양한 형태가 있다.

단일 if문

int value = 8;
if (value % 2 == 0) {
    System.out.println("값은 짝수입니다.");
}

if-else문

int score = 75;
if (score >= 60) {
    System.out.println("합격");
} else {
    System.out.println("불합격");
}

다중 if-else-if 문

int temperature = 0;
if (temperature > 0) {
    System.out.println("날씨가 따뜻합니다.");
} else if (temperature < 0) {
    System.out.println("날씨가 춥습니다.");
} else {
    System.out.println("빙점입니다.");
}

switch문

JDK 7부터 문자열 비교가 가능해졌으며, 정수형(byte, short, int), 문자형(char), 열거형(enum), String 타입을 지원한다.

String dayOfWeek = "수요일";
switch (dayOfWeek) {
    case "월요일":
        System.out.println("주 초반, 힘내세요!");
        break;
    case "수요일":
        System.out.println("주 중간입니다.");
        break;
    case "금요일":
        System.out.println("곧 주말!");
        break;
    default:
        System.out.println("알 수 없는 요일");
}

주의: 각 case 블록 끝에 break를 명시하지 않으면, 이후 case 문들이 연속해서 실행되는 '케이스 침투(case fall-through)' 현상이 발생한다.

반복 제어 - 반복 구조

반복적으로 코드를 실행해야 할 때 사용하는 제어문들이다.

while 루프

조건이 참인 동안 계속 실행된다. 최초 조건이 거짓이면 한 번도 실행되지 않을 수 있다.

int count = 1;
while (count <= 4) {
    System.out.println("반복 횟수: " + count);
    count++;
}

do-while 루프

최소 한 번은 블록 내 코드를 실행한 후 조건을 평가한다.

int index = 5;
do {
    System.out.println("현재 값: " + index);
    index--;
} while (index > 0);

for 루프

반복 횟수가 명확할 때 주로 사용되며, 초기화, 조건, 증감식을 한 줄에 표현할 수 있다.

for (int i = 0; i < 3; i++) {
    System.out.println("카운트: " + i);
}

향상된 for문 (Enhanced for loop)

배열이나 컬렉션의 요소를 순차적으로 접근할 때 편리하다.

int[] numbers = {10, 20, 30};
for (int num : numbers) {
    System.out.println("값: " + num);
}

제어 흐름 조작: break, continue, label

  • break: 반복문 또는 switch 문을 즉시 종료한다.
  • continue: 현재 반복 회차를 중단하고 다음 반복으로 넘어간다.
  • label: Java에는 goto 키워드가 없지만, 라벨을 붙여 특정 블록으로 점프하는 것이 가능하다. 다만 가독성을 해칠 수 있으므로 권장되지는 않는다.
outerLoop:
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (i == 1 && j == 1) {
            break outerLoop; // 외부 루프까지 종료
        }
        System.out.println("i=" + i + ", j=" + j);
    }
}

소스 코드 분석 습관 들이기

내장 클래스나 라이브러리의 동작 원리를 이해하려면 소스 코드를 직접 살펴보는 것이 중요하다.

  • IDE(예: IntelliJ IDEA)에서 클래스 이름 위에 커서를 올리고 Ctrl + 클릭하면 소스로 이동할 수 있다.
  • 소스가 제공되지 않은 경우(.class 파일만 있는 경우), IDE가 자동으로 디컴파일하여 보여준다.
  • 디컴파일된 코드는 실제 소스와 다를 수 있으나, 핵심 로직 파악에는 충분하다.

태그: java 제어 흐름 Scanner 반복문 조건문

6월 28일 17:27에 게시됨