2025. 4. 23. 10:24ㆍJAVA/JAVA 실행 원리
📕 Semantic Error와 Syntax Error란?
📖 Semantic Error
시멘틱(Semantic) = 의미(Meaning)으로 시멘틱 에러는 "의미상의 오류", " 논리적 오류"라고도 불린다.
컴파일은 성공하지만, 프로그램이 논리적으로 틀린 결과를 낼 때 발생한다.
컴퓨터는 문법만 맞으면 실행하기 때문에, 사람의 의도와 다른 동작이 되어도 오류라고 인식 하지 못한다.
📖 Syntax Error
신텍스 에러는 프로그래밍 언어에서 "문법 규칙을 위반"했을 때 발생하는 오류다.
이는 컴파일러나 인터프리터가 코드를 해석할 수 없음을 의미하며,
프로그램이 실행되기 전에 이러한 오류를 수정해야 한다.
📄 Semantic Error
❗ 왜 시멘틱 에러가 무서운가?
| 이유 | 설명 |
| 컴파일러가 감지 못함 | 문법은 맞기 때문에 오류 메시지가 없음 |
| 테스트 없으면 놓치기 쉬움 | 실행이 되기 때문에 결과를 직접 확인하지 않으면 모름 |
| 개발자의 의도와 관련됨 | 정확히 어떤 행동을 의도했는지 코드는 말해주지 않음 |
| 디버깅이 오래 걸림 | 코드가 돌아가긴 하니까 오류 위치를 추적하기 어려움 |
🔨 시멘틱 에러를 줄이려면?
| 명확한 변수명과 함수명 사용 | x, y같은 이름 대신 totalPrice, userAge 같은 의도를 드러내는 이름 사용 |
| 테스트 케이스 작성 | 다양한 입력에 대한 예상 결과와 실제 결과 비교 |
| 코드 리뷰 받기 | 다른 개발자의 눈으로 봐야 의미 오류를 더 쉽게 발견 가능 |
| 디버깅과 로깅 활용 | 중간 중간 print()나 logger.debug() 등으로 상태 확인 |
❓ 시멘틱 오류의 예제
1. 잘못된 연산 사용
public class Add {
static int a = 5;
static int b = 7;
static int result = a - b; // 의도는 덧셈인데 뺄셈을 해버림
public static void main(String[] args) {
System.out.println("Sum: " + result); // 결과 -2 (의도는 12)
}
}
✅ 수정
public class Add {
static int a = 5;
static int b = 7;
static int result = a + b; // 의도에 맞는 연산자로 변경
public static void main(String[] args) {
System.out.println("Sum: " + result);
}
}
2. 변수 의미 착오
변수 이름은 맞는 것처럼 보이지만, 그 안에 담긴 값이 실제로는 다른 의미를 가지거나, 개발자가 착각해서 잘못 사용하는 경우를 말한다.
public class Main {
public static void main(String[] args) {
double price = 100.0;
double discountRate = 0.1;
// ❌ 변수명은 '할인된 가격'이지만, 실제는 '할인 금액'
double discountedPrice = price * discountRate;
System.out.println("최종 결제 금액: " + discountedPrice); // 출력: 10.0 ← 잘못된 출력
}
}
✅ 수정
double discount = price * discountRate;
double finalPrice = price - discount;
System.out.println("결제 금액: " + finalPrice); // 출력: 90.0
3. 논리 조건 실수
시멘틱 오류 중에서도 아주 흔한 유형이며, 특히 if 문, while문, 조건식 작성할 때 많이 생긴다.
public class Main {
public static void main(String[] args) {
int age = 17;
// ❌ 실수: age > 19은 성인 조건
if (age > 19) { // 20세 이상이라는 의미
System.out.println("미성년자입니다.");
}
}
}
✅ 수정
if (age < 18) { // 부등호 방향 변경
System.out.println("미성년자입니다.");
}
4. 루프 조건 오류
반복문은 for, while, do-while 등으로 구성되는데,
반복 횟수나 종료 조건을 잘못 작성하면 원래 의도와 다르게 반복되거나 무한 루프에 빠지게 된다.
📘 for문 예제 (끝 값 포함 실수)
public class Main {
public static void main(String[] args) {
// 1부터 10까지 출력하고 싶음
for (int i = 1; i < 10; i++) {
System.out.println(i); // ❌ 출력: 1~9만 나옴
}
}
}
💥 문제점 : i < 10 → i 가 10일 때는 실행 안 됨!!
✅ 수정
for (int i = 1; i <= 10; i++) { // for문의 부등호를 <= 로 수정
System.out.println(i); // ✅ 출력: 1~10
}
📘 while문 예제 (증감식 오류로 무한 루프)
public class Main {
public static void main(String[] args) {
int i = 0;
while (i < 5) {
System.out.println("i = " + i);
// ❌ i가 증가하지 않아서 무한 반복됨
}
}
}
✅ 수정
while (i < 5) {
System.out.println("i = " + i);
i++; // ✅ 반드시 증가시켜야 종료됨
}
📘 조건문 방향 실수
public class Main {
public static void main(String[] args) {
// 숫자를 5부터 1까지 출력하려 함
for (int i = 5; i < 1; i--) {
System.out.println(i); // ❌ 실행 안 됨
}
}
}
💥 문제점 : i = 5인데 조건이 i < 1 → 애초에 조건이 false라 한 번도 실행 안 됨
✅ 수정
for (int i = 5; i >= 1; i--) {
System.out.println(i); // ✅ 출력: 5 ~ 1
}
📄 Syntax Error
| 항목 | 설명 |
| 의미 | 문법 오류 |
| 컴파일 여부 | 컴파일 불가능(바로 에러 발생) |
| 실행 여부 | 실행도 안 됨 |
| 발생 위치 | 코드 작성 중, 또는 컴파일 단계에서 바로 발견 |
❓ 신텍스 오류의 예제
1. 세미 콜론(;) 누락
public class Person {
int age = 10 // Syntax error, insert ";" to complete ClassBodyDeclarations
// 신텍스 에러 발생
}
✅ 수정
public class Person {
int age = 10 ; // ← 세미콜론 추가
}
2. 괄호 누락
public static void main(String[] args { // Syntax error, insert ")" to complete MethodDeclaration
System.out.println("Hello");
// ← } 빠짐 Syntax error, insert "}" to complete ClassBody
✅ 수정
public static void main(String[] args) { // ← ) 괄호 추가
System.out.println("Hello");
} // ← } 추가
3. 잘못된 변수 선언
public class Number {
int 1stNumber = 10; // 숫자로 시작하는 변수 이름 ❌
// Syntax error on token "1", delete this token
}
✅ 수정
public class Number {
int stNumber = 10; // ← 1 삭제
}
4. 자바 예약어(keyword) 사용
public class Number {
int class = 10; // 'class'는 Java 예약어
// Syntax error on token "class", invalid VariableDeclaratorId
}
❔ 예약어란? ❔
자바언어에서 특별한 의미를 가지기 때문에, 개발자가 변수나 함수 이름으로 사용할 수 없는 단어
✅ 수정
public class Number {
int classNumber = 10; // 변수명 변경
}
🎯 정리 🎯
| 항목 | 신텍스 에러(Syntax Error) | 시멘틱 에러(Semantic Error) |
| 의미 | 문법 오류 | 의미/ 논리 오류 |
| 발견 시점 | 컴파일 타임 | 런타임 or 테스트 중 |
| 컴파일 | ❌ 실패 | ✅ 성공 |
| 실행 | ❌ 불가능 | ✅ 가능 (하지만 결과가 잘못됨) |
| 원인 | 문법 규칙 위반 | 개발자가 의도와 코드의 의미 불일치 |
| 수정 방법 | 문법 고치기 | 로직/의도 다시 설계 |
🔹 Syntax Error: “컴퓨터가 이해를 못함” → 말이 안 되는 코드
🔹 Semantic Error: “컴퓨터는 이해했지만, 뜻이 틀림” → 말은 되지만 잘못된 코드
'JAVA > JAVA 실행 원리' 카테고리의 다른 글
| Fully Qualified Name (1) | 2025.04.30 |
|---|---|
| String (1) | 2025.04.30 |
| 2의 보수 (0) | 2025.04.16 |
| JVM(자바 가상 머신) (0) | 2025.03.28 |
| 컴파일러(Compiler) (0) | 2025.03.28 |