페이지 불러오는 중
Java 프로그래밍의 핵심은 흐름을 제어하는 제어문과 이를 얼마나 효율적으로 관리하느냐에 달려 있습니다.
이번 포스팅에서는 조건문과 반복문의 기초를 실생활 비유로 풀이하고, Java 8에서 17로 이어지는 Switch 문의 진화와 코드 확장성을 고려한 설계 방식을 분석
조건문은 프로그램이 특정 상황에 맞춰 다른 동작을 수행하도록 만드는 분기점입니다.
반복문은 동일하거나 유사한 작업을 여러 번 수행해야 할 때 코드를 비약적으로 줄여줍니다.
분기문은 반복문이나 메서드의 실행 흐름을 강제로 바꾸는 역할을 합니다.
Java 버전이 올라감에 따라 제어문은 더욱 간결하고 안전한 형태로 발전했습니다. 특히 Switch 문의 변화는 코드의 가독성을 획기적으로 개선했습니다.
break를 명시해야 하며, 누락 시 다음 case가 실행되는 'fall-through' 위험이 있습니다.>) 연산자를 사용하여 코드가 간결해졌으며 break를 생략할 수 있습니다.// Java 8 방식
String grade;
switch (score / 10) {
case 10:
case 9:
grade = "A";
break;
default:
grade = "F";
}
// Java 17 방식 (Switch Expression)
String grade = switch (score / 10) {
case 10, 9 -> "A";
default -> "F";
};실무 환경에서는 단순히 제어문을 나열하는 것을 넘어, 로직을 메서드로 분리하고 변수의 유효 범위(Scope)를 제한하여 코드의 유지보수성을 높여야 합니다.
getGrade, getFeeByGroup)로 분리하면 메인 로직의 흐름이 한눈에 들어옵니다.private static final과 같은 상수를 활용하여 매직 넘버(의미를 알 수 없는 숫자)를 제거하고, 데이터의 오염을 방지합니다.아래 코드는 Switch Expression과 메서드 분리 기술이 적용된 통합 예제입니다.
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class JavaControlFlowMaster {
private static final int FEE_ADULT = 10000;
private static final int FEE_TEEN = 7000;
private static final int FEE_CHILD = 5000;
private static final double WEEKEND_DISCOUNT_RATE = 0.8;
private static final int ALL_SAME_BONUS = 10000;
private static final int TWO_SAME_BONUS = 1000;
public static void main(String[] args) {
try (Scanner sc = new Scanner(System.in)) {
// 실행을 원하는 기능을 주석 해제하여 테스트
// gradingMethod(sc);
// calculateDicePoints(sc);
// calculateFee(sc);
}
}
// 성적 산출 (Java 17 Switch Expression 활용)
private static void gradingMethod(Scanner sc) {
System.out.print("점수를 입력하세요: ");
int score = sc.nextInt();
System.out.printf("당신의 성적은 %s 입니다.\n", getGrade(score));
}
private static String getGrade(int score) {
// 분기 로직을 별도 메서드로 분리하여 가독성 확보
return switch (score / 10) {
case 10, 9 -> "A";
case 8 -> "B";
case 7 -> "C";
case 6 -> "D";
default -> "F";
};
}
// 주사위 포인트 계산 (조건문 및 배열 활용)
private static void calculateDicePoints(Scanner sc) {
System.out.print("주사위 눈 3개를 입력하세요 : ");
int[] dice = {sc.nextInt(), sc.nextInt(), sc.nextInt()};
Arrays.sort(dice); // 정렬을 통해 비교 로직 단순화
int totalPoints = getScore(dice);
System.out.println("최종 포인트: " + totalPoints);
}
private static int getScore(int[] dice) {
// 다중 조건 처리를 위한 if-else 분기
if (dice[0] == dice[2]) {
return ALL_SAME_BONUS + dice[0] * 1000;
}
if (dice[0] == dice[1] || dice[1] == dice[2]) {
return TWO_SAME_BONUS + dice[1] * 100;
}
return dice[2] * 100;
}
// 놀이공원 요금 계산 (확장성 있는 구조)
private static void calculateFee(Scanner sc) {
System.out.print("나이를 입력하세요 : ");
int age = sc.nextInt();
System.out.print("요일을 입력하세요(월~일) : ");
String day = sc.next();
// 기능별로 쪼개진 메서드 호출로 메인 흐름을 명확하게 유지
String group = getGroup(age);
int baseFee = getFeeByGroup(group);
boolean isWeekend = isWeekend(day);
int finalFee = applyDiscount(baseFee, isWeekend);
System.out.printf("%s 요금입니다. %s\n", group, isWeekend ? "(주말 20% 할인 적용)" : "");
System.out.printf("최종 요금은 %d원 입니다.\n", finalFee);
}
private static String getGroup(int age) {
if (age >= 19) return "성인";
if (age >= 13) return "청소년";
return "어린이";
}
private static int getFeeByGroup(String group) {
return switch (group) {
case "성인" -> FEE_ADULT;
case "청소년" -> FEE_TEEN;
default -> FEE_CHILD;
};
}
private static boolean isWeekend(String day) {
List<String> weekends = List.of("토", "일", "토요일", "일요일");
return weekends.contains(day);
}
private static int applyDiscount(int fee, boolean isWeekend) {
if (isWeekend) return (int) (fee * WEEKEND_DISCOUNT_RATE);
return fee;
}
}
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.