자바 코드를 작성할 때 주의해야 할 점
자바는 유연한 언어지만, 제대로 사용하지 않으면 성능이 저하되거나, 메모리가 누수, 보안 취약 등 다양한 문제가 발생할 수 있습니다.
그렇기 때문에 안정적이고 효율적인 자바 코드를 작성하기 위해 다음과 같은 주의할 점들을 고려해야 합니다.
1. 예외 처리
자바에서는 예외처리가 필수입니다.
try-catch 블록을 사용해서 예외 상황에 적절하게 대응해야 하며,
예외를 무시하거나 로그만 남기고 끝내면 예상치 못한 프로그램 종료나 데이터 손실이 발생할 수 있습니다.
- 적절한 예외 처리 : 모든 예외를 포괄하는 catch 블록 사용은 지양해야 합니다. 구체적인 예외 상황별로 catch 블록을 나눠서 상황에 맞게 대응을 해야 합니다.
- 예외 전파 : throws 키워드를 사용해서 예외를 상위 메서드로 전파할 수 있습니다. 그러나 너무 많은 예외를 상위로 전파하면 예외 처리가 어렵고 복잡해질 수 있으니 적절하게 사용해야 합니다.
try {
// 위험한 코드 실행
} catch (IOException e) {
// 구체적인 예외 처리
} catch (Excetpion e) {
// 일반적인 예외 처리
}
2. 메모리 누수
자바는 가비지 컬렉션을 통해 메모리를 자동으로 관리하지만, 객체 참조를 잘못 관리하면 메모리 누수가 발생할 수 있습니다.
특히, 긴 생명주기를 가진 객체가 불필요하게 참조를 유지하면 문제가 됩니다.
=> 자바 8 이후로, 스트림 API, Optional 등의 특성들로 인해 코드에서 명시적으로 객체를 null로 설정하는 경우가 줄어들었습니다.
- 명시적 null 처리 : 사용이 끝난 객체 참조를 null로 초기화하거나, 컬렉션에서 객체를 제거해서 참조를 끊어줍니다.
- 리소스 해제 : 파일, 네트워크 소켓, 데이터베이스 연결 등 외부 리소스를 사용하는 경우 반드시 try-with-resources 구문이나 finally 블록에서 리소스를 닫아야 합니다.
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
// 파일 읽기
} catch (IOException e) {
e.printStackTrace();
} // try-with-resources가 끝나면 자동으로 리소스가 해제됨
3. 스레드 관리
자바는 멀티스레드 프로그래밍을 지원하지만,
스레드 동기화를 제대로 하지 않으면 Race Condition(경합 조건), Deadlock(데드락) 등의 문제가 발생할 수 있습니다.
- 동기화 : 공유 자원을 사용하는 경우 synchronized 키워드를 사용해서 스레드 안전성을 확보합니다.
- 적절한 스레드 풀 사용 : 스레드를 직접 생성하기보다는 ExecutorService와 같은 스레드 풀을 사용해서 스레드 생성을 관리하는 것이 성능 향상과 리소스 관리에 좋습니다.
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.submit(() -> {
// 스레드 작업
});
executor.shutdown();
4. 보안 취약점
자바 코드에서도 다양한 보안 취약점이 발생할 수 있습니다.
특히, 외부 입력을 신뢰하지 않고 그대로 사용하는 것은 SQL Injection, XSS 등 다양한 보안 문제를 일으킬 수 있습니다.
이러한 취약점으로부터 안전한 코드를 작성하기 위해서는 입력 값을 검증하고, 적절한 보안 정책을 적용해야 합니다.
- 입력 검증 : 모든 외부 입력을 반드시 검증해야 합니다. 숫자형 입력, 이메일 형식 검증 등 기본적인 입력 체크는 필수입니다.
String requertInput = request.getParameter("input");
if (isValid(requertInput)) {
// 검증된 입력 사용
} else {
// 입력 거부
}
5. 성능 문제
자바는 C나 C++과 같은 네이티브 언어에 비해 성능이 떨어질 수 있습니다.
특히, 성능에 민감한 부분에서는 최적화를 통해 성능 문제를 해결해야 합니다.
- 자료구조 사용 : 적절한 자료구조를 선택해서, 불필요한 객체 생성을 줄여야 합니다.
- 스트림 API 최적화 : 자바 8 이상의 스트림 API를 사용할 때, 병렬 스트림을 적절히 활용해서 성능을 개선할 수 있습니다.
List<String> list = Arrays.asList("a", "b", "c");
list.stream()
.parallel()
.forEach(System.out::println); // 병렬 처리
이러한 주의할 점들을 잘 지켜야, 안정적이고 안전한 자바 코드를 작성할 수 있습니다.
'☕️Java[자바] > 입문[이론 및 문법]' 카테고리의 다른 글
[Java] 자바 조건문(If문, Switch문) 가이드 (0) | 2024.05.19 |
---|---|
[Java] 자바 연산자 Operator 가이드 정리 (0) | 2024.05.13 |
[Java] 자바 변수 기본 가이드 라인 (0) | 2024.04.05 |
[Java] 자바 코드에서 주의할 점(2) (0) | 2023.03.28 |
[Java] 프로그래밍 언어 자바란 무엇인가? What is Java? (0) | 2023.03.27 |