Semantic Error와 Syntax Error

2025. 4. 23. 10:24JAVA/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