카테고리 없음

Java와 JavaScript 제어문(조건문, 반복문) 비교

lamarcK 2025. 4. 30. 19:30

1. Java와 JavaScript 제어문 비교표

구분 제어문 유형 Java JavaScript
공통 기본 조건문 if
if-else
if-else if-else
switch-case
삼항 연산자 (? :)
while
do-while
for
try-catch-finally
instanceof
Java 전용 switch expression  
Enhanced for (for-each)
synchronized 블록
assert
Label 제어 (보편적)
JavaScript 전용 for...in  
for...of
널 병합 연산자 (??)
옵셔널 체이닝 (?.)
단축 평가 (&&, ∥)
async/await
Promise 체이닝
Label 제어 (제한적)
버전별 특징 Java 12+ switch 표현식  
Java 16+ 패턴 매칭  
ES2020+ 널 병합 연산자  
ES2020+ 옵셔널 체이닝  

※ 참고사항:

  1. Java의 Label 제어는 루프 제어에 주로 사용
  2. JavaScript의 Label은 존재하나 실제 사용은 드묾
  3. Java의 향상된 switch와 패턴 매칭은 최신 버전에서 지원
  4. JavaScript의 async/await는 비동기 처리를 위한 특수 조건문

2. if문 상세 비교

// Java
if (condition) {  // condition은 반드시 true/false
    // 코드 블록
} else if (anotherCondition) {
    // 코드 블록
} else {
    // 코드 블록
}
// JavaScript
if (condition) {  // condition은 truthy/falsy 값으로 평가
    // 코드 블록
} else if (anotherCondition) {
    // 코드 블록
} else {
    // 코드 블록
}
특징 Java JavaScript
조건식 타입 boolean만 허용 모든 타입 허용 (truthy/falsy)
중괄호 생략 한 줄일 때 가능하나 권장하지 않음 한 줄일 때 가능
블록 스코프 엄격한 블록 스코프 let/const는 블록 스코프, var는 함수 스코프
조건 평가 엄격한 boolean 평가 느슨한 형변환 후 평가
null 체크 명시적 null 체크 필요 falsy 값으로 자동 처리
  • falsy : false, 0, -0, 0n, "", null, undefined, NaN
    • 0n은 BigInt zero라고 해서 빅인트 타입의 0을 뜻함
  • truthy : falsy가 아닌 모든 것들

3. switch문 상세 비교

// Java의 switch문은 제한된 타입만 사용 가능
switch (value) {
    case 1:  // 상수만 가능
        // 코드
        break;  // break 필수
    case 2:
        // 코드
        break;
    default:
        // 코드
}
// JavaScript의 switch문은 모든 타입 사용 가능
switch (value) {
    case "string":  // 문자열 가능
        // 코드
        break;  // break 선택적
    case 42:  // 숫자 가능
        // 코드
        break;
    default:
        // 코드
}

switch문 비교표

특징 Java JavaScript
지원 타입 byte, short, char, int, enum, String 모든 타입
case 값 상수만 가능 모든 표현식 가능
break 문 필수 (없으면 fall-through) 선택적
case 합치기 Java 12+ arrow syntax 지원 comma로 구분
표현식 반환 Java 12+ 가능 return 필요
동적 case 불가능 가능

추가적인 고려 사항(switch expressions)

  • 자바의 switch 문은 기본적으로 각각의 case 절에 break;를 추가해서 의도적으로 case를 종료해야만 했다.
  • 만약 switch문에서 break를 사용하지 않으면 "fall through" 현상이 발생한다.
  • 즉, 해당 case가 끝나도 다음 case로 계속 실행이 되는 것이다.

하지만 ES2015+ 에서는 switch expressions이라는 새로운 문법이 도입되어 break 없이도 안전하게 사용할 수 있게 되었는데 switch expressions은 새로운 문법이라 사용 방식이 좀 다르다. expressions(표현식)이라는 것에서 알 수 있듯 기존의 함수 표현식처럼 화살표를 사용하는 문법이다.

 

switch expressions로 작성된 경우 화살표(->) 구문을 사용하며, 별도의 break 문이 없어도 각 case의 코드 실행 후 자동으로 해당 절을 종료한다.

또한 switch expressions는 식(expression)으로 사용될 수 있어, 스위치문의 결과를 직접 변수에 할당할 수 있다. 기존에는 변수를 먼저 선언하고 switch 문 내부에서 값을 할당해야 했던 것과 달리, 스위치문 전체를 하나의 식으로 처리할 수 있게 되었다.

물론 기존 switch 문처럼 단순 분기 처리용으로 사용하는 것도 가능하다.

// 기존 switch문 방식
String result;  // 먼저 변수 선언
switch(value) {
    case 1:
        result = "ONE";
        break;
    case 2:
        result = "TWO";
        break;
    default:
        result = "OTHER";
        break;
}
// result 사용
// 새로운 switch expressions
String result = switch(value) {  // 직접 할당 가능
    case 1 -> "ONE";
    case 2 -> "TWO";
    default -> "OTHER";
};

4. 삼항 연산자 비교

// Java는 단일 표현식만 가능
String result = (condition) ? "true" : "false";

// 중첩 가능하지만 가독성 떨어짐
String result = (a > b) ? "a가 크다" : 
                (a < b) ? "b가 크다" : "같다";
// JavaScript는 더 유연한 사용 가능
let result = condition ? "true" : "false";

// 다중 표현식 가능
let result = condition 
    ? (x = 1, y = 2, "true") 
    : (x = 0, y = 0, "false");

삼항 연산자 비교표

특징 Java JavaScript
중첩 사용 가능하나 권장하지 않음 자유롭게 가능
다중 표현식 단일 표현식만 가능 콤마 연산자로 다중 표현식 가능
반환 타입 동일한 타입이어야 함 다른 타입 가능
null 처리 명시적 처리 필요 단축 평가 가능

5. while/do-while 비교

// Java
while (condition) {  // boolean 조건만 가능
    // 코드
}

do {
    // 코드
} while (condition);
// JavaScript
while (condition) {  // truthy/falsy 값 가능
    // 코드
}

do {
    // 코드
} while (condition);

while/do-while 비교표

특징 Java JavaScript
조건식 boolean만 가능 truthy/falsy 값
변수 스코프 블록 스코프 함수/블록 스코프
break/continue 레이블 지원 레이블 지원
무한 루프 while(true) while(true) 또는 while(1)

6. 실무 활용 패턴

널 체크 패턴

// Java
Optional.ofNullable(value)
        .map(v -> v.toString())
        .orElse("default");
// JavaScript
const result = value ?? "default";

조건부 실행 패턴

// Java
if (debug) {
    logger.debug("디버그 메시지");
}
// JavaScript
debug && console.log("디버그 메시지");

7. 성능 최적화 팁

  1. 조건문 순서 최적화
// 빈도가 높은 조건을 먼저 체크
if (commonCase) {  // 자주 발생하는 케이스
    // 처리
} else if (rareCase) {  // 드문 케이스
    // 처리
}
  1. switch문 활용
// 많은 조건 분기가 있을 때는 if-else보다 switch 선호
switch (value) {
    case 1: return "One";
    case 2: return "Two";
    default: return "Unknown";
}

주요 주의사항

  1. Java
    • 항상 명시적인 boolean 조건 사용
    • switch문의 break 필수
    • 타입 안전성 보장
    • null 체크 필수
  2. JavaScript
    • truthy/falsy 값 이해 필요
    • 타입 변환 주의
    • === 사용 권장
    • 옵셔널 체이닝 활용