회사 레거시 코드 분석중
어떤 코드는 참조형 객체를 null로 초기화했고
어떤 코드는 참조형 객체를 new() 로 생성했다.
비슷한 로직인데 왜 이렇게 다르게 로직을 짰을까
예전에 고객이 프로젝트가 자꾸 죽는다고 컴플레인이 들어왔다.
원인을 찾아보니 힙메모리를 3기가로 설정해서
조금만 메모리를 사용해도 풀 gc 가 계속 돌아서 죽어버렸다.
아무튼 위의 얘기를 한 이유는
new() 키워드로 객체 생성 : 안정성
List<String> columnList = new ArrayList<>();
안정성: null 체크 없이 리스트의 메서드를 호출할 수 있으므로, NullPointerException 이 나지 않는다.
그라고 변수를 선언할 때 바로 리스트를 생성하기 때문에 별도의 초기화 과정 없이 변수를 바로 사용할 수 있다.
단점
불필요한 객체 생성:
리스트가 실제로 사용되지 않는 경우에도 객체가 생성되기 때문에 메모리 낭비로 이어질 수 있다.
가비지 컬렉션이 이를 잘 처리하긴 하지만
관리가 되지 않을 경우 힙메모리가 가득 차버리면 풀 gc 가 계속해서 일어나 프로그램이 죽을 수도 있다.
null 로 초기화하기 : 명백한 초기 상태
List<String> columnList = null;
명확한 초기 상태:
null로 초기화하면 해당 변수가 아직 초기화되지 않았음을 명확하게 알 수 있다.
변수가 나중에 특정 조건에 따라 초기화되는 경우에 유용할 수 있다.
하지만 이 로직은 NullPointerException 을 조심해야 되는데
변수를 사용하기 전에 반드시 초기화하지 않았다면 NullPointerException이 발생할 수 있다.
그래서 변수 사용 전 항상 null 체크를 해야 한다.
+ 특정 조건에 따라 초기화되는 경우
리소스절약과 성능 최적화를 위해
코드의 실행 흐름에서 특정 조건이 만족될 때 그 변수를 초기화하는 것을 의미한다.
List<String> ColumnList = null;
for (String table : filteredQueryTList) {
if ("oracle".equals(databaseName)) {
if (vo.getSynonymTable() != null && !vo.getSynonymTable().equals("")) {
// 특정 조건이 만족될 때만 초기화
ColumnList.add(table);
}
}
}
ColumnList가 초기화되었다면 사용되고, 그렇지 않다면 사용되지 않을 것이다.
리소스 절약
불필요한 객체 생성을 피하여 메모리 사용을 줄일 수 있다.
성능 최적화
객체 생성 비용이 높은 경우, 필요할 때만 객체를 생성함으로써 성능을 최적화해야 한다.
모두가 다 좋은 환경에서 프로젝트를 돌리면 좋겠지만 대부분은 그렇지 않다.
이러한 관점에서 레거시 코드를 분석하는건 굉장히 좋은 자세라고 생각한다.
'컴퓨터 > Java' 카테고리의 다른 글
[JVM] JVM 의 메모리구조, 메모리 영역 별 저장되는 데이터 (0) | 2024.12.23 |
---|---|
[JVM] JVM 동작 과정 - | 클래스로더, 실행엔진, 가비지 컬렉션 (0) | 2024.12.19 |
[Java] JavaSE, JDK, JRE 의미, JDK 의 주요 디렉토리 및 exe 정리 (1) | 2024.05.03 |
[Java] List<Map<String, Object>> 을 List<Map<String, String>> 으로 형변환하기 (0) | 2023.02.27 |
[Java 공부] 프로그래밍 언어와 Java 의 특징 (2) | 2022.04.03 |
댓글