✅ 컴파일 에러 (Compile-Time Error)
🔽 특징
- 코드 작성 후 컴파일 과정에서 발생하는 에러로, 코드가 실행되기 전에 발견된다.
- 주로 구문 에러(Syntax Error)나 타입 에러(Type Error)가 포함된다.
🔽 예시
int number = "Hello"; // 타입 불일치
🔽 해결 방법
- 컴파일러가 제공하는 에러 메시지를 읽는다.
- 코딩 시, IDE의 실시간 문법 검사 기능을 활용한다. (예: IntelliJ, Eclipse)
✅ 런타임 에러 (Runtime Error)
🔽 특징
- 코드가 컴파일에는 성공했지만 실행 중에 발생하는 에러이다.
- 주로 NullPointerException, IndexOutOfBoundsException과 같은 예외 상황이 포함된다.
🔽 예시
int[] array = {1, 2, 3};
System.out.println(array[5]); // ArrayIndexOutOfBoundsException 발생
🔽 해결 방법
- 실행 중 에러가 발생한 위치와 원인을 파악한다.
- try-catch와 같은 예외 처리를 통해 예상치 못한 상황을 방지한다.
✅ 논리 에러 (Logical Error)
🔽 특징
- 컴파일과 실행이 모두 성공하지만, 예상한 결과가 나오지 않는 상황이다.
- 주로 알고리즘 설계나 로직에서의 실수로 발생한다.
🔽 예시
int a = 5;
int b = 10;
int sum = a - b; // 덧셈 대신 뺄셈 사용
System.out.println("Sum: " + sum); // 논리 오류
🔽 해결 방법
- 디버거를 사용하여 코드의 흐름을 한 단계씩 확인한다.
- 테스트 코드를 통해 로직을 검증한다.
✅ 링킹 에러 (Linking Error)
🔽 특징
- 프로그램이 외부 파일이나 라이브러리를 연결하는 과정에서 발생하는 에러이다.
- 컴파일은 성공하지만 링커가 필요한 참조를 찾을 수 없을 때 발생한다.
🔽 예시
void exampleFunction(); // 선언만 하고 정의가 없음
int main() {
exampleFunction(); // 링킹 에러 발생
return 0;
}
🔽 해결 방법
- 필요한 라이브러리 또는 파일이 제대로 포함되었는지 확인한다.
- 빌드 설정을 점검한다.
✅ 파스 에러 (Parsing Error)
🔽 특징
- 소스 코드나 데이터의 구조가 예상과 다를 때 발생하는 에러이다.
- 주로 JSON, XML과 같은 데이터 포맷을 처리할 때 발생한다.
🔽 예시
String jsonString = "{name: 'Soeun', age: '22'}"; // JSON key에 쌍따옴표 누락
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.readTree(jsonString); // JSON 파싱 에러 발생
🔽 해결 방법
- 데이터 포맷이 올바른지 확인한다.
- JSON 파싱 시, 데이터 검증 도구를 활용한다.
✅ 부동소수점 연산 에러 (Floating Point Error)
🔽 특징
- 부동소수점 연산의 정밀도 한계로 인해 예상치 못한 결과가 발생하는 에러이다.
- 주로 0.1 + 0.2 != 0.3과 같은 비교에서 문제가 발생한다.
🔽 예시
System.out.println(0.1 + 0.2); // 출력: 0.30000000000000004
🔽 해결 방법
- 부동소수점 대신 정수 또는 소수점 고정 방식을 사용한다.
- Java의 BigDecimal 클래스를 활용한다.
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b)); // 출력: 0.3
✅ 메모리 누수 (Memory Leak)
🔽 특징
- 사용한 메모리를 해제하지 않아 메모리 사용량이 계속 증가하는 문제이다.
- 주로 C, C++ 같은 언어에서 발생하며, Java, Python과 같은 언어에서도 객체 참조 관리 실패로 발생할 수 있다.
🔽 예시
char* str = (char*)malloc(10 * sizeof(char));
// free(str); 누락으로 메모리 누수 발생
🔽 해결 방법
- 메모리 할당 후 반드시 해제한다.
- 스마트 포인터(C++의 경우)나 Garbage Collector가 올바르게 작동하는지 확인한다.
✅ 스택 오버플로우 (Stack Overflow)
🔽 특징
- 무한 재귀 호출이나 함수 호출 스택이 너무 커지는 경우 발생한다.
🔽 예시
public int infiniteRecursion() {
return infiniteRecursion();
}
public static void main(String[] args) {
new Main().infiniteRecursion(); // 스택 오버플로우 발생
}
🔽 해결 방법
- 재귀 대신 반복문을 사용한다.
- 재귀 깊이를 제한하거나 최적화된 알고리즘을 사용한다.
✅ 정수 오버플로우 (Integer Overflow)
🔽 특징
- 정수 값이 자료형의 최대/최소 범위를 초과할 때 발생한다.
- 주로 C, C++과 같은 언어에서 나타난다.
🔽 예시
int number = Integer.MAX_VALUE;
number += 1; // Overflow 발생
System.out.println(number); // 출력: -2147483648
🔽 해결 방법
- 연산 전 자료형 범위를 확인한다.
- 언어별로 제공되는 큰 자료형(long, BigInteger)을 사용한다.
✅ 네트워크 에러 (Network Error)
🔽 특징
- 서버와 클라이언트 간 네트워크 연결 실패 또는 지연으로 인해 발생한다.
- 주로 HTTP Timeout, DNS 실패, API 응답 실패와 같은 문제가 포함된다.
🔽 예시
URL url = new URL("https://soeun2537.tistory.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(1000); // Timeout 설정
connection.connect(); // 연결 실패 시 IOException 발생
🔽 해결 방법
- 재시도 로직을 구현한다.
- 네트워크 상태를 사전에 확인하고, 연결 타임아웃을 설정한다.
✅ 권한 에러 (Permission Error)
🔽 특징
- 파일 및 디렉토리 접근 권한 부족으로 발생한다.
- 주로 읽기/쓰기 권한이 없는 파일에 접근하거나, 관리자 권한이 필요한 작업에서 발생한다.
🔽 예시
File file = new File("/resource/secure_file.txt");
file.createNewFile(); // IOException: 권한 거부
🔽 해결 방법
- 파일 또는 디렉토리 권한을 확인한다.
- 필요한 경우 관리자 권한으로 실행하거나 권한 설정을 변경한다.
✅ 데드락 (Deadlock)
🔽 특징
- 두 개 이상의 프로세스가 서로 자원을 점유한 채 대기 상태에 빠져 진행할 수 없는 상황이다.
- 주로 멀티스레드 프로그래밍에서 발생한다.
🔽 예시
class Resource {
synchronized void methodA(Resource r) {
r.methodB(this);
}
synchronized void methodB(Resource r) {}
}
Resource r1 = new Resource();
Resource r2 = new Resource();
new Thread(() -> r1.methodA(r2)).start();
new Thread(() -> r2.methodA(r1)).start(); // 데드락 발생
🔽 해결 방법
- 자원 점유 순서를 일관되게 설정한다.
- 타임아웃을 설정하여 대기 시간을 제한한다.
✅ 데이터 경합 (Race Condition)
🔽 특징
- 두 개 이상의 스레드가 동일한 데이터를 동시에 읽거나 쓰려할 때 발생한다.
- 예상치 못한 값이 저장되거나, 데이터가 손실될 수 있다.
🔽 예시
class Counter {
private int count = 0;
public void increment() {
count++;
}
public int getCount() {
return count;
}
}
Counter counter = new Counter();
Thread t1 = new Thread(counter::increment);
Thread t2 = new Thread(counter::increment);
t1.start();
t2.start(); // 데이터 경합으로 값 손실 발생 가능
🔽 해결 방법
- 동기화 메커니즘(synchronized, Lock)을 사용하여 자원 접근을 제어한다.
✅ IO 에러 (Input/Output Error)
🔽 특징
- 파일이나 데이터 스트림을 읽거나 쓸 때 발생한다.
- 디스크 공간 부족, 파일 경로 오류 등이 포함된다.
🔽 예시
Files.readAllBytes(Path.of("nonexistent_file.txt")); // NoSuchFileException 발생
🔽 해결 방법
- 파일 경로와 디스크 상태를 점검한다.
- IO 작업 시 예외 처리를 추가한다.
✅ 데이터베이스 에러 (Database Error)
🔽 특징
- 데이터베이스 연결 실패, 쿼리 구문 오류, 트랜잭션 충돌 등 다양한 문제로 발생한다.
🔽 예시
SELECT * FORM users; -- 구문 에러
🔽 해결 방법
- 데이터베이스 쿼리 구문을 확인한다.
- 커넥션 풀을 사용하여 연결 관리 문제를 완화한다.