1. 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+ 옵셔널 체이닝 |
|
✓ |
※ 참고사항:
- Java의 Label 제어는 루프 제어에 주로 사용
- JavaScript의 Label은 존재하나 실제 사용은 드묾
- Java의 향상된 switch와 패턴 매칭은 최신 버전에서 지원
- JavaScript의 async/await는 비동기 처리를 위한 특수 조건문
2. 2. if문 상세 비교
if (condition) {
} else if (anotherCondition) {
} else {
}
if (condition) {
} 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. 3. switch문 상세 비교
switch (value) {
case 1:
break;
case 2:
break;
default:
}
switch (value) {
case "string":
break;
case 42:
break;
default:
}
1. switch문 비교표
특징 |
Java |
JavaScript |
지원 타입 |
byte, short, char, int, enum, String |
모든 타입 |
case 값 |
상수만 가능 |
모든 표현식 가능 |
break 문 |
필수 (없으면 fall-through) |
선택적 |
case 합치기 |
Java 12+ arrow syntax 지원 |
comma로 구분 |
표현식 반환 |
Java 12+ 가능 |
return 필요 |
동적 case |
불가능 |
가능 |
2. 추가적인 고려 사항(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 문처럼 단순 분기 처리용으로 사용하는 것도 가능하다.
String result;
switch(value) {
case 1:
result = "ONE";
break;
case 2:
result = "TWO";
break;
default:
result = "OTHER";
break;
}
String result = switch(value) {
case 1 -> "ONE";
case 2 -> "TWO";
default -> "OTHER";
};
4. 4. 삼항 연산자 비교
String result = (condition) ? "true" : "false";
String result = (a > b) ? "a가 크다" :
(a < b) ? "b가 크다" : "같다";
let result = condition ? "true" : "false";
let result = condition
? (x = 1, y = 2, "true")
: (x = 0, y = 0, "false");
1. 삼항 연산자 비교표
특징 |
Java |
JavaScript |
중첩 사용 |
가능하나 권장하지 않음 |
자유롭게 가능 |
다중 표현식 |
단일 표현식만 가능 |
콤마 연산자로 다중 표현식 가능 |
반환 타입 |
동일한 타입이어야 함 |
다른 타입 가능 |
null 처리 |
명시적 처리 필요 |
단축 평가 가능 |
5. 5. while/do-while 비교
while (condition) {
}
do {
} while (condition);
while (condition) {
}
do {
} while (condition);
1. while/do-while 비교표
특징 |
Java |
JavaScript |
조건식 |
boolean만 가능 |
truthy/falsy 값 |
변수 스코프 |
블록 스코프 |
함수/블록 스코프 |
break/continue |
레이블 지원 |
레이블 지원 |
무한 루프 |
while(true) |
while(true) 또는 while(1) |
6. 6. 실무 활용 패턴
1. 널 체크 패턴
Optional.ofNullable(value)
.map(v -> v.toString())
.orElse("default");
const result = value ?? "default";
2. 조건부 실행 패턴
if (debug) {
logger.debug("디버그 메시지");
}
debug && console.log("디버그 메시지");
7. 7. 성능 최적화 팁
- 조건문 순서 최적화
if (commonCase) {
} else if (rareCase) {
}
- switch문 활용
switch (value) {
case 1: return "One";
case 2: return "Two";
default: return "Unknown";
}
8. 주요 주의사항
- Java
- 항상 명시적인 boolean 조건 사용
- switch문의 break 필수
- 타입 안전성 보장
- null 체크 필수
- JavaScript
- truthy/falsy 값 이해 필요
- 타입 변환 주의
- === 사용 권장
- 옵셔널 체이닝 활용