카테고리 없음
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+ 옵셔널 체이닝 | ✓ |
※ 참고사항:
- Java의 Label 제어는 루프 제어에 주로 사용
- JavaScript의 Label은 존재하나 실제 사용은 드묾
- Java의 향상된 switch와 패턴 매칭은 최신 버전에서 지원
- 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. 성능 최적화 팁
- 조건문 순서 최적화
// 빈도가 높은 조건을 먼저 체크
if (commonCase) { // 자주 발생하는 케이스
// 처리
} else if (rareCase) { // 드문 케이스
// 처리
}
- switch문 활용
// 많은 조건 분기가 있을 때는 if-else보다 switch 선호
switch (value) {
case 1: return "One";
case 2: return "Two";
default: return "Unknown";
}
주요 주의사항
- Java
- 항상 명시적인 boolean 조건 사용
- switch문의 break 필수
- 타입 안전성 보장
- null 체크 필수
- JavaScript
- truthy/falsy 값 이해 필요
- 타입 변환 주의
- === 사용 권장
- 옵셔널 체이닝 활용