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가 자동으로 디컴파일하여 보여준다.
- 디컴파일된 코드는 실제 소스와 다를 수 있으나, 핵심 로직 파악에는 충분하다.